🤯 로드메이커 프로젝트의 구성에 고민을 하던 중, 인프런 멘토링을 통해 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들로 이루어지도록 점진적으로 분리의 정확성을 늘려가자.