

목 차
1. 📌 FSD 아키텍쳐란?
2. 📌 레이어 (Layers)
3. 📌 슬라이스 (Slices)
4. 📌 세그먼트 (Segments)
5. 📌 엄격한 공개 API 정의 규칙
6. 📌 결론 및 정리.

Feature-Sliced Design(FSD) 은
대규모 프론트엔드 애플리케이션(특히 React 기반)의 구조를 "기능 단위로 구조화"하는 아키텍처 패턴.!
직역하면 "기능 분할 설계"입니다.
간단히 말하면, 코드를 조직적으로 구성하기 위한 규칙과 관계의 모음.
“기능(feature) 중심의 독립적이고 유지보수 가능한 구조를 만드는 것”
— FSD 공식 철학
기능 단위로 코드 분리 → 유지보수성과 재사용성 향상
UI와 비즈니스 로직의 결합도 최소화
확장 가능한 구조로 리팩토링 부담 최소화
| 구조 방식 | 예시 | 문제점 |
|---|---|---|
| 폴더 기반 구조 | components/, pages/, hooks/ | 코드가 점점 뒤섞이고 의존성 꼬임 |
| 도메인 기반 구조 | users/, products/ | 기능의 경계가 불명확 |
| ✅ FSD 구조 | features/, entities/, shared/ 등 계층적 구조 | 의존 방향과 공개 규칙이 명확 |

FSD의 계층 구조는 크게 {레이어,슬라이스,세그먼트}로 나뉘며,
이는 프로젝트의 폴더 구조 트리로 볼 수 있음.
폴더 구조의 최상위에는 '레이어(Layers)'가 위치하고,
레이어의 이름은 제한적이지만,

"레이어"는
프로젝트를 최상위부터 가장 기본적인 요소까지 단계적으로 나누어 구성한 폴더구조의 기본 계층.
src/
├── app/
├── processes/ <-- 현재는 사용되지 않는 레이어.
├── pages/
├── widgets/
├── features/
├── entities/
└── shared/

| 레이어 | 역할 | 예시 |
|---|---|---|
| shared | 공통 리소스 (유틸, UI 컴포넌트, 타입 등) | Button, apiClient, helpers |
| entities | 핵심 도메인 모델 | User, Product, Order |
| features | 특정 기능 단위 | auth/login, cart/add-item |
| widgets | UI 단위 조합 (기능+엔티티+뷰) | Header, Sidebar, ProfileWidget |
| pages | 라우트 단위의 화면 조합 | /login, /product/:id |
| processes | 전체 프로세스 관리(흐름 제어, 인증 흐름 등) | auth-process, checkout-process |
| app | 앱 초기화 (라우터, 스토어, 전역 설정) | App.tsx, providers/ |
⚙️ 의존성 방향 규칙:
shared → entities → features → widgets → pages → processes → app
(하위 레이어는 상위 레이어를 절대 import하지 않는다.)
말했다시피, 각 레이어는 고유한 목적을 가지고 있으며, 반드시 모든 레이어를 사용할 필요는 없음.
그러나, 사용시에는 일관된 구조와 명명 규칙을 지켜 프로젝트를 더 이해하기 쉽고
유지보수가 용이하게 해야 함.

프로젝트의 진입점이자, 가장 상위의 '전역 설정'을 포함하는 레이어.
- 주로 앱의 시작점이나, 주요 설정을 관리.
- '라우팅', '글로벌 스타일', '최상위 프로바이더' 등을 포함.
쉽게 말하자면, 'App' 레이어는 애플리케이션의 전반적인 구성을 관리하는 곳.
'App' 레이어는 "애플리케이션 전체의 전역 설정"만 담당하는 레이어이기에 슬라이스가 없고 세그먼트만 가짐.
세그먼트로 바로 모아두면 프로젝트 시작 시 설정해야 하는 모든 전역 설정들을 쉽게 찾아 수정 가능.
반면, 슬라이스는 기능별로 더 세분화해 나누는 구조라 App 레이어의 간단한 전역 설정에 사용될 필요가 없다.

Processes 레이어는 페이지 간의 복잡한 시나리오나 워크플로를 관리하기 위해 사용.
예를 들어, 사용자 가입이나 결제 처리처럼 여러 페이지에 걸쳐 진행되는 복잡한 절차를 포함했었음.
복잡성 증가와 다른 레이어와의 중복성 때문에 현재는 사용이 권장되지 않음.
대신!, 이와 같은 흐름은 Pages 또는 Widgets 레이어로 분산하여 관리 가능.

Pages 레이어는 앱 내 개별 페이지를 정의하는 레이어.
특정 URL에 매핑되는 전체 페이지를 구성.
주로 라우팅과 관련된 파일이나 페이지에 해당하는 최상위 컴포넌트를 포함.
Ex)
Pages 레이어는 사용자에게 바로 노출되는 UI 요소이므로 복잡한 비즈니스 로직보다는 사용자 인터페이스와 관련된 로직을 처리.
이 레이어는 사용자에게 보여지는 완전한 페이지를 구성.
UserPage와 같은 경우 사용자 관련 정보와 관련된 여러 widgets와 features가 함께 모여 하나의 페이지를 이룸.

Widgets 레이어는 페이지 내에서 독립적으로 작동하는 큰 기능 단위를 포함하는 레이어.
Widgets는 독립적으로 기능할 수 있으며 다양한 페이지에서 재사용 가능.

Features 레이어는 재사용 가능한 비즈니스 기능을 위한 레이어로,
'독립적으로 동작'할 수 있는 하나의 특정 동작을 정의.
EX)
features는 다양한 페이지와 위젯에서 사용할 수 있도록 기능을 추상화하는 레이어.
일부 슬라이스의 model 세그먼트에 비즈니스 로직이 포함되어 있더라도, features 레이어는 여전히 필요.
따라서 특정 레이어의 model 세그먼트에 해당 레이어 전용 로직을 포함할 수는 있지만,
재사용성과 독립성을 위해 보편적인 비즈니스 로직은 features 레이어에 두는 것이 좋음.

Entities 레이어는 프로젝트에서 다루는 비즈니스의 핵심 데이터를 나타내는 레이어.
Ex)
User 엔터티는 사용자 관련 정보를 관리하며,
이름, 이메일, 프로필 사진 등 사용자의 주요 정보를 다룸.
Entities 레이어는 다양한 페이지와 위젯에서 사용되는 비즈니스 핵심 데이터와 관련 로직을 제공

Shared 레이어는 프로젝트 전반에서 재사용할 수 있는 유틸리티, 기본적인 컴포넌트, 스타일 등의 전반적인 리소스를 포함하는 레이어
Ex)
shared 레이어도 app 레이어와 마찬가지로 슬라이스가 없는데,
이유는 이 레이어가 전역적으로 재사용 가능한 요소들만 모아두기 위한 공간이기 때문.
shared는 프로젝트 전반에서 공통으로 사용할 수 있는 유틸리티, 기본 컴포넌트, 스타일 등을 포함하며, 특정 기능이나 비즈니스 로직과는 무관.
슬라이스는 보통 특정 기능이나 비즈니스 도메인에 맞춰 세분화할 때 사용되는데,




