# 02. Architecture & FSD Rules ## 레이어 구조 ```text src/ app/ # 라우트 진입점, 조합 전용 widgets/ # 화면 섹션 단위 조합 features/ # 사용자 액션/유즈케이스 단위 entities/ # 도메인 타입/더미 데이터 shared/ # 공용 UI/유틸 ``` ## 핵심 규칙 1. `page.tsx`는 조합만 수행한다. 2. 비즈니스 로직은 `features` 또는 `entities`로 이동한다. 3. UI 상태(토글/선택)만 컴포넌트 내부에서 최소 허용한다. 4. 파일 길이 500줄 이상이면 즉시 분리한다. 5. 하위 레이어가 상위 레이어를 import하지 않는다. 6. 전역 상태가 필요하면 먼저 해당 도메인 slice의 `model/` 안에 둔다. ## Import 방향 규칙 - `app` -> `widgets`, `features`, `entities`, `shared` - `widgets` -> `features`, `entities`, `shared` - `features` -> `entities`, `shared` - `entities` -> `shared` - `shared` -> 외부 의존성 또는 `shared` 내부 금지: - `features` -> 다른 `features` 직접 참조 (강한 결합 유발) - `shared` -> `entities/features/widgets/app` 참조 - `page.tsx`에 도메인 로직/세부 UI 구현 누적 - 루트 전역 저장소를 관성적으로 추가하는 것 ## 구현 정책 (이 프로젝트 전용) - 실제 타이머/오디오/서버/DB 기능은 구현하지 않는다. - 기능 트리거는 토스트 또는 더미 상태 전환으로 표현한다. - 도메인 표시는 `entities` 데이터에서 읽고 뷰 하드코딩을 지양한다. - 인증/세션 같은 전역 상태도 가능하면 해당 도메인 `entities/*/model` 안에서 관리한다. ## 파일 분리 기준 - 조건: - 파일 500줄 이상 - 하나의 파일에 2개 이상의 독립 관심사가 혼재 - 분리 대상 예시: - UI 파트 -> `ui/*` - 상태/핸들러 -> `model/*` - 타입 -> `model/types.ts`