Files
sam-docs/system/api-structure.md
권혁성 d4e5f62413 docs: [종합정비] Phase 1 시스템 현황 문서 14개 작성
- system/overview.md: 전체 아키텍처 개요
- system/api-structure.md: API 구조 (220 모델, 1027 엔드포인트, 18 라우트 도메인)
- system/react-structure.md: React 구조 (249 페이지, 612 컴포넌트)
- system/mng-structure.md: MNG 구조 (171 컨트롤러, 436 Blade 뷰)
- system/docker-setup.md: Docker 7 컨테이너 구성
- system/database/README.md + 9개 도메인 스키마 (270+ 테이블)
  - core, hr, sales, production, finance, boards, files, system, erp-analysis

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-27 18:03:13 +09:00

208 lines
6.7 KiB
Markdown

# API 서버 구조 현황
> **최종 갱신**: 2026-02-27
> **기술 스택**: Laravel 12 + PHP 8.4 + Sanctum + Spatie Permission + L5-Swagger
---
## 1. 프로젝트 규모
| 항목 | 수량 |
|------|------|
| API 엔드포인트 | ~1,027 |
| 컨트롤러 | 131 |
| 모델 | 220 |
| 서비스 | 180 |
| FormRequest | 271 |
| 미들웨어 | 9 |
| Swagger 문서 | 110 |
| 마이그레이션 | 459 |
| 설정 파일 | 22 |
---
## 2. 디렉토리 구조
```
app/
├── Http/
│ ├── Controllers/Api/
│ │ ├── Admin/ 글로벌 메뉴 관리
│ │ └── V1/ 메인 API (131개)
│ │ ├── Admin/ FCM 관리
│ │ ├── Audit/ 감사 로그
│ │ ├── Construction/ 시공 (작업지시, 결과, 설정)
│ │ ├── Design/ 설계 (모델, 버전, BOM 템플릿)
│ │ ├── Documents/ 문서 (템플릿, 생성)
│ │ ├── ESign/ 전자서명
│ │ ├── ItemMaster/ 품목 마스터 (9개)
│ │ └── [104 Root Controllers]
│ ├── Middleware/ 9개
│ └── Requests/ 271개 (FormRequest)
├── Models/ 220개 (32개 도메인)
├── Services/ 180개
├── Swagger/v1/ 110개 (OpenAPI 문서)
├── Helpers/ 4개
├── Observers/ 5개
├── Traits/ 모델/감사 트레이트
└── Exceptions/ 2개
```
---
## 3. 라우트 도메인별 엔드포인트
| 라우트 파일 | 엔드포인트 | 주요 기능 |
|------------|-----------|----------|
| finance.php | 180 | 재무 (결제, 청구서, 세금계산서, 급여) |
| hr.php | 141 | 인사 (급여, 근태, 휴가, 대출) |
| common.php | 128 | 공통 (코드, 분류, 카테고리, 필드) |
| sales.php | 122 | 영업 (수주, 견적, 거래처, 출하) |
| boards.php | 84 | 게시판 (동적 필드 지원) |
| inventory.php | 79 | 재고 (자재, 입고, 창고) |
| production.php | 67 | 생산 (작업지시, 작업실적, 공정) |
| design.php | 61 | 설계 (모델, 버전, BOM 템플릿) |
| users.php | 34 | 사용자 (프로필, 역할, 초대) |
| admin.php | 29 | 관리자 (테넌트, 메뉴, FCM) |
| tenants.php | 23 | 테넌트 (전환, 프로필) |
| files.php | 20 | 파일 (업로드, 저장, 조회) |
| esign.php | 18 | 전자서명 워크플로우 |
| documents.php | 17 | 문서 (템플릿, 생성) |
| auth.php | 9 | 인증 (로그인, 로그아웃, 등록) |
| audit.php | 7 | 감사 (로그, 이력) |
| stats.php | 5 | 통계/리포트 |
| app.php | 3 | 앱 버전, 상태 체크 |
| **합계** | **~1,027** | |
```
routes/
├── api.php 메인 API 진입점
└── api/v1/
├── admin.php
├── app.php
├── audit.php
├── auth.php
├── boards.php
├── common.php
├── design.php
├── documents.php
├── esign.php
├── files.php
├── finance.php
├── hr.php
├── inventory.php
├── production.php
├── sales.php
├── stats.php
├── tenants.php
└── users.php
```
---
## 4. 미들웨어
| 미들웨어 | 역할 |
|---------|------|
| ApiKeyMiddleware | API 키 인증 + Sanctum 토큰 검증 |
| ApiRateLimiter | API 속도 제한 |
| ApiVersionMiddleware | API 버전 라우팅 |
| CheckPermission | 권한 기반 접근 제어 |
| CheckSwaggerAuth | Swagger UI 인증 |
| CorsMiddleware | CORS 정책 |
| LogApiRequest | API 요청/응답 로깅 |
| PermMapper | 권한 매핑 변환 |
| SetAuditSessionVariables | 감사 세션 컨텍스트 |
---
## 5. 아키텍처 패턴
### 인증 체계
- **글로벌**: API Key (모든 요청)
- **사용자**: Sanctum Bearer Token (Access 120분, Refresh 7일)
- **내부**: HMAC (`INTERNAL_EXCHANGE_SECRET`, mng ↔ api)
### 응답 포맷
```json
{
"success": true,
"message": "message.key.from.lang",
"data": { ... }
}
```
- `ApiResponse::handle()` 헬퍼로 통일
### 핵심 패턴
- **Service-First**: 비즈니스 로직 → Service 클래스
- **FormRequest 필수**: Controller에서 직접 검증 금지
- **BelongsToTenant**: 모든 비즈니스 모델에 tenant_id 격리
- **Auditable**: created_by, updated_by, deleted_by 자동 기록
- **SoftDeletes**: 대부분의 엔티티 논리 삭제
### 헬퍼
| 헬퍼 | 역할 |
|------|------|
| ApiResponse | JSON 응답 포맷 통일 |
| ItemTypeHelper | 품목 분류 로직 |
| Legacy5130Calculator | 레거시 5130 연동 계산 |
| TenantCodeGenerator | 테넌트별 코드 생성 |
---
## 6. 주요 의존성
| 패키지 | 버전 | 용도 |
|--------|------|------|
| laravel/framework | ^12.0 | 코어 프레임워크 |
| laravel/sanctum | ^4.0 | API 토큰 인증 |
| spatie/laravel-permission | ^6.21 | RBAC 권한 관리 |
| darkaonline/l5-swagger | ^9.0 | Swagger/OpenAPI 문서 |
| maatwebsite/excel | ^3.1 | Excel 가져오기/내보내기 |
| google/auth | ^1.49 | Google 인증 |
| doctrine/dbal | ^4.3 | DB 추상화 |
---
## 7. 설정
```
config/
├── app.php 앱 메타데이터
├── audit.php 감사 로깅 (13개월 보존)
├── auth.php 인증 (Sanctum, API 키)
├── authz.php 인가 + 권한
├── cors.php CORS 정책
├── custom.php 커스텀 앱 설정
├── database.php DB 연결 (samdb, sam_stat)
├── fcm.php Firebase Cloud Messaging
├── l5-swagger.php Swagger 설정
├── pagination.php 페이지네이션 기본값
├── permission.php Spatie Permission
├── products.php 제품별 설정
├── sanctum.php Sanctum 토큰 설정
└── [기타 8개]
```
---
## 8. api ↔ mng ↔ react 관계
```
react (dev.sam.kr) ──Server Actions──→ api (api.sam.kr) ←──DB 공유──→ mng (mng.sam.kr)
MySQL (samdb)
```
- **api**: DB 마이그레이션 유일 관리자 (459개). 모든 테이블 정의
- **mng**: 자체 모델 (185개), 마이그레이션 없음. 동일 DB 직접 접근
- **react**: Server Actions로 api 호출. DB 직접 접근 없음
- **내부 통신**: HMAC 기반 `INTERNAL_EXCHANGE_SECRET` (mng → api)
- **파일 공유**: mng가 api의 `storage/app/tenants` 마운트
### Swagger 문서
- 110개 OpenAPI 문서 파일
- 도메인별 태그 구성
- 보안 스키마: ApiKeyAuth + BearerAuth (Sanctum)
- URL: `api.sam.kr/api/documentation`