2025-08-30 13:02
Tags: 리액트 넥스트
FSD (Featur-Sliced-Design)
1. 레이어
app → pages → widgets → features → entities → shared
-
상위 레이어는 하위 레이어만 import 가능
-
하위 레이어는 상위 레이어를 알 수 없음
-
app: 애플리케이션 초기화 및 전역 설정
- Provider, Router, 전역 스타일, 전역 타입 선언
- 애플리케이션 전반적으로 적용되는 기능들
-
pages: 라우팅 가능한 화면 정의
- 애플리케이션의 각 페이지
- URL과 매핑되는 최상위 컴포넌트들
-
widgets: 독립적인 UI 블록
- 여러 feature를 조합한 의미 있는 블록
- Header, Footer, Sidebar 등
-
features: 사용자 시나리오와 비즈니스 로직
- 동사적 의미의 비즈니스 기능
- 사용자에게 비즈니스 가치를 전달하는 행위
-
entities: 비즈니스 엔터티
- User, Product, Order 등 핵심 비즈니스 객체
- 데이터 모델과 관련 로직
-
shared: 재사용 가능한 공통 요소
- UI 키트, 유틸리티 함수, API 클라이언트
- 프로젝트 특정 로직에 종속되지 않는 기능들
2. 슬라이스
- 비즈니스 중심 명명:
user,post,comment,auth등 - 독립성 보장: 같은 레이어 내 슬라이스 간 import 금지
- 높은 응집도: 관련 기능을 한곳에 모음
3. 세그먼트
- 기술적 목적에 따라 코드를 그룹화
- ui: UI 컴포넌트와 관련 요소들
- React 컴포넌트, 스타일, 데이터 포맷팅 함수
- model: 비즈니스 로직과 데이터 관리
- 상태 관리, 액션, 셀렉터, 비즈니스 규칙
- api: 외부 API와의 통신
- 백엔드 API 메서드, 요청 함수, 데이터 타입
- lib: 보조 및 인프라 코드
- 헬퍼 함수, 유틸리티, 인프라 로직
- config: 설정과 상수
- 환경 변수, 설정 파일, 상수 정의
src/
├── app/
│ ├── providers/ # React Query, Redux 등
│ ├── styles/ # 전역 스타일
│ └── types/ # 전역 타입 정의
├── pages/
│ ├── home/
│ │ ├── ui/
│ │ │ └── HomePage.tsx
│ │ └── index.ts
│ └── dashboard/
│ ├── ui/
│ │ └── DashboardPage.tsx
│ └── index.ts
├── widgets/
│ ├── header/
│ │ ├── ui/
│ │ │ └── Header.tsx
│ │ └── index.ts
│ └── sidebar/
│ ├── ui/
│ │ └── Sidebar.tsx
│ └── index.ts
├── features/
│ ├── auth/
│ │ ├── ui/
│ │ │ ├── LoginForm.tsx
│ │ │ └── LogoutButton.tsx
│ │ ├── model/
│ │ │ └── authSlice.ts
│ │ ├── api/
│ │ │ └── authApi.ts
│ │ └── index.ts
│ └── search/
│ ├── ui/
│ │ └── SearchBar.tsx
│ ├── model/
│ │ └── searchModel.ts
│ └── index.ts
├── entities/
│ ├── user/
│ │ ├── model/
│ │ │ └── types.ts
│ │ ├── api/
│ │ │ └── userApi.ts
│ │ └── index.ts
│ └── post/
│ ├── ui/
│ │ └── PostCard.tsx
│ ├── model/
│ │ └── types.ts
│ └── index.ts
└── shared/
├── ui/
│ ├── Button/
│ ├── Input/
│ └── Modal/
├── api/
│ └── client.ts
├── config/
│ └── constants.ts
└── lib/
└── utils.ts

Layer
Layer는 모든 FSD 프로젝트의 표준 최상위 폴더입니다.
- App* - Routing, Entrypoint, Global Styles, Provider 등 앱을 실행하는 모든 요소
- Processes(더 이상 사용되지 않음) - 페이지 간 복합 시나리오
- Pages - 전체 page 또는 중첩 Routing의 핵심 영역
- Widgets - 독립적으로 동작하는 대형 UI·기능 블록
- Features - 제품 전반에서 재사용되는 비즈니스 기능
- Entities - user, product 같은 핵심 도메인 Entity
- Shared* - 프로젝트 전반에서 재사용되는 일반 유틸리티 - App·Shared Layer는 Slice 없이 곧바로 Segment로 구성됩니다.
- 상위 Layer의 모듈은 자신보다 하위 Layer만 참조할 수 있습니다.
Slice
Slice는 Layer 내부를 비즈니스 도메인별로 나눕니다. 이름·개수에 제한이 없으며, 같은 Layer 내 다른 Slice를 참조할 수 없습니다. 이 규칙이 높은 응집도와 낮은 결합도를 보장합니다.
Segment
Slice와 App·Shared Layer는 Segment로 세분화되어, 기술적 목적에 따라 코드를 그룹화합니다. 일반적으로 다음과 같은 Segment를 사용합니다
ui- UI components, date formatter, styles 등 UI 표현과 직접 관련된 코드api- request functions, data types, mappers 등 백엔드 통신 및 데이터 로직model- schema, interfaces, store, business logic 등 애플리케이션 도메인 모델lib- 해당 Slice에서 여러 모듈이 함께 사용하는 공통 library codeconfig- configuration files, feature flags 등 환경·기능 설정
대부분의 Layer에서는 위 다섯 Segment로 충분합니다. 필요하다면 App 또는 Shared Layer에서만 추가 Segment를 정의하세요. (필수 규칙은 아닙니다.)