- _index.md: 문서 목록 및 버전 관리 - 01~09: 아키텍처, API패턴, 컴포넌트, 폼, 스타일, 인증, 대시보드, 컨벤션 - 10: 문서 API 연동 스펙 (api-specs에서 이관) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
5.3 KiB
5.3 KiB
01. 프로젝트 아키텍처
대상: 프론트엔드/백엔드/기획자 버전: 1.0.0 최종 수정: 2026-03-09
1. 기술 스택
| 영역 | 기술 | 버전 |
|---|---|---|
| 프레임워크 | Next.js (App Router) | 15.x |
| 런타임 | React | 19.x |
| 언어 | TypeScript | strict mode |
| UI 컴포넌트 | shadcn/ui (Radix UI 기반) | - |
| 스타일링 | Tailwind CSS | 4.x |
| 폼 관리 | react-hook-form + Zod | - |
| 상태관리 | React hooks (useState/useCallback/useMemo) | - |
| 토스트/알림 | sonner | - |
| 국제화 | next-intl | - |
| 모바일 | Capacitor (하이브리드 앱) | - |
| 백엔드 API | PHP Laravel (별도 프로젝트) | 12.x |
2. 프로젝트 특성
- 폐쇄형 ERP 시스템: 인증 필수, SEO 불필요, 오히려 노출 방지
- 모든 페이지 Client Component:
'use client'필수 (서버 컴포넌트 사용 금지) - 이유: HttpOnly 쿠키 기반 인증 → 서버 컴포넌트에서 쿠키 수정(토큰 갱신) 불가
3. 디렉토리 구조
src/
├── app/ # Next.js App Router
│ ├── [locale]/ # 다국어 라우팅 (ko, en)
│ │ ├── (protected)/ # 인증 필수 영역
│ │ │ ├── layout.tsx # AuthenticatedLayout (사이드바/헤더)
│ │ │ ├── accounting/ # 회계 도메인
│ │ │ ├── hr/ # 인사 도메인
│ │ │ ├── production/ # 생산 도메인
│ │ │ ├── orders/ # 영업/주문 도메인
│ │ │ ├── business/ # 경영/대시보드
│ │ │ └── dev/ # 개발 도구 (운영 비활성)
│ │ └── (auth)/ # 비인증 영역 (로그인 등)
│ └── api/
│ └── proxy/[...path]/ # API 프록시 (HttpOnly 쿠키 처리)
│
├── components/
│ ├── atoms/ # 최소 단위 (ScrollableButtonGroup 등)
│ ├── molecules/ # 조합 단위 (FormField 등)
│ ├── organisms/ # 페이지 구성 블록 (PageHeader, DataTable 등)
│ ├── templates/ # 페이지 레이아웃 틀
│ │ ├── UniversalListPage/ # 리스트 페이지 템플릿 (59+ 페이지 사용)
│ │ └── IntegratedDetailTemplate/ # 상세/폼 페이지 템플릿
│ ├── ui/ # shadcn/ui 기본 컴포넌트
│ └── {domain}/ # 도메인별 비즈니스 컴포넌트
│ ├── accounting/ # 회계 (입금, 출금, 전표 등)
│ ├── hr/ # 인사
│ ├── production/ # 생산
│ ├── orders/ # 영업
│ └── business/ # CEO 대시보드 등
│
├── hooks/ # 커스텀 훅
├── lib/
│ ├── api/ # API 통신 유틸리티 (핵심)
│ ├── utils/ # 범용 유틸리티
│ └── dashboard-invalidation.ts # 대시보드 갱신 시스템
│
├── middleware.ts # 인증/보안/봇 차단 미들웨어
└── types/ # 전역 타입 정의
4. 컴포넌트 계층 구조
atoms → molecules → organisms → templates → pages
| 계층 | 역할 | 예시 |
|---|---|---|
| atoms | HTML 확장, 단일 기능 | ScrollableButtonGroup, PhoneInput |
| molecules | atom 조합, 재사용 폼 필드 | FormField (Label+Input 통합) |
| organisms | 페이지 구성 블록 | PageHeader, DataTable, SearchableSelectionModal |
| templates | 페이지 뼈대 (config 기반) | UniversalListPage, IntegratedDetailTemplate |
| pages | app/ 라우트 + 도메인 컴포넌트 | page.tsx → {Domain}Component |
5. 데이터 흐름
[사용자 액션]
↓
[컴포넌트] → useCallback/useState
↓
[Server Action] ('use server')
↓
[executeServerAction / executePaginatedAction]
↓
[serverFetch → authenticatedFetch]
↓
[/api/proxy/...path] (Next.js API Route)
↓
[PHP Laravel Backend /api/v1/...]
- 컴포넌트에서 직접
fetch()금지 - 모든 데이터 요청은 Server Action → API 프록시 → 백엔드 경로
- 인증 토큰은 HttpOnly 쿠키에 저장, 프록시에서 자동 주입
6. 관련 프로젝트
| 프로젝트 | 경로 | 역할 |
|---|---|---|
| sam-react-prod | sam-next/sma-next-project/sam-react-prod | Next.js 프론트엔드 (현재) |
| sam-api | sam-api/sam-api | PHP Laravel 백엔드 API |
| sam-design | sam-design/sam-design | React 디자인 시스템 (레거시) |
| sam-docs | sam-docs | 프로젝트 문서 (현재 문서) |
7. 주요 설계 결정
| 결정 | 이유 |
|---|---|
| Client Component Only | 폐쇄형 ERP, 쿠키 수정 필요 |
| API Proxy Pattern | HttpOnly 쿠키 보안 유지 |
| Config-Driven Templates | 59+ 리스트 페이지 일관성 |
| Server Actions | 타입 안전 + 쿠키 접근 가능 |
| Tailwind + shadcn/ui | 빠른 개발 + 일관된 디자인 |
| Zod (신규 폼만) | 기존 폼 안정성 유지하면서 점진 적용 |