|
| 1 | +--- |
| 2 | +sidebar_position: 10 |
| 3 | +--- |
| 4 | +# NextJS์ ํจ๊ป ์ฌ์ฉํ๊ธฐ |
| 5 | + |
| 6 | +NextJS์์๋ FSD(Feature-Sliced Design) ์ํคํ
์ฒ๋ฅผ ๊ตฌํํ ์ ์์ง๋ง, ๋ ๊ฐ์ง ์ ์์ NextJS์ ํ๋ก์ ํธ ๊ตฌ์กฐ ์๊ตฌ์ฌํญ๊ณผ FSD ๊ตฌ์กฐ ๊ฐ์ ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค: |
| 7 | + |
| 8 | +- `pages` ํด๋์์ ๋ผ์ฐํ
๋ฐฉ์ ์ฐจ์ด |
| 9 | +- NextJS์์ `app` ํด๋์ ์ถฉ๋ ๋ฌธ์ ๋๋ ๋ถ์ฌ |
| 10 | + |
| 11 | +## FSD์ NextJS์ `ํ์ด์ง` ๋ ์ด์ด ๊ฐ ์ถฉ๋ {#pages-conflict} |
| 12 | + |
| 13 | +NextJS๋ ์ ํ๋ฆฌ์ผ์ด์
๋ผ์ฐํธ๋ฅผ ์ ์ํ๊ธฐ ์ํด `pages` ํด๋๋ฅผ ์ฌ์ฉํ๋ฉฐ, `pages` ํด๋ ๋ด์ ํ์ผ์ด URL๊ณผ ๋งคํ๋๋๋ก ์ค์ ํฉ๋๋ค. |
| 14 | +ํ์ง๋ง ์ด ๋ฐฉ์์ FSD(Folder Slice Design) `๊ฐ๋
์ ๋ง์ง๋ ์์ต๋๋ค`. ํนํ, NextJS์ ๋ผ์ฐํ
๋ฐฉ์์ผ๋ก๋ FSD์ ์ฌ๋ผ์ด์ค ๊ตฌ์กฐ๋ฅผ ํํํ๊ฒ ์ ์งํ๊ธฐ ์ด๋ ค์ด ์ ์ด ์์ต๋๋ค. |
| 15 | + |
| 16 | +### NextJS์ `pages` ํด๋๋ฅผ ํ๋ก์ ํธ ๋ฃจํธ ํด๋๋ก ์ด๋ํ๊ธฐ (๊ถ์ฅ) |
| 17 | + |
| 18 | +ํ๋ก์ ํธ ๋ฃจํธ์ `pages` ํด๋๋ฅผ ๋ฐฐ์นํ๊ณ , FSD ๊ตฌ์กฐ์ ๋ง์ถ ํ์ด์ง๋ค์ NextJS์ `pages` ํด๋๋ก ์ฎ๊น๋๋ค. |
| 19 | +์ด๋ ๊ฒ ํ๋ฉด `src` ํด๋ ๋ด์์ FSD ๊ตฌ์กฐ๋ฅผ ์ ์งํ ์ ์์ต๋๋ค. |
| 20 | + |
| 21 | +```sh |
| 22 | +โโโ pages # NextJS ํ์ด์ง ํด๋ |
| 23 | +โโโ src |
| 24 | +โ โโโ app |
| 25 | +โ โโโ entities |
| 26 | +โ โโโ features |
| 27 | +โ โโโ pages # FSD ํ์ด์ง ํด๋ |
| 28 | +โ โโโ shared |
| 29 | +โ โโโ widgets |
| 30 | +``` |
| 31 | + |
| 32 | +### FSD ๊ตฌ์กฐ ๋ด `pages` ํด๋ ์ด๋ฆ ๋ณ๊ฒฝํ๊ธฐ |
| 33 | + |
| 34 | +๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ FSD ๊ตฌ์กฐ ๋ด์์ `pages` ํด๋์ ์ด๋ฆ์ ๋ณ๊ฒฝํ์ฌ NextJS์ `pages` ํด๋์ ์ถฉ๋์ ํผํ ์๋ ์์ต๋๋ค. |
| 35 | +์๋ฅผ ๋ค์ด, `pages` ํด๋๋ฅผ `views`๋ก ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ฉด `src` ํด๋ ๋ด์ FSD ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ฉด์๋ NextJS์ ์๊ตฌ ์ฌํญ๊ณผ ์ถฉ๋ํ์ง ์๊ฒ ๋ฉ๋๋ค. |
| 36 | + |
| 37 | +```sh |
| 38 | +โโโ app |
| 39 | +โโโ entities |
| 40 | +โโโ features |
| 41 | +โโโ pages # NextJS ํ์ด์ง ํด๋ |
| 42 | +โโโ views # ์ด๋ฆ์ด ๋ณ๊ฒฝ๋ FSD ํ์ด์ง ํด๋ |
| 43 | +โโโ shared |
| 44 | +โโโ widgets |
| 45 | +``` |
| 46 | + |
| 47 | +์ด๋ฆ์ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ, ์ด๋ฅผ ํ๋ก์ ํธ์ README๋ ๋ด๋ถ ๋ฌธ์์ ๋ช
ํํ ๊ธฐ๋กํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ ๋ฌ๋๋๋ก ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ์ ["ํ๋ก์ ํธ ์ง์"][project-knowledge]์ ์ผ๋ถ๋ก ๋ฌธ์ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. |
| 48 | + |
| 49 | +## NextJS์์ `app` ํด๋ ๋ถ์ฌ ๋ฌธ์ {#app-absence} |
| 50 | + |
| 51 | +NextJS 13๋ฒ์ ์ดํ์์๋ ๋ช
์์ ์ธ `app` ํด๋๊ฐ ์์ผ๋ฉฐ, |
| 52 | +๋์ `_app.tsx` ํ์ผ์ด ๋ชจ๋ ํ์ด์ง๋ฅผ ๊ฐ์ธ๋ ์ปดํฌ๋ํธ ์ญํ ์ ํฉ๋๋ค. |
| 53 | + |
| 54 | +### `pages/_app.tsx` ํ์ผ์ app ๊ธฐ๋ฅ ๊ฐ์ ธ์ค๊ธฐ |
| 55 | + |
| 56 | +NextJS ๊ตฌ์กฐ์์ `app` ํด๋๊ฐ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด, `app` ํด๋ ๋ด์ `App` ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๊ณ , ์ด๋ฅผ `pages/_app.tsx`์ ๊ฐ์ ธ์ NextJS๊ฐ ์ฌ์ฉํ ์ ์๋๋ก ์ค์ ํ๋ฉด ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด: |
| 57 | + |
| 58 | +```tsx |
| 59 | +// app/providers/index.tsx |
| 60 | + |
| 61 | +const App = ({ Component, pageProps }: AppProps) => { |
| 62 | + return ( |
| 63 | + <Provider1> |
| 64 | + <Provider2> |
| 65 | + <BaseLayout> |
| 66 | + <Component {...pageProps} /> |
| 67 | + </BaseLayout> |
| 68 | + </Provider2> |
| 69 | + </Provider1> |
| 70 | + ); |
| 71 | +}; |
| 72 | + |
| 73 | +export default App; |
| 74 | +``` |
| 75 | + |
| 76 | +๊ทธ ๋ค์ `pages/_app.tsx` ํ์ผ์์ `App` ์ปดํฌ๋ํธ์ ํ๋ก์ ํธ ์ ์ญ ์คํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค: |
| 77 | + |
| 78 | +```tsx |
| 79 | +// pages/_app.tsx |
| 80 | + |
| 81 | +import 'app/styles/index.scss' |
| 82 | + |
| 83 | +export { default } from 'app/providers'; |
| 84 | +``` |
| 85 | + |
| 86 | +## App Router ์ฌ์ฉํ๊ธฐ {#app-router} |
| 87 | + |
| 88 | +NextJS 13.4 ๋ฒ์ ์์๋ App Router๊ฐ ์์ ํ๋์์ต๋๋ค. App Router๋ฅผ ์ฌ์ฉํ๋ฉด `pages` ํด๋ ๋์ `app` ํด๋๋ฅผ ํตํด ๋ผ์ฐํ
์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. |
| 89 | +FSD ์์น์ ์ค์ํ๊ธฐ ์ํด, NextJS์ `app` ํด๋๋ `pages` ํด๋์์ ์ถฉ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ๋ค๋ฃจ์ด์ผ ํฉ๋๋ค. |
| 90 | + |
| 91 | +์ด๋ฅผ ์ํด NextJS์ `app` ํด๋๋ฅผ ํ๋ก์ ํธ ๋ฃจํธ๋ก ์ด๋ํ๊ณ , FSD ํ์ด์ง๋ค์ `app` ํด๋๋ก ์ฎ๊ธฐ๋ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค. |
| 92 | +์ด๋ ๊ฒ ํ๋ฉด `src` ํด๋ ๋ด์์ FSD ํ๋ก์ ํธ ๊ตฌ์กฐ๋ฅผ ์ ์งํ ์ ์์ต๋๋ค. |
| 93 | +๋ํ, App Router์ Pages Router๊ฐ ํธํ๋๋ฏ๋ก `pages` ํด๋๋ฅผ ํ๋ก์ ํธ ๋ฃจํธ์ ์ถ๊ฐํ๋ ๊ฒ์ด ํ์ํฉ๋๋ค. |
| 94 | + |
| 95 | +``` |
| 96 | +โโโ app # NextJS app ํด๋ |
| 97 | +โโโ pages # NextJS pages ํด๋ |
| 98 | +โ โโโ README.md # ํด๋น ํด๋์ ๋ชฉ์ ๊ณผ ์ญํ ์ ๋ํ ์ค๋ช
|
| 99 | +โโโ src |
| 100 | +โ โโโ app # FSD app ํด๋ |
| 101 | +โ โโโ entities |
| 102 | +โ โโโ features |
| 103 | +โ โโโ pages # FSD pages ํด๋ |
| 104 | +โ โโโ shared |
| 105 | +โ โโโ widgets |
| 106 | +``` |
| 107 | + |
| 108 | +[][ext-app-router-stackblitz] |
| 109 | + |
| 110 | +## ๊ด๋ จ ํญ๋ชฉ {#see-also} |
| 111 | + |
| 112 | +- [(์ค๋ ๋) NextJS์ pages ๋๋ ํ ๋ฆฌ์ ๋ํ ํ ๋ก ](https://t.me/feature_sliced/3623) |
| 113 | + |
| 114 | +[project-knowledge]: /docs/about/understanding/knowledge-types |
| 115 | +[ext-app-router-stackblitz]: https://stackblitz.com/edit/stackblitz-starters-aiez55?file=README.md |
| 116 | + |
| 117 | + |
0 commit comments