Files
sam-docs/system/api-analysis-report.md
김보곤 87b1ed08d7 docs: [system] API 구조 분석 및 개선 로드맵 문서 추가
- 프로젝트 규모 정량 분석 (1,400 EP, 261 모델, 202 서비스)
- 아키텍처 3대 원칙, 요청 처리 흐름, 표준 테이블 구조
- 기술 부채 8건 식별 (D1~D8)
- P1~P3 우선순위별 개선 로드맵 수립
- INDEX.md에 문서 등록
2026-03-14 08:37:03 +09:00

290 lines
12 KiB
Markdown

# SAM API 구조 분석 및 개선 로드맵
> **작성일**: 2026-03-14
> **상태**: 분석 완료, 개선 진행중
> **작성자**: R&D 개발실장
> **대상**: `/home/aweso/sam/api` (Laravel 12 REST API)
---
## 1. 개요
### 1.1 목적
SAM API의 현재 구조를 정량적으로 분석하고, 기술 부채를 식별하여 우선순위별 개선 로드맵을 수립한다. R&D 개발실장이 백엔드 전반을 파악하고 체계적으로 품질을 끌어올리기 위한 기준 문서이다.
### 1.2 분석 기준일
- 코드베이스: 2026-03-14 기준 develop 브랜치
- Claude Code v2.1.75 (Opus 4.6)로 자동 분석
---
## 2. 프로젝트 규모
### 2.1 전체 수치
| 항목 | 수량 | 비고 |
|------|------|------|
| **엔드포인트** | ~1,400개 | 19개 도메인 라우트 파일 |
| **컨트롤러** | 152개 | V1 144개 + Admin 1개 + Equipment 7개 |
| **서비스** | 202개 | 22개 도메인 폴더 + 루트 98개 |
| **모델** | 261개 | 32개 도메인 폴더 |
| **FormRequest** | 305개 | 42개 도메인 폴더 |
| **마이그레이션** | 545개 | 메인 523 + 통계 22 |
| **미들웨어** | 10개 | |
| **아티산 커맨드** | 39개 | |
| **옵저버** | 15개 | 감사/이벤트 처리 |
| **Swagger 문서** | 110개 | OpenAPI 스펙 |
| **테스트** | 14개 | Feature 11 + Unit 3 |
| **PHP 코드** | 179,010줄 | |
### 2.2 도메인별 엔드포인트 분포
| 도메인 | 엔드포인트 | 비중 | 핵심 기능 |
|--------|:---------:|:----:|----------|
| Finance | 271 | 19% | 카드, 계좌, 입출금, 급여, 세금계산서, 바로빌 |
| HR | 153 | 11% | 부서, 직원, 근태, 휴가, 전자결재, 시공관리 |
| Sales | 135 | 10% | 거래처, 견적, 입찰, 수주, 단가, 데모테넌트 |
| Common | 134 | 10% | 메뉴, 권한, 카테고리, 대시보드, 알림 |
| Inventory | 85 | 6% | 품목, BOM, 자재, 입고, 배차 |
| Boards | 84 | 6% | 게시판, 품목기준관리(ItemMaster) |
| Production | 73 | 5% | 공정, 작업지시, 작업실적, 검사 |
| Design | 61 | 4% | 모델, 버전, BOM 템플릿, 계산 엔진 |
| Quality | 36 | 3% | 품질관리, 검사, 인증 |
| Users | 34 | 2% | 프로필, 역할, 테넌트 전환 |
| Admin | 29 | 2% | 테넌트, 메뉴, FCM, API Key |
| Equipment | 27 | 2% | 설비, 정비 |
| Tenants | 23 | 2% | 테넌트 설정, 구독 |
| Files | 21 | 2% | 업로드, 저장 |
| Documents | 18 | 1% | 템플릿, 생성 |
| ESign | 18 | 1% | 전자서명 워크플로우 |
| Auth | 9 | 1% | 로그인, 토큰 |
| Stats | 9 | 1% | 통계/리포트 |
| Audit | 7 | 0.5% | 감사 로그 |
---
## 3. 아키텍처 분석
### 3.1 3대 설계 원칙
```
┌─────────────────────────────────────────────────────┐
│ 1. Service-First 패턴 │
│ Controller (라우팅만) → Service (로직) → Model │
│ Controller에 비즈니스 로직 작성 금지 │
├─────────────────────────────────────────────────────┤
│ 2. Multi-Tenant (tenant_id 기반) │
│ BelongsToTenant 트레이트 → 자동 WHERE 필터링 │
│ 1명 사용자가 여러 테넌트 접근 가능 │
├─────────────────────────────────────────────────────┤
│ 3. 5계층 보안 │
│ Nginx → Rate Limit → API Key → Sanctum → 권한 │
│ 메뉴 기반 RBAC (7가지 권한 타입) │
└─────────────────────────────────────────────────────┘
```
### 3.2 요청 처리 흐름
```
HTTP Request
Nginx (악성 경로 차단, Rate Limit)
Middleware Stack
├─ ApiKeyMiddleware (X-API-KEY 검증)
├─ ApiVersionMiddleware (v1/v2 폴백)
├─ auth:sanctum (Bearer 토큰)
├─ PermMapper (메뉴→권한 매핑)
├─ CheckPermission (RBAC 체크)
└─ SetAuditSessionVariables (감사 추적)
Controller (FormRequest 타입힌팅 → 자동 검증)
Service (비즈니스 로직)
├─ tenantId() / apiUserId() 자동 제공
└─ Model (BelongsToTenant 자동 필터링)
ApiResponse::handle() → JSON { success, message, data }
```
### 3.3 표준 테이블 구조
```sql
id BIGINT PK
tenant_id BIGINT FK -- 멀티테넌트 격리
-- 비즈니스 컬럼 (FK, WHERE/ORDER BY 대상만)
options JSON NULL -- 유연한 확장 속성
created_by BIGINT FK -- 감사 추적
updated_by BIGINT FK
deleted_by BIGINT FK
created_at TIMESTAMP
updated_at TIMESTAMP
deleted_at TIMESTAMP -- SoftDeletes
```
### 3.4 핵심 트레이트
| 트레이트 | 역할 | 적용 범위 |
|---------|------|----------|
| `BelongsToTenant` | tenant_id 자동 필터링 (Global Scope) | 모든 테넌트 모델 |
| `Auditable` | created_by, updated_by, deleted_by 자동 기록 | 모든 비즈니스 모델 |
| `ModelTrait` | is_active 스코프, 날짜 처리 | 모든 모델 |
| `SoftDeletes` | 논리 삭제 (물리 삭제 금지) | 모든 모델 |
### 3.5 주요 파일 위치
```
/home/aweso/sam/api/
├── app/
│ ├── Http/Controllers/Api/V1/ ← 컨트롤러 (144개)
│ ├── Http/Middleware/ ← 미들웨어 (10개)
│ ├── Http/Requests/ ← FormRequest (305개)
│ ├── Models/ ← 모델 (261개, 32개 폴더)
│ ├── Services/ ← 서비스 (202개, 22개 폴더)
│ ├── Traits/ ← 공용 트레이트 (6개)
│ ├── Observers/ ← 옵저버 (15개)
│ ├── Console/Commands/ ← 아티산 커맨드 (39개)
│ └── Swagger/v1/ ← API 문서 (110개)
├── routes/api/v1/ ← 도메인별 라우트 (19개)
├── database/migrations/ ← 마이그레이션 (545개)
├── config/ ← 설정 (24개)
└── tests/ ← 테스트 (14개)
```
---
## 4. 이관 현황
### 4.1 전체 현황
| 상태 | 수량 | 설명 |
|------|:----:|------|
| 이관 완료 | 24개 | API + React 모두 구현됨 |
| 이관 대상 (P1) | 15개 | 자금일정, 정산, VAT, 채번, 전자서명 등 |
| React UI만 필요 | 8개 | API 완료, UI 미구현 (QMS, 설비 등) |
| MNG 유지 | 11개 | PMIS, 신용평가, Dev Tools 등 |
### 4.2 이관 대상 우선순위
| Phase | 대상 | 우선순위 |
|-------|------|:-------:|
| Phase 1 | 자금일정, 일일자금, 정산, VAT, 채번, 전자서명 | 🔴 P1 |
| Phase 2 | 견적수식, 판매수수료, 전자서명 고도화 | 🟡 P2 |
| Phase 3 | QMS UI, 설비 UI, 요금제 UI | 🟡 P2 |
| Phase 4 | 휴가정책 자동부여, 통합근태 | 🟢 P3 |
---
## 5. 기술 부채 및 개선 로드맵
### 5.1 식별된 기술 부채
| ID | 영역 | 현황 | 영향도 | 우선순위 |
|:--:|------|------|:------:|:-------:|
| D1 | **테스트 부재** | 14개 (1,400 EP 대비 1%) | 🔴 높음 | P1 |
| D2 | **N+1 쿼리** | 일부 Service에서 반복 쿼리 | 🔴 높음 | P1 |
| D3 | **마이그레이션 정리** | 545개, 순서/네이밍 혼재 | 🟡 중간 | P2 |
| D4 | **i18n 미완** | 일부 에러에 직접 문자열 잔존 | 🟡 중간 | P2 |
| D5 | **FK 제약 과다** | Production 도메인 중심 | 🟡 중간 | P2 |
| D6 | **통계 DB 동기화** | sam_stat 수동/불완전 | 🟢 낮음 | P3 |
| D7 | **API 문서 최신화** | 110개 중 일부 outdated | 🟢 낮음 | P3 |
| D8 | **Rate Limiting** | 10회/분 고정, 도메인별 미세분화 | 🟢 낮음 | P3 |
### 5.2 개선 로드맵
```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔴 P1 즉시 착수 (품질 기반 확보)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[D1] 테스트 커버리지 확충
→ 핵심 도메인(Finance, Sales, HR) Feature 테스트 우선
→ 목표: 주요 CRUD + 비즈니스 로직 커버
[D2] N+1 쿼리 최적화
→ 대형 컨트롤러 5개 우선 점검
(ItemsBomController, WorkOrderController,
BarobillCardTransactionController,
ApprovalController, QuoteController)
→ Service에서 with() eager load 적용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🟡 P2 단기 개선 (안정성 강화)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[D3] 마이그레이션 정리
→ squash 또는 네이밍 표준화
→ MNG 전용 마이그레이션 분리 확인
[D4] i18n 완성
→ 직접 문자열 → message key 전환
→ grep으로 잔존 문자열 스캔
[D5] FK 제약 최적화
→ Production 도메인 FK 관계 정리
→ 삭제 순서 복잡도 감소
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🟢 P3 중장기 (확장성)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[D6] 통계 DB 실시간화
→ Event Sourcing 또는 CDC 검토
[D7] Swagger 문서 최신화
→ 자동 생성 파이프라인 개선
[D8] Rate Limiting 동적화
→ 테넌트/도메인별 차등 적용
```
### 5.3 강점 (유지해야 할 것)
```
✅ Service-First 패턴 — 일관된 비즈니스 로직 분리
✅ 5계층 보안 — Nginx ~ Permission까지 다층 방어
✅ BelongsToTenant — 멀티테넌트 자동 격리, 데이터 누출 방지
✅ Auditable — 모든 변경사항 자동 추적
✅ options JSON — 스키마 변경 없이 유연한 확장
✅ FormRequest 분리 — 305개 검증 클래스, 입력 검증 표준화
✅ ApiResponse::handle() — 통일된 응답 포맷
```
---
## 6. 진행 추적
> 아래 체크리스트로 개선 작업 진행 상황을 추적한다.
### P1 (즉시)
- [ ] [D1] 테스트 커버리지 확충 — 핵심 도메인 Feature 테스트
- [ ] [D2] N+1 쿼리 최적화 — 대형 컨트롤러 5개 점검
### P2 (단기)
- [ ] [D3] 마이그레이션 정리
- [ ] [D4] i18n 직접 문자열 제거
- [ ] [D5] FK 제약 최적화
### P3 (중장기)
- [ ] [D6] 통계 DB 실시간화
- [ ] [D7] Swagger 문서 최신화
- [ ] [D8] Rate Limiting 동적화
---
## 관련 문서
- [시스템 아키텍처](overview.md)
- [API 서버 구조](api-structure.md)
- [API 개발 규칙](../dev/standards/api-rules.md)
- [이관 현황](migration-status.md)
- [DB 스키마](database/README.md)
- [보안 정책](security-policy.md)
- [품질 체크리스트](../dev/standards/quality-checklist.md)
---
**최종 업데이트**: 2026-03-14