๋๋ฌ๋ณด๊ธฐ
Feature-Sliced Design (FSD)๋ ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์กฐ๋ฅผ ์ก๋ ์ํคํ ์ฒ ๋ฐฉ๋ฒ๋ก ์ ๋๋ค. ๊ฐ๋จํ ๋งํด, ์ฝ๋ ๊ตฌ์ฑ์ ๊ดํ ๊ท์น๊ณผ ๊ด๋ก๋ฅผ ๋ชจ์๋์ ๊ฒ์ ๋๋ค. ์ด ๋ฐฉ๋ฒ๋ก ์ ์ฃผ์ ๋ชฉ์ ์ ๊ณ์ ๋ณํํ๋ ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ ์ง๋ฉดํ์ ๋ ํ๋ก์ ํธ๋ฅผ ๋ ์ดํดํ๊ธฐ ์ฝ๊ณ ์์ ์ ์ผ๋ก ๋ง๋๋ ๊ฒ์ ๋๋ค.
FSD๋ ๊ท์น์ ์ ์ํ ๋ฟ๋ง ์๋๋ผ, ์ค์ ๊ฐ๋ฐ ๊ณผ์ ์ ๋๋ ๋ค์ํ ๋๊ตฌ๋ค์ ํจ๊ป ์ ๊ณตํฉ๋๋ค. ํ๋ก์ ํธ ์ํคํ ์ฒ๋ฅผ ํ์ธํ๋ ๋ฆฐํฐ, CLI๋ IDE๋ฅผ ํตํ ํด๋ ์์ฑ๊ธฐ, ๊ทธ๋ฆฌ๊ณ ๋ค์ํ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ด ํ๋ก์ ํธ์ ์ ํฉํ ๊น?โ
FSD๋ ๊ท๋ชจ์ ๊ด๊ณ ์์ด ๋ชจ๋ ํ๊ณผ ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ์ ์ ํฉํฉ๋๋ค:
- ์ฌ๋ฌ๋ถ์ด ํ๋ก ํธ์๋๋ฅผ ๊ฐ๋ฐํ๊ณ ์๋ค๋ฉด (์น, ๋ชจ๋ฐ์ผ, ๋ฐ์คํฌํฑ ๋ฑ์ UI)
- ์ฌ๋ฌ๋ถ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ณ ์๋ค๋ฉด
๊ทธ๊ฒ ๋ค์์! ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด, UI ํ๋ ์์ํฌ, ์ํ ๊ด๋ฆฌ์ ์ ํ์ ์์ต๋๋ค. FSD๋ฅผ ์ ์ง์ ์ผ๋ก ๋์ ํ ์ ์๊ณ , ๋ชจ๋ ธ๋ ํฌ์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ฑ์ ํจํค์ง๋ก ๋ถํ ํ๊ณ ๊ฐ๊ฐ์ FSD๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ ์ฉํ์ฌ ํฐ ๊ท๋ชจ๋ก ํ์ฅํ ์ ์์ต๋๋ค.
์ด๋ฏธ ์ํคํ ์ฒ๊ฐ ์๊ณ FSD๋ก์ ์ ํ์ ๊ณ ๋ ค ์ค์ด๋ผ๋ฉด, ํ์ฌ ์ํคํ ์ฒ๊ฐ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๊ณ ์๋์ง ํ์ธํ์ธ์. ์๋ฅผ ๋ค์ด, ํ๋ก์ ํธ๊ฐ ๋๋ฌด ์ปค์ง๊ณ ์ํธ ์ฐ๊ฒฐ๋์ด ์๋ก์ด ๊ธฐ๋ฅ์ ํจ์จ์ ์ผ๋ก ๊ตฌํํ๊ธฐ ์ด๋ ค์์ก๊ฑฐ๋, ๋ง์ ์ฌ๋์ด ์๋กญ๊ฒ ํ์ ํฉ๋ฅํ ๊ฒ์ผ๋ก ์์๋๋ ๊ฒฝ์ฐ์ ๋๋ค. ํ์ฌ ์ํคํ ์ฒ๊ฐ ์ ์๋ํ๋ค๋ฉด ๋ณ๊ฒฝํ ํ์๊ฐ ์์ ์๋ ์์ต๋๋ค. ํ์ง๋ง ๋ง์ด๊ทธ๋ ์ด์ ์ ๊ฒฐ์ ํ๋ค๋ฉด, ๋ง์ด๊ทธ๋ ์ด์ ๊ฐ์ด๋๋ฅผ ํ์ธํ์ธ์.
๊ฐ๋จํ ์์ โ
๋ค์์ FSD๋ฅผ ๊ตฌํํ ๊ฐ๋จํ ํ๋ก์ ํธ์ ๋๋ค:
๐ app
๐ pages
๐ shared
์ด ์ต์์ ํด๋๋ค์ ๋ ์ด์ด(layers)๋ผ๊ณ ํฉ๋๋ค. ๋ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
๐ app
๐ routes
๐ analytics
๐ pages
๐ home
๐ article-reader
๐ ui
๐ api
๐ settings
๐ shared
๐ ui
๐ api
๐ pages ๋ด๋ถ์ ํด๋๋ค์ ์ฌ๋ผ์ด์ค(slices)๋ผ๊ณ ํฉ๋๋ค. ์ฌ๋ผ์ด์ค๋ ๋๋ฉ์ธ์ ๋ฐ๋ผ ๋ ์ด์ด๋ฅผ ๋๋๋๋ค.(์ด ๊ฒฝ์ฐ์๋ ํ์ด์ง๋ณ๋ก)
๐ app
, ๐ shared
, ๊ทธ๋ฆฌ๊ณ ๐ pages/article-reader
๋ด๋ถ์ ํด๋๋ค์ ์ธ๊ทธ๋จผํธ(segments)๋ผ๊ณ ํฉ๋๋ค. ์ธ๊ทธ๋จผํธ๋ ์ฝ๋์ ๊ธฐ๋ฅ์ ๋ชฉ์ , ๋ค์๋งํด ์ฝ๋๊ฐ ์ํํ๋ ์ญํ ๋ฐ๋ผ ์ฌ๋ผ์ด์ค(๋๋ ๋ ์ด์ด)๋ฅผ ๋๋๋๋ค.
๊ฐ๋ โ
๋ ์ด์ด, ์ฌ๋ผ์ด์ค, ์ธ๊ทธ๋จผํธ๋ ๋ค์๊ณผ ๊ฐ์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ํ์ฑํฉ๋๋ค:
๋ ์ด์ดโ
๋ ์ด์ด๋ ๋ชจ๋ FSD ํ๋ก์ ํธ์์ ํ์คํ๋์ด ์์ต๋๋ค. ๋ชจ๋ ๋ ์ด์ด๋ฅผ ์ฌ์ฉํ ํ์๋ ์์ง๋ง, ์ด๋ฆ์ ์ค์ํฉ๋๋ค. ํ์ฌ(์์์ ์๋๋ก) 7๊ฐ๊ฐ ์์ต๋๋ค:
- App* - ์ฑ์ ์คํํ๋ ๋ชจ๋ ๊ฒ - ๋ผ์ฐํ , ์ง์ ์ , ์ ์ญ ์คํ์ผ, ํ๋ก๋ฐ์ด๋.
- Processes(๋ ์ด์ ์ฌ์ฉ๋์ง ์์) - ํ์ด์ง ๊ฐ ๋ณต์กํ ์๋๋ฆฌ์ค.
- Pages - ์ ์ฒด ํ์ด์ง ๋๋ ์ค์ฒฉ ๋ผ์ฐํ ์์ ํ์ด์ง์ ์ฃผ์ ๋ถ๋ถ.
- Widgets - ๋ ๋ฆฝ์ ์ผ๋ก ์๋ํ๋ ๋๊ท๋ชจ ๊ธฐ๋ฅ ๋๋ UI ์ปดํฌ๋ํธ, ๋ณดํต ํ๋์ ์์ ํ ๊ธฐ๋ฅ.
- Features - ์ ํ ์ ๋ฐ์ ๊ฑธ์ณ ์ฌ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ ๊ตฌํ์ฒด๋ก, ์ฌ์ฉ์์๊ฒ ์ค์ง์ ์ธ ๋น์ฆ๋์ค ๊ฐ์น๋ฅผ ์ ๊ณตํ๋ ๋์.
- Entities - ํ๋ก์ ํธ๊ฐ ๋ค๋ฃจ๋ ๋น์ฆ๋์ค ์ํฐํฐ, ์๋ฅผ ๋ค์ด user ๋๋ product.
- Shared* - ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ธฐ๋ฅ, ํนํ ํ๋ก์ ํธ/๋น์ฆ๋์ค์ ํน์ฑ๊ณผ ๋ถ๋ฆฌ๋์ด ์์ ๋ (๋ฐ๋์ ๊ทธ๋ด ํ์๋ ์์).
* - App๊ณผ Shared๋ ๋ค๋ฅธ ๋ ์ด์ด๋ค๊ณผ ๋ฌ๋ฆฌ ์ฌ๋ผ์ด์ค๋ฅผ ๊ฐ์ง์ง ์์ผ๋ฉฐ, ์ง์ ์ธ๊ทธ๋จผํธ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
๋ ์ด์ด๋ฅผ ๋ค๋ฃฐ ๋์ ์ค์ํ ์ ์ ํ ๋ ์ด์ด์ ๊ตฌ์ฑ ์์๋ ๋ฐ๋์ ์๋์ ์๋ ๋ ์ด์ด์ ๊ตฌ์ฑ ์์๋ง ์์์๊ณ ์ํฌํธํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
์ฌ๋ผ์ด์คโ
๋ค์์ ์ฌ๋ผ์ด์ค์ ๋๋ค. ์ฌ๋ผ์ด์ค๋ ๋น์ฆ๋์ค ๋๋ฉ์ธ๋ณ๋ก ์ฝ๋๋ฅผ ๋ถํ ํฉ๋๋ค. ์ฌ๋ฌ๋ถ์ ์์ ๋กญ๊ฒ ์ด๋ฆ์ ์ ํํ ์ ์๊ณ , ์ํ๋ ๋งํผ ๋ง์ด ๋ง๋ค ์ ์์ต๋๋ค. ์ฌ๋ผ์ด์ค๋ ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ด๋ จ๋ ๋ชจ๋๋ค์ ๊ฐ๊น์ด ์ ์งํจ์ผ๋ก์จ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ ์ฝ๊ฒ ํ์ํ ์ ์๊ฒ ํด์ค๋๋ค.
์ฌ๋ผ์ด์ค๋ ๊ฐ์ ๋ ์ด์ด ์์์ ๋ค๋ฅธ ์ฌ๋ผ์ด์ค๋ฅผ ์ฐธ์กฐํ ์ ์์ผ๋ฉฐ, ์ด ๊ท์น์ ๋์ ์์ง๋์ ๋ฎ์ ๊ฒฐํฉ๋๋ฅผ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ธ๊ทธ๋จผํธโ
์ฌ๋ผ์ด์ค์ App, Shared ๋ ์ด์ด๋ ์ธ๊ทธ๋จผํธ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์ธ๊ทธ๋จผํธ๋ ๋ชฉ์ ์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ๊ทธ๋ฃนํํฉ๋๋ค. ์ธ๊ทธ๋จผํธ ์ด๋ฆ์ ํ์ค์ ์ํด ์ ํ๋์ง ์์ง๋ง, ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ชฉ์ ์ ์ํ ๋ช ๊ฐ์ง ๊ด๋ก์ ์ธ ์ด๋ฆ์ด ์์ต๋๋ค.:
ui
- UI์ ๊ด๋ จ๋ ๋ชจ๋ ๊ฒ: UI ์ปดํฌ๋ํธ, ๋ ์ง ํฌ๋งทํฐ, ์คํ์ผ ๋ฑ.api
- ๋ฐฑ์๋ ์ํธ์์ฉ: request ํจ์, ๋ฐ์ดํฐ ํ์ , mapper ๋ฑ.model
- ๋ฐ์ดํฐ ๋ชจ๋ธ: ์คํค๋ง, ์ธํฐํ์ด์ค, ์คํ ์ด, ๋น์ฆ๋์ค ๋ก์ง.lib
- ์ฌ๋ผ์ด์ค ์์ ์๋ ๋ค๋ฅธ ๋ชจ๋์ด ํ์๋ก ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋.config
- ์ค์ ํ์ผ๊ณผ ๊ธฐ๋ฅ ํ๋๊ทธ.
๋๋ถ๋ถ์ ๋ ์ด์ด์์๋ ์ด ์ธ๊ทธ๋จผํธ๋ค๋ก ์ถฉ๋ถํ๋ฉฐ, Shared๋ App์์๋ง ์์ ๋ง์ ์ธ๊ทธ๋จผํธ๋ฅผ ๋ง๋ค ๊ฒ์ ๋๋ค. ํ์ง๋ง ์ด๊ฑด ๊ผญ ์ง์ผ์ผํ๋ ๊ท์น์ ์๋๋๋ค.
์ฅ์ โ
-
๊ท ์ผ์ฑ
๊ตฌ์กฐ๊ฐ ํ์คํ๋์ด ์์ด, ํ๋ก์ ํธ๊ฐ ๋ ๊ท ์ผํด์ง๋ฉฐ, ์ด๋ ์๋ก์ด ๋ฉค๋ฒ๊ฐ ํ์ ์ ์ํ๋ ๊ฒ์ ๋ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. -
๋ณ๊ฒฝ๊ณผ ๋ฆฌํฉํ ๋ง์ ๋ํ ์์ ์ฑ
ํ ๋ ์ด์ด์ ๊ตฌ์ฑ ์์๋ ๊ฐ์ ๋ ์ด์ด๋ ์์ ๋ ์ด์ด์ ๋ค๋ฅธ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ์ฑ์ ์ฌ์ด๋ ์ดํํธ ์์ด ๊ฒฉ๋ฆฌ๋ ์์ ์ ํ ์ ์์ต๋๋ค. -
๋ก์ง ์ฌ์ฌ์ฉ์ ํต์
๋ ์ด์ด์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ๋งค์ฐ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋๋ ๋งค์ฐ ์ง์ญ์ ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ DRY ์์น๊ณผ ์ค์ฉ์ฑ ์ฌ์ด์ ๊ท ํ์ ์ ์งํฉ๋๋ค. -
๋น์ฆ๋์ค์ ์ฌ์ฉ์ ์๊ตฌ์ ๋ํ ์งํฅ์ฑ
์ฑ์ ๋น์ฆ๋์ค ๋๋ฉ์ธ์ผ๋ก ๋ถํ ๋๋ฉฐ, ์ด๋ฆ์ ์ง์ ๋ ๋น์ฆ๋์ค ์ธ์ด ์ฌ์ฉ์ด ๊ถ์ฅ๋ฉ๋๋ค. ์ด๋ก ์ธํด ํ๋ก์ ํธ์ ๋ฌด๊ดํ ๋ถ๋ถ์ ์์ ํ ์ดํดํ์ง ์๊ณ ๋ ์ ์ฉํ ๊ฐ๋ฐ์ ํ ์ ์์ต๋๋ค.
์ ์ง์ ๋์ โ
FSD๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๊ณ ์ ํ๋ ๊ธฐ์กด ์ฝ๋๋ฒ ์ด์ค๊ฐ ์๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ ์ ๋ต์ ์ ์ํฉ๋๋ค. ์ด๋ ์ฐ๋ฆฌ์ ๋ง์ด๊ทธ๋ ์ด์ ๊ฒฝํ์์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
-
App๊ณผ Shared ๋ ์ด์ด๋ฅผ ๋ชจ๋๋ณ๋ก ์ฒ์ฒํ ๊ตฌ์ฑํ์ฌ ๊ธฐ๋ฐ์ ๋ง๋๋ ๊ฒ์ผ๋ก ์์ํ์ธ์.
-
๊ธฐ์กด์ ๋ชจ๋ UI๋ฅผ Widgets์ Pages์ ํฐ ํ์์ ๋ถ๋ฐฐํ์ธ์. FSD ๊ท์น์ ์๋ฐํ๋ ์์กด์ฑ์ด ์๋๋ผ๋ ๊ด์ฐฎ์ต๋๋ค.
-
์ ์ง์ ์ผ๋ก ์ํฌํธ ์๋ฐ์ ํด๊ฒฐํ๊ณ , Entities์ ๊ฐ๋ฅํ๋ค๋ฉด Features๋ ์ถ์ถํ๊ธฐ ์์ํ์ธ์.
๋ฆฌํฉํ ๋ง ์ค์ด๊ฑฐ๋ ํ๋ก์ ํธ์ ํน์ ๋ถ๋ถ๋ง ๋ฆฌํฉํ ๋งํ ๋๋ ์๋ก์ด ๋๊ท๋ชจ ์ํฐํฐ๋ฅผ ์ถ๊ฐํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ค์ ๋จ๊ณโ
- FSD๋ก ์ฌ๊ณ ํ๋ ๋ฐฉ๋ฒ์ ์ ์ดํดํ๊ณ ์ถ์ผ์ ๊ฐ์? ํํ ๋ฆฌ์ผ์ ํ์ธํด๋ณด์ธ์.
- ์์ ๋ฅผ ํตํด ๋ฐฐ์ฐ๋ ๊ฒ์ ์ ํธํ์๋์? ์์ ์น์ ์ ๋ง์ ์์ ๊ฐ ์์ต๋๋ค.
- ์ง๋ฌธ์ด ์์ผ์ ๊ฐ์? ์ฐ๋ฆฌ์ ํ ๋ ๊ทธ๋จ ์ฑํ ๋ฐฉ์ ๋ค๋ฌ ์ปค๋ฎค๋ํฐ์ ๋์์ ๋ฐ์ผ์ธ์.