NextJS와 함께 사용하기
NextJS에서도 FSD 아키텍처를 적용할 수 있지만, NextJS의 기본 프로젝트 구조와 FSD 원칙 간에 몇 가지 충돌이 발생할 수 있습니다.
주요 차이점
- NextJS의
pages
폴더와 FSD의pages
layer 간의 이름 충돌 - NextJS 13 이전 버전에서는 FSD의
app
layer에 해당하는 명확한 폴더 구조가 없음
FSD와 NextJS의 pages
layer 충돌
NextJS는 파일 시스템 기반 라우팅을 위해 pages
폴더를 사용하며, 해당 폴더 내 파일이 자동으로 라우트에 매핑됩니다.
그러나 이 방식은 FSD의 pages layer 개념과 충돌
하며, 특히 FSD에서 권장하는 평탄한(flat) slice 구조를 NextJS의 중첩 라우팅 방식에서 유지하기 어려운 문제가 있습니다.
NextJS의 pages
폴더를 루트 폴더로 이동 (권장)
가장 권장되는 방법은 NextJS의 pages
폴더를 프로젝트 루트에 배치하고, FSD 구조는 src
폴더 내에서 유지하는 것입니다.
이렇게 하면 NextJS의 라우팅 시스템을 그대로 활용하면서도 FSD 아키텍처를 온전히 적용할 수 있습니다.
├── pages # NextJS의 라우팅 시스템용 폴더
├── src
│ ├── app
│ ├── entities
│ ├── features
│ ├── pages # FSD의 pages layer
│ ├── shared
│ ├── widgets
FSD 구조 내 pages
폴더 이름 변경하기
다른 방법으로는 FSD의 pages
layer 이름을 변경하여 NextJS의 pages
폴더와의 충돌을 방지하는 것입니다.
예를 들어, pages
를 views
로 변경하면 NextJS의 라우팅 시스템과 FSD 구조를 동시에 유지할 수 있습니다.
├── app
├── entities
├── features
├── pages # NextJS 라우팅용 폴더
├── views # 이름이 변경된 FSD pages layer
├── shared
├── widgets
폴더 이름을 변경한 경우, 프로젝트의 README나 내부 문서에 이를 명확하게 기록하는 것이 중요합니다. 이러한 변경 사항은 "프로젝트 지식"의 일부로 문서화하여 팀원들이 쉽게 이해할 수 있도록 해야 합니다.
NextJS에서 FSD의 app
layer 구현하기
NextJS 13 이전 버전에서는 FSD의 app
layer에 해당하는 명확한 폴더 구조가 제공되지 않았습니다.
대신 pages/_app.tsx
파일이 애플리케이션의 진입점 역할을 하며, 전역 상태 및 레이아웃을 관리합니다.
pages/_app.tsx
에 app layer 기능 통합하기
FSD의 app
layer 개념을 NextJS에 적용하려면, app
폴더에 애플리케이션의 프로바이더와 레이아웃 구성을 정의한 후, 이를 pages/_app.tsx
에서 가져와 사용할 수 있습니다.
// app/providers/index.tsx
const App = ({ Component, pageProps }: AppProps) => {
return (
<Provider1>
<Provider2>
<BaseLayout>
<Component {...pageProps} />
</BaseLayout>
</Provider2>
</Provider1>
);
};
export default App;
그다음, pages/_app.tsx
에서 App
컴포넌트를 가져와 NextJS의 진입점으로 설정하고, 전역 스타일을 로드할 수 있습니다.
// pages/_app.tsx
import 'app/styles/index.scss'
export { default } from 'app/providers';
App Router 사용하기
NextJS 13.4 버전부터 정식 지원되는 App Router는 pages
폴더 대신 app
폴더를 통해 라우팅을 구현합니다.
FSD 아키텍처를 App Router와 함께 사용할 때도 앞서 설명한 것과 유사한 방식으로 구조를 설정할 수 있습니다.
NextJS의 app 폴더를 프로젝트 루트에 배치하고, FSD의 app layer는 src
폴더 내에서 유지하는 것이 좋습니다.
또한, App Router와 Pages Router는 함께 사용할 수 있으므로, 필요에 따라 두 라우팅 시스템을 모두 활용할 수도 있습니다.
├── app # NextJS의 App Router용 폴더
├── pages # NextJS의 Pages Router용 폴더 (선택적)
│ ├── README.md # 폴더의 용도 설명
├── src
│ ├── app # FSD의 app layer
│ ├── entities
│ ├── features
│ ├── pages # FSD의 pages layer
│ ├── shared
│ ├── widgets