# 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 (신규 폼만) | 기존 폼 안정성 유지하면서 점진 적용 |
