반응형
Next.js 앱에서 폴더 구조 및 코드 아키텍처 설계 전략 – 유지보수성과 확장성을 고려한 실전 가이드
Next.js로 앱을 개발할 때 초기에 아무렇게나 구조를 짜면, 프로젝트가 커질수록 코드가 얽히고 설켜 유지보수가 힘들어집니다.
이번 글에서는 Next.js 앱을 처음부터 잘 설계하고, 협업, 테스트, 기능 확장까지 고려한 폴더 구조와 아키텍처 전략을 소개합니다.
- ✅ App Router vs Pages Router 구조 설계
- ✅ 폴더 네이밍 및 depth 기준
- ✅ 컴포넌트 분리 전략 (UI/Container/Feature)
- ✅ 상태관리, API, 유틸리티 위치
- ✅ 실전 예시와 팀 기반 아키텍처 패턴
1. 📂 Next.js 폴더 구조 기본 이해
✅ App Router vs Pages Router 비교
기능 | Pages Router | App Router |
---|---|---|
기반 디렉토리 | /pages |
/app |
라우팅 방식 | 파일 기반 | 폴더 + 파일 조합 |
레이아웃 | 각 페이지 독립 | 중첩 레이아웃 가능 |
서버 컴포넌트 | 불가 | 기본 지원 (React Server Component) |
➡️ App Router는 Next.js 13 이후 공식 권장 구조이며, 대규모 앱, SSR 기반 서비스에 적합합니다.
2. 🧱 기본 폴더 구조 예시 (App Router 기준)
/app
├── layout.tsx
├── page.tsx
├── dashboard/
│ ├── layout.tsx
│ ├── page.tsx
│ └── settings/
│ └── page.tsx
├── login/
│ └── page.tsx
/src
├── components/
├── features/
├── hooks/
├── lib/
├── services/
├── store/
├── styles/
└── types/
✅ 핵심 역할
/app
: 라우팅 및 페이지 구조/components
: 공통 UI 컴포넌트/features
: 도메인 기능별 폴더/lib
: 외부 유틸리티, API client/services
: API 요청 모듈/store
: 상태 관리 (예: Zustand, Redux 등)
3. 🧩 컴포넌트 분리 전략 – UI, 기능, 컨테이너 구분
✅ 컴포넌트의 분리 기준
- UI 컴포넌트: 디자인/뷰 중심, props만 받음
- Container 컴포넌트: 상태, 비즈니스 로직 포함
- Feature 컴포넌트: 특정 도메인 기능 단위 (예: LoginForm, ProductCard)
📦 구조 예시
/components
├── ui/
│ ├── Button.tsx
│ └── Input.tsx
├── layout/
│ ├── Header.tsx
│ └── Sidebar.tsx
/features
├── auth/
│ ├── LoginForm.tsx
│ └── SignupForm.tsx
├── post/
│ ├── PostList.tsx
│ └── PostCard.tsx
➡️ 이 구조는 재사용성과 역할 명확성을 높여줍니다.
4. 🔗 상태 관리 계층의 위치 – 전역 vs 로컬 vs 서버
✅ 상태 관리의 세 가지 범위
- Local state: useState, useReducer
- Global state: Zustand, Redux, Jotai 등
- Server state: React Query, SWR 등
📌 상태 저장소 위치
/store
├── auth.ts
├── user.ts
└── modal.ts
✅ 추천: 도메인 단위로 쪼개서 저장
- 기능이 커질수록 전역 상태도 모듈화 필요
- 공통 상태는 /store/common.ts 처럼 구분
🧠 팁
- 상태는 최소한으로 전역화해야 합니다
- 가능하면 컴포넌트 내에 국소화된 상태 우선
5. 🌐 API 계층 설계 – 네트워크 분리와 모듈화
✅ 폴더 구조 예시
/services
├── apiClient.ts
├── auth.ts
├── post.ts
✅ axios 인스턴스 분리
// apiClient.ts
import axios from 'axios';
const apiClient = axios.create({
baseURL: process.env.NEXT_PUBLIC_API_URL,
withCredentials: true,
});
export default apiClient;
✅ 서비스별 API 함수 분리
// services/auth.ts
import apiClient from './apiClient';
export const login = (data) => apiClient.post('/auth/login', data);
export const logout = () => apiClient.post('/auth/logout');
➡️ API 호출과 비즈니스 로직을 컴포넌트에서 분리해 테스트 용이성과 유지보수성을 크게 높일 수 있습니다.
6. 🧭 디렉토리 depth 기준 – 언제 나눌 것인가?
✅ 깊이를 나누는 기준
- 파일 수가 5개 이상이거나
- 두 개 이상의 하위 역할(예: 컴포넌트 + 스타일)이 생기면 분리
📌 구조 예시
/features/product
├── components/
│ ├── ProductList.tsx
│ └── ProductCard.tsx
├── hooks/
│ └── useProducts.ts
├── services/
│ └── productApi.ts
└── types/
└── product.ts
➡️ 폴더 depth는 무조건 얕게 만드는 것보다, 의미 단위로 쪼개서 역할이 명확해지게 만드는 것이 중요합니다.
7. 🧾 네이밍 규칙 – 통일감은 생산성과 직결된다
✅ 컴포넌트 네이밍
PascalCase
사용 (예: ProductCard.tsx)- 폴더명과 컴포넌트명이 동일할 경우 → index.tsx 권장
/features/login/LoginForm/index.tsx
✅ 상태, 훅, API 네이밍
use[기능명]
: useAuth, usePost[기능]Store
: authStore, modalStore[기능]Api
: userApi, postApi
✅ 파일명 규칙
- 전역은 kebab-case 또는 camelCase 혼용 가능
- 폴더와 파일은 동일한 기준 유지
8. 👥 팀 협업을 위한 아키텍처 가이드
✅ 팀 프로젝트에서 자주 발생하는 문제
- 각자 다른 방식의 컴포넌트 구조
- 중복된 API 호출 함수
- 전역 상태가 한곳에 몰림
✅ 협업 시 필수 정리 항목
- 공식 폴더 구조 문서 작성
- 컴포넌트 작성 규칙 공유 (예: props, 로딩, 에러 처리 방식)
- 상태 저장 위치 기준 설정
- 공통 API, UI, 훅 분리 방식 명시
📌 Lint & Convention 도구 추천
eslint
,prettier
absolute import
설정 (@/components
등)
// tsconfig.json
"paths": {
"@/components/*": ["src/components/*"],
"@/features/*": ["src/features/*"]
}
➡️ 경로, 폴더, 상태 설계까지 일관되게 관리하면 누가 코드를 짜도 읽기 쉬운 구조가 완성됩니다.
🧠 마무리 – 설계가 곧 생산성이다
✅ 핵심 요약
- App Router 구조에 맞게 폴더와 기능을 모듈화
- UI/Feature/Container 단위로 컴포넌트 구분
- 상태와 API는 도메인 단위로 분리
- 네이밍과 구조 규칙은 팀과 공유
✅ 실무에서의 팁
- 모든 기능은 작고 독립된 단위로
- 사용자 UX와 유지보수를 함께 고려한 설계
- 폴더 구조도 UI의 일관성처럼 '디자인'해야 함
긴 글 읽어주셔서 감사합니다! 공감, 댓글, 공유로 응원해주시면 다음 글 제작에 큰 힘이 됩니다 🙌
반응형
'일상이 개발' 카테고리의 다른 글
Next.js 접근 제어 & 권한 분기 완전 정복 – 로그인 보호부터 Role 기반 렌더링까지 실전 가이드 (0) | 2025.05.17 |
---|---|
Next.js 폼 UX 최적화 전략 – react-hook-form, validation, 에러 메시지까지 실전 설계 완전 정복 (0) | 2025.05.16 |
Next.js 인증 상태 유지 전략 완전 정복 – 세션, 토큰, 쿠키 기반의 UX + 보안 설계 가이드 (0) | 2025.05.14 |
Next.js 다국어(i18n) 전략 완전 정복 – locale 라우팅부터 번역 최적화까지 실전 가이드 (0) | 2025.05.13 |
Next.js 로그인/회원가입 UX 최적화 전략 – 인증 흐름부터 에러 처리, 리디렉션까지 완벽 가이드 (0) | 2025.05.12 |