ํ๋ก๊ทธ๋๋จธ์ค ์ต์ข
ํ๋ก์ ํธ์์ ํ๋ก ํธ์๋ ํด๋๊ตฌ์กฐ์ ๋ํ ๋
ผ์๋ฅผ ๊ฑฐ์ณ FSD ์ํคํ
์ฒ์ ๋ํด ๊ณต๋ถํ๊ณ ๋ด์ฉ์ ๊ณต์ ํ๊ธฐ๋ก ํ๋ค.
FSD ์ํคํ
์ฒ๋ ์ด๋ค ๊ตฌ์กฐ์ธ์ง ์ดํด๋ณด๋ฉฐ ์ด์ ์ ์ฌ์ฉํ๋ ๋ฐฉ์๊ณผ FSD ์ํคํ
์ฒ๋ฅผ ์ฌ์ฉํ์ ๋๋ฅผ ๋น๊ตํ์ฌ ์ข์ ์ ์ ์ดํด๋ณด๊ณ ์ฐ๋ฆฌ ํ๋ก์ ํธ์ ์ ์ฉํ์ ๋ ์ป๊ฒ๋๋ ์ด์ ๋ํ ์๊ฐํด๋ณด๋ ค๊ณ ํ๋ค.
FSD ๊ณต์ํ์ด์ง : https://feature-sliced.design/
Welcome | Feature-Sliced Design
Architectural methodology for frontend projects
feature-sliced.design
๊ณต์๋ฌธ์์ ๋ค์ํ ์๋น์ค๋ค์ ๊นํ๋ธ ์ฃผ์๊ฐ ์๋ค. ๋ ํผ๋ฐ์ค๋ก ํ์ฉํ ์ ์์ ๊ฒ ๊ฐ๋ค.
FSD(FeatureSliced Design) Architecture
FSD(๊ธฐ๋ฅ ๋ถํ ์ค๊ณ)๋ ๊ธฐ๋ณธ์ ์ผ๋ก Layers, Slices, Segments๋ก ๊ตฌ์ฑ๋์ด ์๋ค.

Layers
๋ชจ๋ FSD ํ๋ก์ ํธ์์ Layers๋ ํ์คํ๋์ด ์๋ค. ์ด 7๊ฐ์ Layer๊ฐ ์กด์ฌํ๊ณ , ๋ชจ๋ ๋ ์ด์ด๋ฅผ ๋ค ์ฌ์ฉํ ํ์๋ ์๋ค.
- app : ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ด ์ด๊ธฐํ ๋๋ ๊ณณ์ด๋ค. ํ๋ก๋ฐ์ด๋, ๋ผ์ฐํฐ, ์ ์ญ ์คํ์ผ, ์ ์ญ ํ์ ์ ์ธ ๋ฑ์ด ์ ์๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ ์ ์ญํ ์ ํ๋ค.
processes: ๋์ด์ ์ฌ์ฉ๋์ง ์์ง๋ง, ์ฌ๋ฌ ํ์ด์ง์ ๊ฑธ์ณ ์๋ ํ๋ก์ธ์ค๋ฅผ ์ฒ๋ฆฌํ๋ค.- pages : ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ด์ง๊ฐ ํฌํจ๋๋ค.
- widgets : ํ์ด์ง์ ์ฌ์ฉ๋๋ ๋ ๋ฆฝ์ ์ธ UI ์ปดํฌ๋ํธ์ด๋ค.
- features : ์ฌ์ฉ์์๊ฒ ๋น์ฆ๋์ค ๊ฐ์น๋ฅผ ๊ฐ์ ธ๋ค์ฃผ๋ ์์ ์ธ ์ฌ์ฉ์ ์๋๋ฆฌ์ค๋ ๊ธฐ๋ฅ์ ๋ค๋ฃฌ๋ค.
- entities : ๋น์ฆ๋์ค ์ํฐํฐ๋ฅผ ๋ํ๋ธ๋ค. ์ ํ์ ๋ ์ด์ด์ด๋ค.
- shared : ํน์ ๋น์ฆ๋์ค ๋ก์ง์ ์ข ์๋์ง ์๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ์ ์ ํธ๋ฆฌํฐ๊ฐ ํฌํจ๋์ด ์๋ค. UIํคํธ, axios ์ค์ , ์ ํ๋ฆฌ์ผ์ด์ ์ค์ , ๋น์ฆ๋์ค ๋ก์ง์ ๋ฌถ์ด์ง ์๋ ํฌํผ ๋ฑ์ด ํฌํจ๋๋ค.
Layers๋ฅผ ํตํด ๋ชจ๋ํ๋๊ณ ์ ์ง๋ณด์์ ์ข์ ํ์ฅ๊ฐ๋ฅํ ์ํคํ
์ฒ๋ฅผ ๊ตฌ์ฑํ๋๋ฐ ๋์์ด ๋ ์ ์๋ค.
์ฌ๊ธฐ์ ์ค์ํ ์ ์ ์ด ๋ ์ด์ด๊ฐ ๊ณ์ธตํ๊ฐ ๋์ด์๋ค๋ ๊ฒ์ด๋ค. ์ฆ, features ๋ ์ด์ด๋ entities์ shared ๋ ์ด์ด๋ณด๋ค ๋ ์์ ์๊ธฐ ๋๋ฌธ์ entities์ shared ๋ ์ด์ด๋ features ๋ ์ด์ด์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ ์ ํ์ ์ธ ํ๋ฆ์ ์ ์งํ๊ธฐ ์ํจ์ด๋ผ๊ณ ํ๋๋ฐ, ์ํคํ
์ฒ์ ์ ์ ์ํ๋ฉด ์คํ๋ ค ๊ฐ๋ฐํ๊ธฐ์๋ ํธํ ๊ตฌ์กฐ๊ฐ ๋ ์ ์๋ค๊ณ ์๊ฐ์ด ๋ค์๋ค. (ํน์ ๋ถ๋ถ์ ๊ฐ์ ธ์์ผ ํ๋ฉด ๊ผญ ์๋ ๊ณ์ธต์์๋ง ๊ฐ์ ธ์ฌ ์ ์์ผ๋๊น... ๊ฒฐ๊ตญ ์๋์์ ๋ง๋ค๋๋ก ์ ๋์ํค๊ณ , ํน์ ๊ธฐ๋ฅ์ด๋ ์ฝ๋๋ ์๋ ๊ณ์ธต์์ ์ฐพ์ผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๊ตฌ์กฐ์ ๊ด๋ จ๋ ๊ฐ๋ฐ ์๊ฐ์ ์ถ์์ํค์ง ์์๊น?๐ง)

Slices
Layers์ ํ์๋ก Slices ๋๋ ํ ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค. ์ด Slices์ ๋ชฉํ๋ ์ฝ๋๋ฅผ ๊ฐ ๋ณ๋ก ๊ทธ๋ฃนํ ํ๋ ๊ฒ์ด๋ค. Layers์์๋ ๊ฐ Layer๋ง๋ค ์ด๋ฆ์ด ์กด์ฌํ๋๋ฐ Slices์ Segments๋ ํน์ ํ ์ด๋ฆ์ด ์๋ค. ํ์์ ๋ชฉ์ ์ ๋ถํฉํ ์ด๋ฆ์ ๋ถ์ด๋ฉด ๋๋ค๊ณ ํ๋ค. Slice๋ ๊ฐ Layer์์ ๋
๋ฆฝ์ ์ผ๋ก ์ฌ์ฉ๋์ด์ผ ํ๋ฉฐ Slice์์ ๊ตฌํํ ์ฝ๋๋ค์ ์ง์ ์ ์ธ ๊ณต์ ๋ฅผ ํ์ง ์๋ ๊ฒ์ด ์ด์์ ์ด๋ผ๊ณ ํ๋ค.
(์ง์ ์ ์ธ ๊ณต์ ๋ผ ํจ์ ์ฝ๋๋ด export๋ฅผ ๋งํ๋ ๊ฑด๊ฐ?(ํ์ค์น์์) -> ๊ทธ๋์ ๋ค์ ๋์ค๋ Public API๊ฐ ๋์ค๋๊ฑด๊ฐ ์ถ๋ค.)
FSD ๊ณต์๋ฌธ์๋ฅผ ๋ณด๋ฉด app๊ณผ shared ๋ ์ด์ด๋ Slices๋ฅผ ๊ฐ์ง์ง ์๊ณ ๋ฐ๋ก Segments๋ฅผ ๊ตฌ์ฑํ๋ค๊ณ ๋์์๋ค.
Segments
๊ฐ Slices๋ Segments๋ก ๊ตฌ์ฑ๋๋ค. Segment์ ๋ชฉ์ ์ ๋ฐ๋ผ Slice ๋ด์ ์ฝ๋๋ฅผ ๋๋๊ฒ ๋๋ค. Segments๋ค์ ์ด๋ฆ ๋ํ ์ ํ๋์ด ์์ง๋ ์์ง๋ง ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฐ์ด๋ ์ด๋ฆ๋ค์ด ์๋ค.
- ui : UI ํ์์ ๊ด๋ จ๋ ๊ฒ - UI ๊ตฌ์ฑ์์, ๋ ์ง ํฌ๋งทํฐ, ์คํ์ผ ๋ฑ
- api : ๋ฐฑ์๋ ์ธํฐ๋์ - ์์ฒญ ํจ์, ๋ฐ์ดํฐ ํ์ ๋ฑ
- model : ๋ฐ์ดํฐ ๋ชจ๋ธ - ์คํค๋ง, ์ธํฐํ์ด์ค, ์คํ ์ด, ๋น์ฆ๋์ค ๋ก์ง ๋ฑ
- lib : ํด๋น Slice์์ ์ฌ์ฉ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋
- config - configuration ํ์ผ๊ณผ feature flags
Public API (Barrel export)
Slice์ Segment์๋ Public API๊ฐ ์๋ค. ์ด๋ index.js, index.ts๋ฅผ ์๋ฏธํ๋ฉฐ ์ด ํ์ผ์ ํตํด ํ์ํ ๊ธฐ๋ฅ๋ง ์ธ๋ถ๋ก export ํ๋ ๋ฐฉ์์ด๋ค. Public API์ ๋ํ ๊ท์น์ ์๋์ ๊ฐ๋ค.
- app slice์ segment๋ public API์ index ํ์ผ์ ์ ์๋ slice ๊ธฐ๋ฅ๊ณผ ์ปดํฌ๋ํธ๋ง ์ฌ์ฉํ๋ค.
- public API์ ์ ์๋์ง ์์ slice ๋๋ segment์ ๋ด๋ถ ๋ถ๋ถ์ ๊ฒฉ๋ฆฌ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ฉฐ slice ๋๋ segment ๋ด๋ถ์์๋ง ์ ๊ทผํ ์ ์๋ค.

Barrel export๋ฅผ ์ฌ์ฉํ๋ฉด importํ ๋ import { Button, Title, Textfield } from ๊ฒฝ๋ก/index.ts ์ผ๋ก ๊น๋ํ๊ฒ ์ฌ์ฉํ ์ ์์ด์ ์ข๋ค.
์ด์ ์ ์ฌ์ฉํ ๋ฐฉ์ vs FSD
์ด์ ์๋ ๊ธฐ๋ฅ๋ณ๋ก ์ํคํ
์ฒ๋ฅผ ๊ตฌ๋ถํ๋ ๊ฒ์ด ์๋ ์ฝ๋์ ์ญํ ์ ๋ฐ๋ผ์ ์ํคํ
์ฒ๋ฅผ ๊ตฌ๋ถํ์๋๋ฐ, ๋ฐ๋ผ์ api, assets, components, pages, store, utils, style ๋ฑ์ ํด๋๋ฅผ ์ต์์๋ก ์ํคํ
์ฒ๋ฅผ ๊ตฌ์ฑํ์๋ค. ํ์ง๋ง ์ด ๋ฐฉ์์ ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ๊ฑฐ๋ ๊ด๋ฆฌํ๊ธฐ์๋ ๋ณต์กํ ๊ตฌ์กฐ์๋ค. ์๋ฅผ ๋ค์ด ํน์ ๊ธฐ๋ฅ์ ํ๋ ํจ์๋ฅผ ๊ตฌํํด์ผ ํ ๋ ํด๋น ์ฝ๋๋ฅผ ์ด๋์๋ค๊ฐ ๋ฐฐ์นํด์ผํ๋ ์ง์ ๋ํ ๊ณ ๋ฏผ์ด ํ์ํ๋ค.
FSD๋ ์ด๋ฌํ ๊ณ ๋ฏผ์์ ๋ฒ์ด๋๊ฒ ํด์ฃผ๋ ๊ฒ ๊ฐ๋ค. ๊ธฐ๋ฅ๋จ์๋ก ๊ตฌ์กฐ๊ฐ ๋๋์ด์ง๊ธฐ ๋๋ฌธ์ ๋ช
ํํ๊ฒ ์ฝ๋๊ฐ ๊ตฌ๋ถ์ด ๋๋ค. ๋ํ ๋ ์ด์ด์์๋ ๊ณ์ธต๊ตฌ์กฐ๊ฐ ์ด๋ฃจ์ด์ ธ ์์ด, ์์์ด ๊ฐ๋ฅํ๋ค. ์ด๋ฌํ ํน์ฑ์ ์ ์ง๋ณด์ํ๊ธฐ์ ์ฅ์ ์ด๋ผ๊ณ ์๊ฐํ๋ค. ๋ํ FSD ๊ณต์ ๋ฌธ์๋ฅผ ๋ณด๋ฉด ๋ฆฐํธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ํ๋ค. ์ด๋ฅผ ํ์ฉํ๋ฉด ์ข ๋ FSD์ ๋ง๊ฒ ๊ฐ๋ฐํ ์ ์์ง ์์๊น ์ถ๋ค.
ํ์ง๋ง ์๋ก์ด ๋ฐฉ์์ ์ํคํ
์ฒ์ด๋ค๋ณด๋, ์ฐ๋ฆฌํ์ ๊ฒฝ์ฐ 8๋ช
์ ํ์์ด ์ด ๋ฐฉ์์ ๊ตฌ์กฐ์ ์นํด์ง๊ธฐ์๋ ์ฝ๊ฐ์ ์๊ฐ์ด ๊ฑธ๋ฆด์๋ ์๊ณ , ๊ฐ๋ฐํ๋ฉด์๋ ์ ์ํ๊ธฐ์๋ ์ฝ์ง ์์ ๊ฒ ๊ฐ๋ค. ํด๋น ์ํคํ
์ฒ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ๋ชจ๋ ํ์์ด ๋์ผํ ์ดํด๋ฅผ ๋ฐํ์ผ๋ก ์ฌ์ฉ๋์ด์ง ํ์๊ฐ ์๋ค.
Welcome | Feature-Sliced Design
Architectural methodology for frontend projects
feature-sliced.design
https://dev.to/m_midas/feature-sliced-design-the-best-frontend-architecture-4noj
Feature-Sliced Design: The Best Frontend Architecture
Introduction Frontend developers often face a problem related to application architecture....
dev.to
https://emewjin.github.io/feature-sliced-design/#%EB%93%A4%EC%96%B4%EA%B0%80%EB%A9%B0
(๋ฒ์ญ) ๊ธฐ๋ฅ ๋ถํ ์ค๊ณ - ์ต๊ณ ์ ํ๋ฐํธ์๋ ์ํคํ ์ฒ
๊ธฐ๋ฅ ๋ถํ ์ค๊ณ(Feature-Sliced Design, FSD) ์ํคํ ์ฒ์ ๊ฐ๋ ๊ณผ ์ด ์ํคํ ์ฒ ๋ฐฉ๋ฒ๋ก ์ด ํด๊ฒฐํ๋ ๋ฌธ์ ๋ฅผ ์ด์ผ๊ธฐํ๊ณ , FSD๋ฅผ ๊ธฐ์กด ์ํคํ ์ฒ ๋ฐ ๋ชจ๋์ ์ํคํ ์ฒ์ ๋น๊ตํ ๋ค ์ฅ๋จ์ ์ ๋ํด ์๊ฐํฉ๋๋ค.
emewjin.github.io
https://developers.hyundaimotorgroup.com/blog/399
๊ธฐ๋ฅ ๋ถํ ์ค๊ณ(FSD)๋ฅผ ์ด์ฉํ FE ์ํคํ ์ฒ ๊ตฌ์ฑ
FE ๊ฐ๋ฐ์ ํ๋ฉด์ ์ฒซ ํ๋ก์ ํธ ์์์์ ๊ฐ์ฅ ๊ณ ๋ฏผ๋๋ ํด๋ ๊ตฌ์กฐ์ ๋ํด ๊ณ ๋ฏผ์ ๋์์ด ๋๊ณ ์ ๊ธฐ๋ฅ ๋ถํ ์ค๊ณ(FSD) ๊ฐ๋ ์ ์๊ฐ ํฉ๋๋ค. ๊ผญ ํ๋ก์ ํธ ์์์ด ์๋๋ผ, ํด๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํ๊ณ ์ถ์
developers.hyundaimotorgroup.com
'์น ํ๋ก์ ํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Frontend ์ด๋ฏธ์ง ์ต์ ํํ๊ธฐ (4) | 2024.11.14 |
---|---|
AWS ํ๋ฆฌํฐ์ด ์ ์ฉ ๋ฒ์ (0) | 2024.09.13 |
[React] sitemap์ผ๋ก SEO ์์ ํ๊ธฐ (2) | 2024.06.15 |
[Crop] ํ๋ก์ ํธ ํ์คํ์ด์ค ์์ฑ! (0) | 2024.05.21 |