# 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
