--- name: "frontend-fsd-architect" description: "Feature-Sliced Design architecture specialist" --- # Frontend FSD Architect Skill ## Overview **Frontend FSD Architect**는 Feature-Sliced Design(FSD) v2.1 표준을 기반으로 중대규모 프론트엔드 프로젝트의 아키텍처를 자동 생성, 마이그레이션, 검증하는 전문 Skill입니다. 대규모 프론트엔드 개발에서 가장 큰 문제인 **"코드를 어디에 둘지 모호함"**, **"의존성 혼란"**, **"팀 협업 충돌"**을 FSD의 7계층 구조와 엄격한 의존성 규칙으로 해결합니다. ### 핵심 특징 - ✅ **FSD v2.1 완전 준수**: Processes 폐지, Pages First 적용 - ✅ **4대 프레임워크 지원**: React, Vue, Angular, Svelte - ✅ **자동 린터 통합**: Steiger로 의존성 위반 실시간 검증 - ✅ **점진적 마이그레이션**: 기존 프로젝트 5단계 전환 가이드 - ✅ **한국 환경 최적화**: KRW 포맷, 휴대폰 번호 등 ### 성과 지표 - **개발 속도**: 구조 설계 시간 80% 단축 (8시간 → 1.5시간) - **유지보수성**: 코드 변경 영향 범위 70% 감소 - **팀 협업**: Git 충돌 60% 감소 (기능별 격리) - **적용 규모**: 20k~100k+ LOC 프로젝트 최적 --- ## When to Use This Skill 다음 상황에서 이 Skill을 사용하세요: ### 신규 프로젝트 시작 - [ ] 중대규모 프로젝트 (20k+ LOC 예상) - [ ] 팀 규모 3명 이상 - [ ] 6개월 이상 장기 운영 - [ ] 복잡한 비즈니스 로직 존재 ### 기존 프로젝트 개선 - [ ] MVC/Classical 구조의 확장성 한계 - [ ] components/, services/ 폴더가 비대해짐 - [ ] 순환 의존성 문제 발생 - [ ] 팀원 간 코드 배치 의견 불일치 ### 아키텍처 표준화 - [ ] 여러 프로젝트 통일된 구조 필요 - [ ] 신규 개발자 온보딩 가이드 필요 - [ ] 코드 리뷰 기준 명확화 - [ ] 자동 검증 도구 도입 ### ⚠️ 사용하지 말아야 할 경우 - MVP/POC (1~3개월 빠른 출시) - 10k LOC 미만 소규모 - 1~2명 개발자 - 정적 콘텐츠 위주 (블로그/포트폴리오) --- ## Core Capabilities ### 1. **프로젝트 구조 자동 생성** 7계층 FSD 폴더 구조 + 보일러플레이트 코드 완전 자동화 **지원 구조**: ``` src/ ├── app/ # 애플리케이션 초기화 ├── pages/ # 페이지 단위 조합 ├── widgets/ # 독립 UI 블록 ├── features/ # 비즈니스 기능 ├── entities/ # 도메인 객체 └── shared/ # 공통 라이브러리 ``` **생성 항목**: - 폴더 구조 (7 layers × N slices) - Public API 파일 (index.ts) - 타입 정의 (types.ts) - 설정 파일 (config.ts) - README.md (각 레이어별) --- ### 2. **프레임워크별 보일러플레이트** React, Vue, Angular, Svelte 맞춤형 코드 템플릿 #### React 예시 ```typescript // features/auth/login/ui/LoginForm.tsx import { useState } from 'react'; import { useLoginMutation } from '../api/loginApi'; export const LoginForm = () => { const [login, { isLoading }] = useLoginMutation(); // ... 컴포넌트 로직 }; ``` #### Vue 예시 ```vue ``` --- ### 3. **Steiger 린터 자동 설정** 의존성 위반, 네이밍 불일치 등 10개 규칙 자동 검증 **설정 파일 생성**: ```typescript // steiger.config.ts import { defineConfig } from 'steiger'; import fsd from '@feature-sliced/steiger-plugin'; export default defineConfig([ ...fsd.configs.recommended, { files: ['./src/shared/**'], rules: { 'fsd/no-public-api-sidestep': 'off' } } ]); ``` **검증 규칙**: 1. `fsd/forbidden-imports` - 상위 레이어 import 금지 2. `fsd/no-cross-slice-dependency` - 동일 레이어 간 의존성 금지 3. `fsd/no-public-api-sidestep` - Public API 우회 금지 4. `fsd/inconsistent-naming` - 네이밍 일관성 5. `fsd/excessive-slicing` - 과도한 분할 경고 --- ### 4. **점진적 마이그레이션 가이드** 기존 프로젝트를 5단계로 안전하게 전환 **Phase 1: Shared 레이어 정의 (1~2주)** ``` 기존: /components/Button.tsx, /utils/formatPrice.ts FSD: /shared/ui/Button, /shared/lib/formatters/formatPrice.ts ``` **Phase 2: Entities 레이어 정의 (2~3주)** ``` 기존: /models/User.ts, /services/userService.ts FSD: /entities/user/model/types.ts, /entities/user/api/userApi.ts ``` **Phase 3: Features 추출 (4~6주)** ``` 기존: HomePage.tsx (로그인+검색+장바구니 모두 포함) FSD: /features/auth/login, /features/product/search, /features/cart/add ``` **Phase 4: Pages/Widgets 재구성 (2~3주)** ``` 페이지를 조합 레이어로 재구성 ``` **Phase 5: Steiger 적용 + 규칙 강화 (1~2주)** ``` CI/CD 통합, 의존성 위반 수정 ``` --- ### 5. **도메인 특화 커스터마이징** 산업별(금융/의료/이커머스) 특수 요구사항 반영 **금융 도메인 예시**: ```typescript // entities/account/model/types.ts export interface BankAccount { accountNumber: string; // 계좌번호 (암호화) balance: number; // 잔액 (KRW) currency: 'KRW' | 'USD'; // 통화 regulatoryCompliance: { // 규제 준수 kycVerified: boolean; amlCheckDate: Date; }; } // shared/lib/validators/validateAccount.ts export const validateKoreanAccount = (account: string): boolean => { // 한국 계좌번호 형식 검증: XXX-XXXX-XXXXX return /^\d{3}-\d{4}-\d{5}$/.test(account); }; ``` --- ## Installation ### Prerequisites - Node.js 18+ - TypeScript 4.5+ - 프레임워크: React 18+ / Vue 3+ / Angular 15+ / Svelte 4+ - 패키지 매니저: npm / yarn / pnpm ### For Claude.ai (Web/Desktop) **Step 1: 파일 다운로드** ``` 이 SKILL.md 파일을 로컬에 저장 ``` **Step 2: 프로젝트 설정** ``` 1. https://claude.ai 접속 2. Projects → "+ New Project" 클릭 3. 프로젝트 이름: "[Your Project Name]" 4. Settings (⚙️) 아이콘 클릭 ``` **Step 3: Skill 업로드** ``` 1. Project Knowledge 섹션 이동 2. "Add Content" 클릭 3. 파일 업로드: frontend-fsd-architect-skill.md 4. Save 버튼 클릭 ``` **Step 4: 검증** ``` 채팅창에서 테스트: "이커머스 프로젝트의 FSD 구조를 생성해줘. React + TypeScript, 팀 5명, features: 로그인, 장바구니, 결제, 관리자" 예상 결과: 완전한 폴더 구조 + 보일러플레이트 코드 생성 ``` --- ### For Claude Code (CLI) **Step 1: 전역 설치 (모든 프로젝트)** ```bash # Skill 폴더 생성 mkdir -p ~/.claude/skills # Skill 파일 복사 cp frontend-fsd-architect-skill.md ~/.claude/skills/ # 권한 설정 chmod 644 ~/.claude/skills/frontend-fsd-architect-skill.md # 확인 claude skills list # 출력: frontend-fsd-architect-skill (enabled) ``` **Step 2: 프로젝트별 설치 (선택)** ```bash # 프로젝트 루트로 이동 cd /path/to/your-project # 프로젝트 Skill 폴더 생성 mkdir -p .claude/skills # Skill 파일 복사 cp ~/Downloads/frontend-fsd-architect-skill.md .claude/skills/ # 확인 claude skills list --local ``` **Step 3: 사용 예시** ```bash # CLI에서 직접 사용 claude "내 프로젝트를 FSD 구조로 변환해줘. 기존 구조: MVC (components/, services/), 프레임워크: Vue 3 + Pinia" # 또는 채팅 모드 claude chat > FSD 구조로 프로젝트 생성해줘 ``` --- ## Usage Guide ### Basic Usage: 신규 프로젝트 생성 **시나리오**: React + TypeScript 이커머스 프로젝트 시작 **입력 (Claude에게 요청)**: ``` FSD 구조로 이커머스 프로젝트를 생성해줘. 요구사항: - 프레임워크: React 18 + TypeScript - 상태관리: Redux Toolkit - 팀 규모: 5명 - 주요 기능: 1. 사용자 인증 (로그인, 회원가입, 로그아웃) 2. 상품 관리 (목록, 상세, 검색, 필터) 3. 장바구니 (추가, 수정, 삭제) 4. 결제 (주문서, 결제, 완료) 5. 관리자 (상품 등록, 주문 관리) ``` **출력 (자동 생성)**: ``` src/ ├── app/ │ ├── providers/ │ │ ├── router.tsx # React Router 설정 │ │ ├── store.ts # Redux Store 설정 │ │ └── theme.tsx # Styled-components Theme │ ├── styles/ │ │ └── global.css │ └── index.tsx │ ├── pages/ │ ├── home/ │ │ ├── ui/HomePage.tsx │ │ └── index.ts │ ├── product-detail/ │ │ ├── ui/ProductDetailPage.tsx │ │ ├── model/useProductLoader.ts │ │ └── index.ts │ ├── cart/ │ ├── checkout/ │ └── admin-dashboard/ │ ├── widgets/ │ ├── header/ │ │ ├── ui/Header.tsx │ │ ├── model/useAuthStatus.ts │ │ └── index.ts │ ├── product-grid/ │ └── shopping-cart-preview/ │ ├── features/ │ ├── auth/ │ │ ├── login/ │ │ │ ├── ui/LoginForm.tsx │ │ │ ├── model/loginSlice.ts │ │ │ ├── api/loginApi.ts │ │ │ └── index.ts │ │ ├── signup/ │ │ └── logout/ │ ├── product/ │ │ ├── search/ │ │ ├── filter/ │ │ └── add-to-cart/ │ ├── cart/ │ │ ├── update-quantity/ │ │ └── remove-item/ │ └── payment/ │ ├── create-order/ │ └── process-payment/ │ ├── entities/ │ ├── user/ │ │ ├── model/types.ts │ │ ├── api/userApi.ts │ │ ├── ui/UserCard.tsx │ │ └── index.ts │ ├── product/ │ ├── order/ │ └── cart/ │ └── shared/ ├── ui/ │ ├── Button/ │ ├── Input/ │ └── Modal/ ├── lib/ │ ├── formatters/formatPrice.ts │ ├── validators/validateEmail.ts │ └── utils/debounce.ts ├── api/ │ ├── client.ts │ └── types.ts └── config/ └── constants.ts + package.json (스크립트 추가) + steiger.config.ts (린터 설정) + .eslintrc.js (ESLint 통합) + tsconfig.json (Path alias 설정) + README.md (프로젝트 구조 설명) ``` **추가 생성 파일**: ```typescript // features/auth/login/ui/LoginForm.tsx (보일러플레이트) import { useState } from 'react'; import { useAppDispatch } from '@/app/providers/store'; import { loginAsync } from '../model/loginSlice'; import { Button, Input } from '@/shared/ui'; export const LoginForm = () => { const dispatch = useAppDispatch(); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); await dispatch(loginAsync({ email, password })); }; return (
setEmail(e.target.value)} placeholder="이메일" /> setPassword(e.target.value)} placeholder="비밀번호" />
); }; ``` --- ### Advanced Usage: 기존 프로젝트 마이그레이션 **시나리오**: MVC 구조의 Vue 프로젝트를 FSD로 전환 **입력**: ``` 기존 Vue 프로젝트를 FSD 구조로 마이그레이션해줘. 현재 구조: src/ ├── components/ │ ├── Header.vue │ ├── ProductList.vue │ └── LoginForm.vue ├── views/ │ ├── HomePage.vue │ └── ProductDetailPage.vue ├── services/ │ ├── authService.ts │ └── productService.ts ├── store/ │ └── index.ts └── utils/ └── formatters.ts 프로젝트 정보: - 코드 규모: 약 35,000 LOC - 팀: 4명 - 주요 문제: components/ 폴더 200개 파일, 의존성 혼란 ``` **출력**: 5단계 마이그레이션 계획 + 각 단계별 상세 가이드 ```markdown # Vue 프로젝트 FSD 마이그레이션 계획 ## Phase 1: Shared 레이어 정의 (1주) ### 작업 내용 1. 공통 컴포넌트 이동 - components/Button.vue → shared/ui/Button/Button.vue - components/Input.vue → shared/ui/Input/Input.vue 2. 유틸리티 함수 재구성 - utils/formatters.ts → shared/lib/formatters/ - utils/validators.ts → shared/lib/validators/ ### 마이그레이션 스크립트 ```bash # 자동 이동 스크립트 (dry-run) node scripts/migrate-to-shared.js --dry-run # 실제 실행 node scripts/migrate-to-shared.js ``` ## Phase 2: Entities 레이어 정의 (2주) [상세 가이드...] ## Phase 3~5: [계속...] ``` --- ### Parameters Reference 이 Skill은 자연어 대화로 작동하므로 명령어 매개변수는 없지만, 요청 시 포함하면 좋은 정보: | 정보 | 설명 | 예시 | 필수 여부 | |------|------|------|----------| | **프레임워크** | 사용 중인 프론트엔드 프레임워크 | React, Vue, Angular, Svelte | ✅ 필수 | | **상태관리** | 상태관리 라이브러리 | Redux, Zustand, Pinia, NgRx | ⚠️ 권장 | | **팀 규모** | 개발자 수 | 3명, 5명, 10명+ | ⚠️ 권장 | | **프로젝트 규모** | 예상 코드 라인 수 | 20k LOC, 50k LOC, 100k+ LOC | ⚠️ 권장 | | **주요 기능** | 비즈니스 기능 목록 | 로그인, 결제, 대시보드... | ✅ 필수 | | **도메인** | 산업 분야 | 이커머스, 금융, 의료, B2B... | ❌ 선택 | | **특수 요구사항** | 규제, 보안 등 | HIPAA, PCI-DSS, GDPR... | ❌ 선택 | | **기존 구조** | 현재 폴더 구조 (마이그레이션 시) | MVC, Atomic Design... | ⚠️ 권장 | --- ## Examples ### Example 1: 소규모 SaaS 대시보드 (React) **난이도**: ⭐ 기본 **시나리오**: 스타트업의 관리자 대시보드 **요청**: ``` FSD 구조로 관리자 대시보드를 만들어줘. - 프레임워크: React + TypeScript - 상태관리: Zustand - 기능: 1. 대시보드 (통계 위젯 3개) 2. 사용자 목록 3. 설정 - 팀: 3명 ``` **생성 구조**: ``` src/ ├── app/ ├── pages/ │ ├── dashboard/ # 대시보드 메인 │ ├── users/ # 사용자 목록 │ └── settings/ # 설정 ├── widgets/ │ ├── stats-card/ # 통계 카드 │ ├── user-table/ # 사용자 테이블 │ └── settings-panel/ # 설정 패널 ├── features/ │ ├── user/ │ │ ├── filter/ # 사용자 필터링 │ │ └── export/ # 데이터 내보내기 │ └── settings/ │ └── update-profile/ ├── entities/ │ ├── user/ │ └── stat/ └── shared/ └── ui/ ├── Card/ └── Table/ 총 파일: ~25개 | 예상 크기: ~8KB ``` --- ### Example 2: 중규모 이커머스 (Vue) **난이도**: ⭐⭐ 중급 **시나리오**: 온라인 쇼핑몰 **요청**: ``` Vue 3 이커머스 프로젝트를 FSD로 구성해줘. - 프레임워크: Vue 3 + TypeScript - 상태관리: Pinia - 기능: 1. 상품 목록/상세/검색 2. 장바구니 3. 결제 (카드/계좌이체) 4. 마이페이지 (주문내역, 위시리스트) 5. 관리자 (상품/주문 관리) - 팀: 5명 - 특수 요구: 한국 결제 시스템 (PG사 연동) ``` **생성 구조**: ``` src/ ├── app/ ├── pages/ # 10개 페이지 ├── widgets/ # 15개 위젯 ├── features/ # 20개 features │ ├── product/ │ │ ├── search/ │ │ ├── filter/ │ │ └── add-to-wishlist/ │ ├── cart/ │ │ ├── add-item/ │ │ ├── update-quantity/ │ │ └── apply-coupon/ │ ├── payment/ │ │ ├── select-method/ # 결제 수단 선택 │ │ ├── process-card/ # 카드 결제 │ │ └── process-bank/ # 계좌이체 │ └── admin/ │ ├── manage-product/ │ └── manage-order/ ├── entities/ # 8개 entities └── shared/ ├── lib/ │ ├── formatters/ │ │ └── formatKRW.ts # ₩1,000,000 │ └── validators/ │ └── validatePhone.ts # 010-1234-5678 총 파일: ~120개 | 예상 크기: ~30KB ``` **추가 생성: 한국형 유틸리티** ```typescript // shared/lib/formatters/formatKRW.ts export const formatKRW = (amount: number): string => { return `₩${amount.toLocaleString('ko-KR')}`; }; // formatKRW(15000) → "₩15,000" // shared/lib/validators/validatePhone.ts export const validateKoreanPhone = (phone: string): boolean => { return /^010-\d{4}-\d{4}$/.test(phone); }; ``` --- ### Example 3: 대규모 핀테크 (Angular) **난이도**: ⭐⭐⭐ 고급 **시나리오**: 은행 인터넷뱅킹 시스템 **요청**: ``` Angular 기반 핀테크 플랫폼을 FSD로 구축해줘. - 프레임워크: Angular 17 + RxJS - 상태관리: NgRx - 기능: 1. 계좌 조회/이체 2. 카드 관리 3. 대출 신청 4. 투자 상품 5. 보안 (OTP, 생체인증) 6. 관리자 (거래 모니터링, 리스크 관리) - 팀: 12명 - 특수 요구: - 금융 규제 준수 (전자금융거래법) - 높은 보안 수준 (암호화, 감사 로그) - 접근성 (WCAG 2.1 AA) ``` **생성 구조**: ``` src/ ├── app/ │ ├── core/ │ │ ├── auth/ # 인증/인가 │ │ ├── security/ # 암호화, 보안 │ │ └── audit/ # 감사 로그 │ └── providers/ ├── pages/ # 25개 페이지 ├── widgets/ # 30개 위젯 ├── features/ # 40개 features │ ├── account/ │ │ ├── view-balance/ │ │ ├── transfer/ │ │ │ ├── ui/ │ │ │ ├── model/ │ │ │ │ └── transferValidation.ts # 이체 한도, 수수료 검증 │ │ │ ├── api/ │ │ │ │ └── encryptedTransferApi.ts # 암호화 통신 │ │ │ └── index.ts │ │ └── transaction-history/ │ ├── card/ │ ├── loan/ │ ├── investment/ │ └── security/ │ ├── otp/ │ └── biometric/ ├── entities/ # 15개 entities │ ├── account/ │ │ └── model/ │ │ └── types.ts │ │ # interface BankAccount { ... regulatoryCompliance } │ ├── transaction/ │ └── user/ └── shared/ ├── lib/ │ ├── crypto/ # 암호화 유틸 │ ├── validators/ │ │ ├── validateAccountNumber.ts │ │ ├── validateTransferLimit.ts │ │ └── validateSecurityLevel.ts │ └── compliance/ # 규제 준수 헬퍼 └── ui/ └── SecureInput/ # 보안 입력 컴포넌트 총 파일: ~350개 | 예상 크기: ~100KB ``` **추가 생성: 금융 규제 준수** ```typescript // entities/account/model/types.ts export interface BankAccount { accountNumber: string; // 계좌번호 (암호화 저장) balance: number; // 잔액 (KRW) currency: 'KRW'; accountType: 'CHECKING' | 'SAVINGS' | 'INVESTMENT'; // 전자금융거래법 준수 regulatoryCompliance: { kycVerified: boolean; // 본인인증 완료 amlCheckDate: Date; // 자금세탁방지 검사일 dailyTransferLimit: number; // 1일 이체 한도 securityLevel: 1 | 2 | 3; // 보안 등급 }; // 감사 로그 auditLog: { createdAt: Date; createdBy: string; lastModifiedAt: Date; lastAccessedAt: Date; }; } // shared/lib/validators/validateTransferLimit.ts export const validateTransferLimit = ( account: BankAccount, amount: number ): ValidationResult => { const { dailyTransferLimit } = account.regulatoryCompliance; if (amount > dailyTransferLimit) { return { isValid: false, error: `1일 이체 한도(${formatKRW(dailyTransferLimit)})를 초과했습니다.` }; } return { isValid: true }; }; ``` --- ### Example 4: 레거시 마이그레이션 (React) **난이도**: ⭐⭐⭐ 고급 **시나리오**: 5년 된 MVC 프로젝트 점진적 전환 **요청**: ``` 기존 React 프로젝트를 FSD로 마이그레이션하는 계획을 세워줘. 현재 상황: - 코드 규모: 약 80,000 LOC - 구조: MVC (components/, services/, utils/) - 문제점: - components/ 폴더에 300개 파일 - 순환 의존성 20개 이상 - 팀원 간 코드 배치 의견 불일치 - 팀: 8명 (시니어 2, 중급 4, 주니어 2) - 제약: 서비스 중단 불가, 기능 동결 없음 목표: - 12주 내 완료 - 기존 기능 100% 유지 - 점진적 전환 (매주 배포) ``` **출력**: 12주 상세 마이그레이션 로드맵 ```markdown # 80k LOC React 프로젝트 FSD 마이그레이션 로드맵 (12주) ## 준비 단계 (Week 0) ### 팀 교육 - [ ] FSD 개념 세미나 (2시간) - [ ] 실습 워크샵 (4시간) - [ ] 가이드라인 문서 공유 ### 도구 설정 - [ ] Steiger 린터 설치 (경고 모드) - [ ] 의존성 분석 도구 실행 - [ ] 마이그레이션 스크립트 준비 ## Phase 1: Shared 레이어 (Week 1-2) ### Week 1: 분석 및 계획 **작업**: 1. 공통 컴포넌트 분류 (Button, Input, Modal 등 50개) 2. 유틸리티 함수 정리 (formatters, validators 등 30개) 3. 이동 순서 결정 (의존성 낮은 것부터) **담당**: 시니어 2명 ### Week 2: 실행 **작업**: ```bash # 자동 이동 스크립트 실행 node scripts/migrate-shared.js # 생성 구조 src/ └── shared/ ├── ui/ # 50개 컴포넌트 ├── lib/ # 30개 유틸리티 └── api/ # API 클라이언트 ``` **검증**: - [ ] 기존 import 경로 자동 수정 - [ ] 테스트 전체 통과 - [ ] 배포 및 모니터링 **담당**: 전체 팀 ## Phase 2: Entities 레이어 (Week 3-5) ### Week 3-4: User, Product Entities **작업**: ```typescript // 기존: models/User.ts, services/userService.ts (분산) // 신규: entities/user/ (통합) entities/user/ ├── model/ │ └── types.ts # User 타입 정의 ├── api/ │ └── userApi.ts # API 호출 ├── ui/ │ ├── UserCard.tsx # 사용자 카드 컴포넌트 │ └── UserAvatar.tsx ├── lib/ │ └── getUserFullName.ts └── index.ts # Public API ``` **마이그레이션 대상**: User, Product (핵심 도메인) **담당**: 시니어 1 + 중급 2 ### Week 5: 나머지 Entities **대상**: Order, Cart, Payment, Category (5개) **담당**: 중급 2 + 주니어 2 ## Phase 3: Features 추출 (Week 6-9) ### Week 6-7: 인증 Features **작업**: ``` 기존: pages/LoginPage.tsx (로그인 폼 + API + 상태 모두 포함) 신규: features/auth/ ├── login/ │ ├── ui/LoginForm.tsx │ ├── model/loginSlice.ts │ ├── api/loginApi.ts │ └── index.ts ├── signup/ └── logout/ ``` **담당**: 중급 2명 ### Week 8-9: 상품/장바구니/결제 Features **대상**: 15개 주요 Features **담당**: 전체 팀 (페어 프로그래밍) ## Phase 4: Pages/Widgets 재구성 (Week 10-11) ### Week 10: Pages 레이어 **작업**: 기존 pages/를 조합 레이어로 단순화 ```typescript // 기존: HomePage.tsx (600줄 - 로직 포함) // 신규: pages/home/ui/HomePage.tsx (150줄 - 조합만) const HomePage = () => { return ( <>