Skip to content

Commit fb19087

Browse files
authored
docs: with-nextjs page translated into Korean (feature-sliced#745)
1 parent dd7be18 commit fb19087

File tree

1 file changed

+117
-0
lines changed

1 file changed

+117
-0
lines changed
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
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+
[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)][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

Comments
 (0)