본문 바로가기
요즘 관심 분야

FSD : Slices and segments

by 다양성 2025. 12. 2.

안녕하세요! 방금 전까지 우리는 **'계층(Layers)'**이라는 큰 층별 구분에 대해 이야기했죠? (1층 Shared, 2층 Entities...)

이번에는 그 층 안을 어떻게 정리하는지, 즉 **슬라이스(Slices)**와 **세그먼트(Segments)**에 대해 알아볼 차례입니다.

이건 마치 여러분의 **"책상 서랍 정리"**나 **"과목별 파일철 정리"**와 똑같습니다. 고등학생의 학교생활로 비유해서 아주 쉽게 설명해 드릴게요!


📂 1. 슬라이스 (Slices): "과목별 파일철"

여러분이 공부를 잘하려면 국어 프린트와 수학 프린트를 섞어두면 안 되겠죠? 과목별로 파일철을 따로 만들어야 합니다. FSD에서는 이걸 **슬라이스(Slice)**라고 부릅니다.

  • 정의: 코드를 **'주제(무엇에 관한 것인가?)'**별로 나누는 것입니다.
  • 비유: [국어 파일], [수학 파일], [영어 파일].
  • 특징:
    • 국어 파일 안에는 국어 교과서, 국어 숙제, 국어 시험지가 다 들어갑니다.
    • 수학 파일 안에는 수학 공식, 수학 문제집이 다 들어갑니다.
    • 핵심 규칙: 국어 숙제를 하다가 갑자기 수학 공식을 가져오면 안 됩니다. 각 파일철은 서로 독립적이어야 합니다. (이걸 "슬라이스끼리는 서로 모르게 해라"라고 합니다.)

💻 코드로 보면?
features (기능) 계층 안에 이런 폴더(슬라이스)들이 생깁니다.

  • features/auth (로그인 관련 파일철)
  • features/cart (장바구니 관련 파일철)
  • features/review (리뷰 작성 관련 파일철)

🗂️ 2. 세그먼트 (Segments): "파일철 안의 칸막이"

자, 이제 **[수학 파일(Slice)]**을 열어봅시다. 그 안에 종이들이 마구잡이로 섞여 있으면 찾기 힘들겠죠? 그래서 파일철 안에 투명 비닐이나 인덱스로 칸막이를 나눕니다. 이걸 **세그먼트(Segment)**라고 합니다.

  • 정의: 슬라이스 안의 코드를 **'역할(어떤 기술인가?)'**별로 나누는 것입니다.
  • 비유: 수학 파일 안에 있는 [공식 정리 칸], [문제 풀이 칸], [오답 노트 칸].
  • FSD의 표준 칸막이 이름들:
    • ui: "눈에 보이는 것" (화면, 버튼, 컴포넌트)
    • model: "머리로 생각하는 것" (데이터 처리, 상태 관리, 핵심 로직)
    • api: "외부와 소통하는 것" (서버 요청)
    • lib: "도와주는 도구들" (기타 보조 함수)

🖼️ 그림으로 한 번에 이해하기

여러분이 "로그인(Login)" 기능을 만든다고 상상해 보세요.

1단계: 계층 (어디 층에 둘까?)
→ "로그인은 사용자의 행동이니까 3층 features에 두자!"

2단계: 슬라이스 (무슨 과목이지?)
→ "주제는 인증(Auth)이니까 auth라는 폴더(파일철)를 만들자!"

3단계: 세그먼트 (내용물 분리하자!)
features/auth 폴더 안에 칸막이를 칩니다.

  • 📂 ui (화면)
    • LoginForm.tsx (아이디/비번 입력창 그림)
    • LoginButton.tsx (로그인 버튼 그림)
  • 📂 model (로직/뇌)
    • validation.ts (비밀번호가 8자리인지 검사하는 규칙)
    • userState.ts (로그인 성공하면 상태를 '로그인됨'으로 바꾸는 기억 장치)
  • 📂 api (통신)
    • loginRequest.ts (서버에 아이디/비번 보내는 우편배달부)

🚦 중요한 규칙: "옆 반 친구랑 놀지 마라"

FSD에서 슬라이스(Slices)를 나눌 때 가장 중요한 규칙이 있습니다.

"같은 층에 있는 슬라이스끼리는 서로 가져다 쓰면 안 된다!"

  • 상황: features/cart (장바구니) 기능을 만들고 있는데, 갑자기 features/auth (로그인) 파일철에 있는 코드를 가져오고 싶습니다.
  • FSD의 호통: "안 돼! 장바구니가 고장 나면 장바구니만 고쳐야지, 왜 로그인까지 얽혀있어?"
  • 해결법: 둘 다 공통으로 필요한 게 있다면?
    • 더 아래층인 SharedEntities로 내리거나,
    • 더 위층인 WidgetsPages에서 둘을 조립해야 합니다.
    • 같은 층끼리는 '손절' 상태여야 코드가 깔끔해집니다.

📝 세 줄 요약

  1. **슬라이스(Slice)**는 **'주제(과목)'**별로 폴더를 나누는 것이다. (예: 로그인, 장바구니, 게시글)
  2. **세그먼트(Segment)**는 그 주제 안에서 **'역할(칸막이)'**별로 파일을 나누는 것이다. (예: UI, 로직, API)
  3. 슬라이스끼리는 서로 독립적이어야 나중에 수정할 때 편하다!

* 본 문서는 google ai studio 로 작성되었습니다.  ( 원본 : https://feature-sliced.github.io/documentation/docs/reference/slices-segments )

'요즘 관심 분야' 카테고리의 다른 글

FSD : About architecture  (0) 2025.12.03
FSD : Public API  (0) 2025.12.03
FSD : Layers  (0) 2025.12.02
FSD : Usage with Next.js  (1) 2025.12.02
FSD : Handling API Requests  (0) 2025.12.02

댓글