๐ค "์ฐ๋ฆฌ ํ๋ก์ ํธ ํด๋ ๊ตฌ์กฐ, ์ด๊ฒ ์ต์ ์ผ๊น?"
ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด ํ๋ก์ ํธ๊ฐ ์ปค์ง์๋ก ํ์ผ์ด ๋์กํด์ง๊ณ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง๋ ๊ฒฝํ์ ํด๋ดค์ ๊ฒ์ด๋ค.
์ปดํฌ๋ํธ๋ ์ด๋์ ๋ฌ์ผ ํ ๊น?
๋น์ฆ๋์ค ๋ก์ง์ ์ด๋์ ๋ฐฐ์นํด์ผ ํ ๊น?
API ํธ์ถ ๋ก์ง์ ์ด๋์ ๋ฌ์ผ ํ์ง?
ํ์ด์ง๊ฐ ๋ง์์ง์๋ก ๊ด๋ฆฌ๊ฐ ์ ์ ํ๋ค์ด์ง๋๋ฐ...
์ด ๊ณ ๋ฏผ์ ํด๊ฒฐํด ์ค ํด๋ ๊ตฌ์กฐ๊ฐ ๋ฐ๋ก FSD(Feature-Sliced Design) ์ด๋ค.
๐ฅ FSD(Feature-Sliced Design)๋?
FSD๋ ๊ธฐ๋ฅ(Feature) ์ค์ฌ์ผ๋ก ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก, ๋ฌ์์ ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์์ ์ฒ์ ์ ๋ฆฝ๋ ํด๋ ๊ตฌ์กฐ์ด๋ค.
๊ธฐ์กด์ ํ์ด์ง(Page)-์ปดํฌ๋ํธ(Component)-์๋น์ค(Service) ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ, ๊ธฐ๋ฅ ๋จ์๋ก ํ๋ก์ ํธ๋ฅผ ๋๋ ์ ์ ์ง๋ณด์๋ฅผ ์ฝ๊ฒ ๋ง๋ ๋ค๊ณ ํ๋ค.
๐ FSD ํด๋ ๊ตฌ์กฐ ํ๋์ ๋ณด๊ธฐ
๐ src
โฃ ๐ app # ์ ํ๋ฆฌ์ผ์ด์
๋ ๋ฒจ ์ค์ (๋ผ์ฐํ
, ๊ธ๋ก๋ฒ ์ค์ ๋ฑ)
โฃ ๐ shared # ํ๋ก์ ํธ ์ ์ญ์์ ๊ณต์ ๋๋ UI ์ปดํฌ๋ํธ, ์ ํธ ํจ์, hooks ๋ฑ
โฃ ๐ entities # ํต์ฌ ๋๋ฉ์ธ ๋ชจ๋ธ๊ณผ ๊ด๋ จ๋ ์ํ ๊ด๋ฆฌ, API ์ ์
โฃ ๐ features # ๊ฐ๋ณ์ ์ธ ๊ธฐ๋ฅ ๋จ์ (๋ก๊ทธ์ธ, ๊ฒ์, ์ฅ๋ฐ๊ตฌ๋ ๋ฑ)
โฃ ๐ widgets # ์ฌ๋ฌ ๊ฐ์ feature๋ฅผ ์กฐํฉํ UI ๋ธ๋ก (ํค๋, ์ฌ์ด๋๋ฐ, ๋์๋ณด๋ ๋ฑ)
โฃ ๐ pages # ํ์ด์ง ๋จ์์ ๊ตฌ์ฑ ์์ (ex. ๋ก๊ทธ์ธ ํ์ด์ง, ํ๋กํ ํ์ด์ง)
โ ๐ processes # ์ฌ๋ฌ ํ์ด์ง์ ๊ธฐ๋ฅ์ ๊ฒฐํฉํ๋ ๋น์ฆ๋์ค ํ๋ฆ ๋จ์
๐ง FSD ํด๋ ๊ตฌ์กฐ ์์ธ ๋ถ์
1๏ธโฃ app/ → ์ ํ๋ฆฌ์ผ์ด์ ์ด๊ธฐ ์ค์
- index.tsx ๋๋ App.tsx ์์น
- ๋ผ์ฐํ , ํ ๋ง, ์ ์ญ ์ํ ์ค์ ๋ฑ ํฌํจ
๐ ์์
app/
โฃ providers/ # ์ํ ๊ด๋ฆฌ, ํ
๋ง ์ ๊ณต
โฃ routes/ # ๋ผ์ฐํ
์ค์
โ App.tsx # ์ ํ๋ฆฌ์ผ์ด์
์ง์
์
2๏ธโฃ shared/ → ๋ชจ๋ ๊ณณ์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์์
- ๊ณตํต UI ์ปดํฌ๋ํธ (๋ฒํผ, ์ธํ, ๋ชจ๋ฌ ๋ฑ)
- ์ ํธ๋ฆฌํฐ ํจ์, hooks, ์คํ์ผ ํ์ผ
๐ ์์
shared/
โฃ ui/ # ๋ฒํผ, ์
๋ ฅ ํ๋ ๋ฑ ๊ณตํต UI
โฃ api/ # HTTP ์์ฒญ ํจ์
โฃ hooks/ # ์ปค์คํ
ํ
โฃ lib/ # ํฌํผ ํจ์, ํฌ๋งทํฐ ๋ฑ
โ styles/ # ์ ์ญ ์คํ์ผ
3๏ธโฃ entities/ → ๋๋ฉ์ธ ๋ชจ๋ธ๊ณผ ๊ด๋ จ๋ ์ฝ๋
- API ํธ์ถ, ์ํ ๊ด๋ฆฌ, ํ์ ์ ์ ๋ฑ
- ์๋ฅผ ๋ค์ด User, Product ๋ฑ์ ์ํฐํฐ ๊ด๋ฆฌ
๐ ์์
entities/
โฃ user/ # ์ฌ์ฉ์ ๊ด๋ จ API, ์ํ ๊ด๋ฆฌ
โฃ product/ # ์ํ ๊ด๋ จ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
โ cart/ # ์ฅ๋ฐ๊ตฌ๋ ๋ฐ์ดํฐ ๊ด๋ฆฌ
4๏ธโฃ features/ → ๋ ๋ฆฝ์ ์ธ ๊ธฐ๋ฅ ๋จ์
- ๋ก๊ทธ์ธ, ํ์๊ฐ์ , ๊ฒ์, ์ฅ๋ฐ๊ตฌ๋ ๋ฑ
- ์ฌ๋ฌ ํ์ด์ง์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ
๐ ์์
features/
โฃ auth/ # ๋ก๊ทธ์ธ, ํ์๊ฐ์
โฃ search/ # ๊ฒ์ ๊ธฐ๋ฅ
โฃ cart/ # ์ฅ๋ฐ๊ตฌ๋ ๊ธฐ๋ฅ
โ profile/ # ํ๋กํ ์์ ๊ธฐ๋ฅ
5๏ธโฃ widgets/ → UI ๋ธ๋ก ์กฐํฉ (ํค๋, ์ฌ์ด๋๋ฐ ๋ฑ)
- ์ฌ๋ฌ feature๋ฅผ ์กฐํฉํ์ฌ UI๋ฅผ ๊ตฌ์ฑ
- ํ์ด์ง์ ๋ ๋ฆฝ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
๐ ์์
widgets/
โฃ navbar/ # ๋ด๋น๊ฒ์ด์
๋ฐ
โฃ sidebar/ # ์ฌ์ด๋๋ฐ
โฃ dashboard/ # ๋์๋ณด๋
โ footer/ # ํธํฐ
6๏ธโฃ pages/ → ๋ผ์ฐํธ ๋จ์์ ํ์ด์ง
- ๊ฐ๊ฐ์ ํ์ด์ง๋ feature์ widget์ ์กฐํฉํ์ฌ ๊ตฌ์ฑ
๐ ์์
pages/
โฃ home/ # ํ ํ์ด์ง
โฃ login/ # ๋ก๊ทธ์ธ ํ์ด์ง
โฃ profile/ # ํ๋กํ ํ์ด์ง
โ dashboard/ # ๋์๋ณด๋
7๏ธโฃ processes/ → ๋น์ฆ๋์ค ํ๋ฆ ๊ด๋ฆฌ
- ์ฌ๋ฌ ํ์ด์ง, ์์ ฏ, ๊ธฐ๋ฅ์ ํ๋๋ก ๋ฌถ์ด ํ๋ฆ์ ์ ์
๐ ์์
processes/
โฃ checkout/ # ๊ฒฐ์ ํ๋ก์ธ์ค (์ฅ๋ฐ๊ตฌ๋ → ๊ฒฐ์ → ์๋ฃ)
โฃ onboarding/ # ์ ๊ท ์ฌ์ฉ์ ์จ๋ณด๋ฉ ํ๋ก์ฐ
โ auth-flow/ # ๋ก๊ทธ์ธ → ๊ถํ ์ฒดํฌ → ๋์๋ณด๋
๐ฏ FSD ๊ตฌ์กฐ์ ์ฅ์
โ
์ ์ง๋ณด์ ์ฉ์ด → ๊ธฐ๋ฅ๋ณ๋ก ๋ถ๋ฆฌ๋์ด ์์ด ์์ ํ๊ธฐ ์ฌ์
โ
ํ์ฅ์ฑ → ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋ ๊ธฐ์กด ์ฝ๋์ ์ํฅ์ ์ต์ํ
โ
์ฌ์ฌ์ฉ์ฑ ์ฆ๊ฐ → shared/, widgets/ ํด๋ ๋๋ถ์ ์ค๋ณต ์ฝ๋ ๊ฐ์
โ
๋๋ฉ์ธ ์ค์ฌ ์ค๊ณ → ๋น์ฆ๋์ค ๋ก์ง๊ณผ UI๊ฐ ์ ์ ํ ๋ถ๋ฆฌ๋จ
๐ FSD, ์ ์ฉํด ๋ณผ๊น?
๐ฅ ์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ์์๋ ์ด๋ค ํด๋ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๊ณ ์๋์?
์ฒ์์๋ ์ต์ํ์ง ์์ ์ ์์ง๋ง, ํ๋ก์ ํธ ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ์ง๊ฐ๋ฅผ ๋ฐํํ๋ ๊ตฌ์กฐ์ธ ๊ฒ ๊ฐ๋ค. ํนํ ํ๋ก ํธ์๋ ์ํคํ
์ฒ์ ๋ํ ๊ณ ๋ฏผ์ด ๋ง๋ค๋ฉด ํ ๋ฒ ์ ์ฉํด๋ณด๋ ๊ฒ๋ ์ถ์ฒํ๋ค!