원문 Feature-Sliced Design: The Best Frontend Architecture 포스트를 토대로 작성했습니다.
Feature-Sliced Design(FSD)은 애플리케이션을 여러 비즈니스 기능(feature) 단위로 구분하고, 이 기능들을 명확한 레이어로 구성해서 각 부분의 역할을 명확하게 정의하는 아키텍처이다.
FSD는 규모가 큰 프로젝트에서 특히 유용하며, 코드의 재사용성과 유지보수성을 높여준다.
FSD는 Layers, Slices, Segments 세 가지 개념으로 나뉜다.
레이어는 최상위 디렉토리이자 애플리케이션 분해의 첫 번째 단계이다. 레이어 수 최대 7개로 제한되어 있고, 일부는 표준화되어 있다.
각 레이어는 고유한 책임 영역(zone of responsibility)가 존재한다.
애플리케이션 로직이 초기화되는 레이어이다.
여러 페이지에 걸쳐 있는 프로세스를 다루는 레이어이다.
사용자에게 노출되는 각 화면을 담당하는 레이어이다.
페이지에서 사용되는 독립적인 UI 컴포넌트가 포함된다.
비즈니스 가치를 가지는 user scenarios 및 기능(functionality)을 다루는 레이어이다.
비즈니스 entity를 나타내는 레이어이다.
특정 비즈니스 로직과 분리된, 재사용 가능한 컴포넌트나 유틸리티를 포함하는 레이어이다.
레이어로 나누면 프로젝트가 체계적으로 구성되어 모듈화된다. 확장성이 높아지고 각 컴포넌트가 어디에 속해야 하는지 명확해져서 유지보수 관리가 용이해진다.
FSD는 계층적 구조를 가진다. (1~7 순서에 따름)
한 방향으로만 향하는 선형적 흐름(linear flow that is directed only in one direction)을 유지하기 위해, 상위 레이어만 하위 레이어를 활용할 수 있다.
features 레이어가 entities 레이어보다 계층적으로 더 위에 있기 때문에, entities 레이어는 features 레이어의 기능을 사용할 수 없다.
마찬가지로, features 레이어는 widgets 레이어나 processes 레이어의 컴포넌트를 사용할 수 없다.
💡 계층 구조에서 레이어의 위치가 낮을수록 코드의 더 많은 곳에서 사용될 가능성이 높기 때문에 낮은 계층 구조의 레이어를 변경하는 것이 더 위험하다.
각 레이어에는 하위 디렉토리로 슬라이스가 있다.
슬라이스는 FSD에서 비즈니스 중심의 세부적인 기능 단위를 의미한다.(= 비즈니스 가치에 기반한 코드 조직 방식이다)
프로젝트의 주요 entity를 기준으로 구성되며, 각각의 슬라이스는 특정 비즈니스 기능과 직접적으로 연결된다. (슬라이스 디렉토리 이름이 프로젝트의 비즈니스 도메인에 따라 유동적이라는 뜻이다)
슬라이스는 코드를 그 값(value)에 따라 그룹화하는 데 목표를 두고 있다.
이렇게 슬라이스를 나누는 목적은 각 비즈니스 기능이 서로 독립적으로 관리되도록 하기 위함이다. 각 슬라이스는 기능에 필요한 코드와 리소스만 포함해 구조적으로 분리(격리)한다. 이를 통해 다른 기능과 불필요하게 얽히지 않고 독립적인 유지보수와 수정이 가능해진다.
세그먼트는 슬라이스 내의 세부 기능들을 목적에 맞게 나눈 작은 단위이다.
각 슬라이스는 세그먼트들로 구성된다. 세그먼트 디렉토리의 구성과 이름은 팀의 컨벤션에 따라 유연하게 바꿀 수 있다.
일반적으로 자주 사용되는 세그먼트는 다음과 같다.
각 슬라이스와 세그먼트에는 Public API가 있다.
Public API는 index.js 또는 index.ts 파일이며, index 파일을 통해 슬라이스나 세그먼트에서 필요한 기능만 외부로 노출하고 불필요한 기능은 슬라이스 내부에서만 사용하도록 제한한다. index 파일은 진입점(entry point) 역할을 한다.
Public API 규칙:
Public API는 import나 export를 단순화하여, 애플리케이션에 변경이 생겨도 코드의 모든 곳에서 import를 수정할 필요가 없도록 한다.
✨ 코드가 더 안정적으로 캡슐화되고, 코드 수정 시 다른 파일의 import를 변경할 필요 없이 index 파일만 수정하면 되기 때문에 의존성 관리를 쉽게 할 수 있다.