# 프로젝트 구조 및 파일 배치 규칙

## 디렉토리 구조

```
src/
├── app/                          # Next.js App Router
│   ├── [locale]/                 # i18n (ko, en, ja)
│   │   ├── (auth)/               # 인증 페이지 (로그인 등)
│   │   │   └── login/
│   │   ├── (protected)/          # 보호된 라우트 (인증 필수)
│   │   │   ├── accounting/       # 회계
│   │   │   ├── approval/         # 전자결재
│   │   │   ├── board/            # 게시판
│   │   │   ├── construction/     # 시공
│   │   │   ├── customer-center/  # 고객센터
│   │   │   ├── dashboard/        # 대시보드
│   │   │   ├── hr/               # 인사
│   │   │   ├── master-data/      # 기준정보
│   │   │   ├── material/         # 자재
│   │   │   ├── outbound/         # 출고
│   │   │   ├── production/       # 생산
│   │   │   ├── quality/          # 품질
│   │   │   ├── reports/          # 리포트
│   │   │   ├── sales/            # 영업
│   │   │   ├── settings/         # 설정
│   │   │   ├── [...slug]/        # catch-all (미구현 메뉴)
│   │   │   └── layout.tsx        # 보호 레이아웃
│   │   ├── layout.tsx            # 루트 레이아웃 (i18n)
│   │   └── page.tsx              # / → /dashboard 리다이렉트
│   └── api/                      # API Routes
│       ├── proxy/[...path]/      # HttpOnly 쿠키 프록시
│       ├── auth/                 # 인증 엔드포인트
│       └── pdf/generate/         # PDF 생성
├── components/
│   ├── ui/                       # 기본 UI 컴포넌트 (shadcn/ui 기반)
│   ├── molecules/                # 조합 컴포넌트 (FormField, StatusBadge 등)
│   ├── organisms/                # 페이지 구성 블록 (PageHeader, DataTable 등)
│   ├── templates/                # 페이지 템플릿 (IntegratedListTemplateV2 등)
│   ├── layout/                   # 레이아웃 컴포넌트 (Sidebar, Header 등)
│   └── {domain}/                 # 도메인별 컴포넌트
│       ├── accounting/
│       ├── hr/
│       ├── production/
│       ├── quality/
│       └── ...
├── hooks/                        # 공통 Hooks
├── layouts/                      # AuthenticatedLayout
├── lib/                          # 유틸리티
│   ├── api/                      # API 통신 유틸리티
│   ├── auth/                     # 인증 유틸리티
│   ├── formatters.ts             # 포맷팅 함수
│   ├── print-utils.ts            # 인쇄 유틸리티
│   └── utils.ts                  # 기본 유틸리티 (cn 등)
├── stores/                       # Zustand 스토어
├── i18n/                         # 국제화 설정
├── types/                        # 공통 타입 정의
└── styles/                       # 글로벌 스타일
```

## 컴포넌트 계층

```
ui/          → 원자 컴포넌트 (Button, Input, Select ...)
molecules/   → 조합 컴포넌트 (FormField = Label + Input + Error)
organisms/   → 페이지 빌딩 블록 (PageHeader, DataTable, SearchFilter ...)
templates/   → 페이지 전체 템플릿 (IntegratedListTemplateV2)
{domain}/    → 도메인 전용 컴포넌트 (AccountingForm, QualityReport ...)
```

## 파일 배치 규칙

### 도메인 컴포넌트
```
src/components/{domain}/
├── {Feature}List.tsx          # 목록 컴포넌트
├── {Feature}Detail.tsx        # 상세/수정/등록 컴포넌트
├── {Feature}Modal.tsx         # 모달 컴포넌트
└── actions.ts                 # Server Actions
```

### 페이지 파일
```
src/app/[locale]/(protected)/{domain}/{feature}/
├── page.tsx                   # 목록 + mode=new 분기
├── [id]/
│   └── page.tsx               # 상세 + mode=edit 분기
└── actions.ts                 # (또는 components/{domain}/actions.ts)
```

### Server Actions 위치
- **우선**: `src/components/{domain}/actions.ts` (도메인별)
- **대안**: `src/app/[locale]/(protected)/{domain}/{feature}/actions.ts` (페이지별)

## 파일 네이밍

| 유형 | 네이밍 | 예시 |
|------|--------|------|
| 컴포넌트 | PascalCase | `VendorDetail.tsx` |
| 페이지 | `page.tsx` (Next.js 규칙) | `page.tsx` |
| Server Action | `actions.ts` | `actions.ts` |
| 유틸리티 | kebab-case | `query-params.ts` |
| Hook | camelCase + `use` 접두사 | `useColumnSettings.ts` |
| 타입 | `types.ts` 또는 인라인 | `types.ts` |
| 스키마 | `schema.ts` | `schema.ts` |

## 신규 파일 생성 전 체크리스트

- [ ] 유사 컴포넌트가 이미 있는지 `organisms/`, `molecules/` 확인
- [ ] 같은 도메인에 재사용 가능한 컴포넌트 확인
- [ ] dev/component-registry 페이지에서 검색
- [ ] 공통 UI 컴포넌트(`ui/`)로 해결 가능한지 확인
