🤯 로드메이커 프로젝트의 구성에 고민을 하던 중, 인프런 멘토링을 통해 FSD라는 아키텍쳐에 대해 멘토님이 말씀해주셨고, 호기심이 발동해서 해당 아키텍쳐를 공부해보고 적용하고자 해봤습니다.
👋 해당 내용은 Feature sliced design을 토대로 공부한 내용과 nextjs(14.1.0 버전) 프로젝트에 적용한 기록을 담았습니다.
👋 학습과 병행한 기록이기 때문에 오류가 있을 수 있습니다. 해당 피드백은 댓글을 남겨주시면 감사하겠습니다.
🗣️ 내용 전달의 간결함을 위해서 이후 내용은 비격식체로 작성되었습니다.
Feature-Sliced Design (FSD) is an architectural methodology for scaffolding front-end applications. Simply put, it's a compilation of rules and conventions on organizing code. The main purpose of this methodology is to make the project more understandable and structured in the face of ever-changing business requirements.
FSD는 프론트엔드 애플리케이션의 비계(scaffold, 공사현장에서 높은 건물을 짓기 위한 보조 임시구조물) 역할을 하는 아키텍쳐 방법론이다. 간단히 말하자면, 코드를 관리하기 위한 규칙과 컨벤션의 집합이다. 이 방법론의 주 목적은 프로젝트를 더 이해하기 쉽고, 비즈니스적 요구사항의 가변성으로부터 체계적으로 만드는 것이다.

FSD에서 프로젝트는 segment들이 모여 slice를 구성하고, slice들이 모여 layer로 구성된다.
shared : 프로젝트/비즈니스의 상세한 부분과 분리된 재사용 가능한 기능 (UIKit, libs, api 등)entities : 비즈니스 엔티티 (User, Product, Order)features : 유저 상호작용, 유저에게 비즈니스 가치를 제공해주는 행위 (SendComent, AddToCart, UsersSearch)widgets : entities와 features를 의미있는 블록들로 합쳐 구성된 레이어pages: entities, features, widgets를 구성하는 풀 페이지process: deprecated 페이지간 복잡한 시나리오를 다루는 레이어 (authentication)app: 애플리케이션 전체 새팅, 스타일, provider ui, model(store, actions), api와 lib (util/hooks) 등이 있다. 필요에 따라 추가하거나 생략가능하다.api 와 config을 shared layer에만 두는 것이 권장된다.app/: 라우팅, store, global style 등의 세팅 포함
pages/: 애플리케이션의 각 페이지의 라우트 컴포넌트 포함, 로직이 거의 제외된 합쳐진 결과물만 존재한다.
애플리케이션 내부에서 뉴스피드의 post card를 살펴보자.
widgets/: "assembled" post card 포함 = 백엔드의 호출에 따른 content + 상호작용이 가능한 버튼
features/: 카드의 상호작용 (ex. 버튼)과 그 상호작용을 다루는 로직
entities/: 카드의 껍데기, content과 상호작용가능한 요소들의 슬롯 포함. post의 작성자를 나타내는 타일도 포함되지만 다른 슬라이스에 있다.
app과 shared layer의 틀을 먼저 잡아라.widgets와 pages에 배분해보자. features과 entities를 분리하여, page와 widget을 로직이 들어간 layer에서 순수하게 합성된 layer들로 이루어지도록 점진적으로 분리의 정확성을 늘려가자.