Skip to main content

Command Palette

Search for a command to run...

Next.js v14 아키텍처(폴더구조)

Updated
•4 min read•View as Markdown
Next.js v14 아키텍처(폴더구조)
J

하루하루 꾸준히 자라고 있는 프론트엔드 개발자입니다. 내일배움캠프 리액트 튜터로 활동하고있습니다.

💡
Next.js 폴더구조(아키텍처)에 대해 정리했습니다.

Next.js v14 + MUI v5 셋팅에 이어서 폴더 구조(아키텍처)에 대해서 설명하려합니다.
저는 항상 프로젝트를 시작, 진행하면서 고민되는 포인트는 프로젝트 아키텍처를 어떻게 설계해 나가야 되는 것인가 대한 고민을 했었는데요.

프로젝트 규모에 따른 아키텍처 설계 기준을 정리해보려합니다. 일단 현재 셋팅하고있는 Next.js +. MUI프로젝트는 FSD(기능 분할 설계)를 활용할 계획입니다. 어떤기준으로 정한것인지 아래에 살펴보겠습니다.

전통적 아키텍처 (작은 프로젝트나 개인 프로젝트)


전통적인 아키텍처(폴더구조)는 제가 프로젝트에자주 사용하구조입니다.
이 구조는 재사용 가능한 컴포넌트, 전역 상태 관리, API 호출, 커스텀 훅, 상수, 타입, 스타일, 유틸리티 함수 등을 별도의 폴더로 구분하여 관심사를 분리하고 있습니다.

전통적인 아키텍처에는 눈에 띄는 단점이 있습니다. 가장 큰 단점은 컴포넌트 간의 암묵적인 연결과 모듈의 복잡성 때문에 프로젝트가 유지보수하기 어려워진다는 것입니다. 이 아키텍처의 단점은 시간이 흐를수록 더욱 분명해집니다. 프로젝트가 진화할수록 애플리케이션 아키텍처는 엉망진창이 되어 버립니다.

전통적인 아키텍처는 지속적인 유지보수가 없는 작은 프로젝트나 개인 프로젝트에는 적합합니다.
(저는 지금까지 회사에서 어떤 프로젝트간에 전통적인 아키텍처로 진행을 했었는데 프로젝트가 진화할수록 제 머리속의 복잡도도 진화하는것 같았습니다.ㅠ)

my-app/
│
├── src/                     
│   ├── components/             # 재사용 가능한 컴포넌트
│   │   ├── common/             # 전역적으로 사용되는 컴포넌트 (버튼, 헤더, 푸터 등)
│   │   └── Blog                # 블로그 페이지에서 사용되는 컴포넌트
│   │       ├── index.tsx           
│   │       ├── BlogContainer.tsx   
│   │       └── BlogContainer.stories.tsx
│   │
│   ├── store/                  # 전역 상태 관리 (예: Context API, Redux, recoil, zustand 등)
│   │
│   ├── app/                    # Next.js app 라우팅
│   │   └── page.tsx         
│   │   └── layout.tsx       
│   │
│   ├── api/                    # api와 관련된 로직
│   │
│   ├── hooks/                  # 커스텀 React 훅
│   │
│   ├── constants/              # 상수 값
│   │
│   ├── types/                  # 타입 (typescript 사용시)
│   │  
│   ├── styles/                 # 스타일 관련 파일(CSS, Tailwind 설정 등)
│   │  
│   └── utils/                  # 유틸리티 함수
│   │  
│   └── providers/              # provider컴포넌트 (Mui, tanstack-query, recoil 등등..)
│
...생략

FSD - Feature-Sliced Design (대규모 프로젝트)


전통적인 아키텍처가 아닌 FSD에 대해서 알아보겠습니다.
기능 분할 설계(FSD)의 과제 중 하나는 결합을 느슨하게 하고 응집력을 높이는 것입니다. FSD가 이러한 결과를 어떻게 달성하는지 이해하는 것은 중요합니다. 아래 인용을 참고해주세요.

OOP에서는 다형성(polymorphism), 캡슐화(encapsulation), 상속(inheritance) 및 추상화(abstraction) 와 같은 개념을 통해 이러한 문제들을 오랜 시간 동안 해결해 왔습니다. 이러한 개념들은 코드의 격리, 재사용성, 그리고 다양한 결과를 보장합니다. 이는 컴포넌트나 기능이 어떻게 사용되느냐에 따라 다른 결과를 얻을 수 있도록 합니다.

기능 분할 설계는 이러한 원칙들을 프런트엔드에 적용하는 데 도움을 줍니다.

추상화와 다형성은 레이어를 통해 달성됩니다. 낮은 레이어는 더 추상화 되어있기 때문에 더 높은 레이어에서 재사용될 수 있으며, 특정한 매개변수나 속성에 따라 컴포넌트나 기능이 다르게 작동할 수 있습니다.

캡슐화는 슬라이스와 세그먼트 외부에서 필요하지 않은 것을 격리시키는 공개 API를 통해 달성됩니다. 슬라이스의 내부 세그먼트에 대한 접근은 제한되며, 공개 API는 슬라이스 또는 세그먼트의 기능 및 컴포넌트에 접근할 수 있는 유일한 방법입니다.

상속 또한 레이어를 통해 달성됩니다. 더 높은 레이어는 낮은 레이어를 재사용할 수 있습니다

요약하자면 프로젝트 폴더구조를 레이어와, 슬라이스, 세그먼트로 구분하여 결합을 느슨하게 하고 응집력을 높인다는 것입니다. 어떻게? OOP 개념을 활용해서! 조금 더 자세한 사항은 FSD 참고사이트를 확인해주세요.

기능oop 개념 적용
레이어추상화, 다형성, 상속,
슬라이스캡슐화

저는 FSD의 모든 특징을 사용하진 않고 features, shared만을 사용해서 프로젝트를 진행하려합니다.
더 필요한 부분이 있다면 참고에 있는 글을 읽고 본인에게 맞는 프로젝트 구조를 적용하시면 됩니다!
그럼 다음 포스트는 Next.js 렌더링에 관해서 포스트해보겠습니다.

my-app/
│
├── src/                     
│   ├── features/            # 기능별 모듈 디렉토리
│   │   ├── auth/            # 인증 기능 (로그인, 회원가입 등)
│   │   │   ├── components/  # 인증 관련 컴포넌트
│   │   │   ├── hooks/       # 인증 관련 커스텀 훅
│   │   │   ├── api/         # 인증 관련 api
│   │   │   ├── pages/       # 인증 관련 페이지
│   │   │   ├── types/       # 인증 관련 타입 (typescript 사용시)
│   │   │   ├── constants/   # 인증 관련 상수 값
│   │   │   └── utils/       # 인증 관련 유틸리티 함수
│   │   │
│   │   ├── blog/            # 블로그 기능
│   │   │   ├── components/  # 블로그 관련 컴포넌트
│   │   │   ├── hooks/       # 블로그 관련 커스텀 훅
│   │   │   ├── api/         # 블로그 관련 api
│   │   │   ├── pages/       # 블로그 관련 페이지
│   │   │   ├── types/       # 블로그 관련 타입 (typescript 사용시)
│   │   │   ├── constants/   # 블로그 관련 상수 값
│   │   │   └── utils/       # 블로그 관련 유틸리티 함수
│   │   │
│   │   └── [other features] # 다른 기능들
│   │
│   ├── app/                 # Next.js app 라우팅
│   │   └── page.tsx         # features 내부의 pages와 연결
│   │   └── layout.tsx       
│   │
│   ├── shared/  
│       ├── components/          # 전역에서 사용되는 재사용 가능한 컴포넌트
│       ├── hooks/               # 전역에서 사용되는 커스텀 훅
│       ├── api/                 # 전역에서 사용되는 api
│       ├── utils/               # 전역 유틸리티 함수
│       ├── types/               # 전역에서 사용되는 타입 (typescript 사용시)
│       ├── constants/           # 전역에서 사용되는 상수 값
│       ├── store/               # 전역 상태 관리 (예: Context API, Redux, recoil, zustand 등)
│       └── styles/              # 전역 스타일
│       └── providers/           # 프로바이더 (예: MUI Provider, tanstack-query Provider 등등..)
│
...생략

참고


https://bluemiv.tistory.com/87

https://emewjin.github.io/feature-sliced-design/

More from this blog

프론트엔드 반응형 테스트 도구모음

💡 프론트엔드 개발을하면서 반응형 테스트를 좀 더 쉽게하기위해서 찾아본 것들입니다. Responsively APP 첫번째는 Responsively App입니다. 아래 화면처럼 모바일, 패드, 데스크탑을 3개의 화면을 동시에 키고 테스트해 볼 수 있습니다.그리고 오른쪽 상단에 있는 카메라 버튼을 누르면 각각의 화면을 캡쳐하는 기능도있습니다.개발하면서 혼자서 반응형 기기별로 테스트 해보기 좋습니다.홈페이지에 들어가서 각 pc환경에 맞게 다운로...

Jul 9, 20241 min read
프론트엔드 반응형 테스트 도구모음

History API를 사용하여 뒤로가기 막기 (Next.js)

사내 프로젝트에서 특정 페이지에서 뒤로가기 이벤트를 실행 시 모달을 띄우는 요구사항 구현을 정리하였습니다. History API란? MDNHistory API는 브라우저의 세션 기록(탭이나 프레임에서 현재 페이지가 로드된 기록)에 접근할 수 있는 기능을 제공합니다. 이를 통해 사용자는 뒤로 가기와 앞으로 가기, 그리고 히스토리 스택의 내용을 조작할 수 있습니다. 이 API는 메인 스레드(Window)에서만 사용할 수 있으며, Worker나 W...

Jul 8, 20248 min read
History API를 사용하여 뒤로가기 막기 (Next.js)

user-agent를 이용한 모바일만 접근하기

사내 프로젝트에서 회원가입페이지를 모바일 기기에서만 접근할 수 있도록 만들어달라는 요청이있어 구현과정을 정리해보았습니다. 프로젝트는 next.js v14.2버전으로 진행했습니다. User-agent란? 사용자 에이전트 (User Agent)란, 우리가 사용하는 웹 브라우저 속에 숨겨진 중요한 기능 중 하나를 말합니다. 간단히 말해 내가 어떤 OS를 쓰고 있고, 버전은 어떤 버전인지 웹 브라우저의 정보는 어떤 것인지 등을 담고 있는 번호판 같은 ...

Jul 3, 20244 min read
user-agent를 이용한 모바일만 접근하기

Next.js v14 App router + MUI v5

💡 Next.js 와 MUI 셋팅법에 대해 정리하였습니다. Node.js 설치 Next.js를 설치하기위해서는 Node.js 18.17 or later 버전이 필요합니다.Node.js는 Javascript로 작성된 프로그램을 운영체제 상에서 일반 애플리케이션 프로그램처럼 실행시켜주는 런타임입니다. Next.js를 사용해보기 위해서 설치해 봅니다. node.js 공식문서 https://nodejs.org/en LTS 다운로드 클릭합니다....

Jun 4, 20247 min read
Next.js v14 App router + MUI v5

GC_EE's blog

6 posts

효과적이고 효율적인 의사결정을 좋아하는 3년차 프론트엔드 엔지니어입니다.