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