Files
sam-docs/plans/archive/api-analysis-report.md
권혁성 06a4c798ec chore: 완료 계획 문서 22개 archive 이동 및 인덱스 업데이트
- 완료된 계획 문서 22개를 plans/archive/로 이동
  - tracked 16개 (git mv): bending-lot-pipeline, docs-update, fcm-notification 등
  - untracked 6개 (mv): bending-worklog, formula-engine, mng-item 등
- index_plans.md 전면 업데이트
  - 진행중 44개 / 완료 37개 현황 반영
  - 각 문서별 실제 진행률 기재 (0%~94%)
  - 카테고리별 재정리 (견적/생산/품목/문서/마이그레이션/시스템/UI)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 10:02:47 +09:00

434 lines
18 KiB
Markdown

# SAM API 전체 분석 보고서
> **작성일**: 2026-01-29
> **목적**: api/, mng/, react/ 프로젝트 간 API 중복/통합/미사용 분석 및 관계 정리
> **기준 문서**: api/routes/api/v1/*.php, mng/routes/api.php, mng/routes/web.php, react/src/lib/api/*
> **상태**: ✅ 분석 완료
---
## 📍 분석 결과 요약
| 항목 | 수치 |
|------|------|
| **api/ 엔드포인트** | ~710+ |
| **mng/ 엔드포인트** | ~300+ |
| **React 실제 사용** | ~80+ (api/ 전체의 ~15%) |
| **중복 도메인** | 10개 |
| **즉시 정리 가능** | 3건 |
| **통합 가능 그룹** | 6개 |
---
## 1. 개요
### 1.1 배경
SAM 프로젝트는 api/(REST API), mng/(관리자 패널), react/(프론트엔드) 3개 프로젝트로 구성되어 있으며, 각 프로젝트가 독립적으로 발전하면서 동일 도메인에 대한 API가 중복 생성되었다. 본 분석은 전체 API를 파악하고 정리 방안을 제시한다.
### 1.2 분석 범위
| 프로젝트 | 역할 | 분석 대상 |
|---------|------|----------|
| **api/** | REST API 서버 | routes/api/v1/*.php (14개 라우트 파일), 컨트롤러 138개 |
| **mng/** | 관리자 패널 | routes/api.php, routes/web.php, 컨트롤러 90+개 |
| **react/** | 프론트엔드 | src/lib/api/*, src/hooks/*, src/app/api/* |
---
## 2. 프로젝트별 API 구조
### 2.1 API 프로젝트 (api/)
**라우트 파일**: `api/routes/api/v1/`
| 도메인 | 라우트 파일 | 엔드포인트 수 | 소비자 |
|--------|-----------|:----------:|--------|
| 인증 | `auth.php` | 8 | React, MNG |
| 사용자 | `users.php` | 25 | React |
| 테넌트 | `tenants.php` | 18 | React |
| 관리자 | `admin.php` | 22 | React, MNG |
| 공통 | `common.php` | 95+ | React, MNG |
| HR | `hr.php` | 85+ | React |
| 재무 | `finance.php` | 130+ | React |
| 영업 | `sales.php` | 85+ | React |
| 재고 | `inventory.php` | 65+ | React |
| 생산 | `production.php` | 35+ | React |
| 설계 | `design.php` | 55+ | React |
| 파일 | `files.php` | 15 | React |
| 게시판 | `boards.php` | 70+ | React |
| 문서 | `documents.php` | 5+ | React |
### 2.2 MNG 프로젝트 (mng/)
**API 소비 방식**: 자체 모델로 DB 직접 접근 (api/ REST API를 거치지 않음)
| 도메인 | 엔드포인트 수 | 비고 |
|--------|:----------:|------|
| 사용자/역할/권한 | 30+ | api/와 중복 |
| 메뉴/글로벌메뉴 | 25+ | api/와 중복 |
| 게시판/필드 | 20+ | api/와 중복 |
| 카테고리/글로벌 | 15+ | api/와 중복 |
| 바로빌 (전체) | 60+ | MNG 전용 (외부 서비스) |
| 프로젝트 관리 | 25+ | MNG 전용 |
| 견적 공식 | 30+ | MNG 전용 |
| 품목 필드 | 25+ | MNG 전용 |
| 문서/템플릿 | 12+ | api/와 중복 |
| 계좌/자금일정 | 18+ | api/와 중복 |
| 기타 (회의록, 신용, 영업, Lab) | 40+ | MNG 전용 |
### 2.3 React 프론트엔드 (react/)
**API 호출 방식**: Next.js Proxy (`/api/proxy/*`) → Backend (`/api/v1/*`)
| 카테고리 | 주요 엔드포인트 | 사용 빈도 |
|---------|---------------|:--------:|
| 인증 | login, logout, refresh, signup | 높음 |
| 품목 CRUD | items, items/{id}, items/bom | 높음 |
| 품목기준관리 | item-master/* (pages, sections, fields) | 높음 |
| 견적 계산 | quotes/calculate, quotes/calculate/bom | 높음 |
| 공통코드 | settings/common/{group} | 높음 |
| 대시보드 | card-transactions/dashboard, loans/dashboard | 중간 |
| 알림 | today-issues/unread, unread/count | 중간 |
| 거래처 | clients, client-groups | 중간 |
| 재고 | stocks, work-results | 중간 |
| 일괄작업 | bulk-update-account-code | 낮음 |
| 내보내기 | attendances/export, salaries/export | 낮음 |
---
## 3. 중복 API 분석
### 3.1 중복 컨트롤러 목록 (api/ vs mng/)
| # | 도메인 | api/ 컨트롤러 | mng/ 컨트롤러 | 중복 수준 |
|---|--------|-------------|-------------|:--------:|
| 1 | 사용자 관리 | `Api\V1\Admin\AdminController` | `Api\Admin\UserController` | 🔴 높음 |
| 2 | 역할 관리 | `Api\V1\RoleController` | `Api\Admin\RoleController` | 🔴 높음 |
| 3 | 메뉴 관리 | `Api\V1\MenuController` | `Api\Admin\MenuController` | 🔴 높음 |
| 4 | 카테고리 | `Api\V1\CategoryController` | `Api\Admin\CategoryApiController` | 🔴 높음 |
| 5 | 계좌 관리 | `Api\V1\BankAccountController` | `Api\Admin\BankAccountController` | 🔴 높음 |
| 6 | 권한 관리 | `Api\V1\PermissionController` | `Api\Admin\PermissionController` | 🟡 중간 |
| 7 | 부서 관리 | `Api\V1\DepartmentController` | `Api\Admin\DepartmentController` | 🟡 중간 |
| 8 | 게시판 | `Api\V1\BoardController` | `Api\Admin\BoardController` | 🟡 중간 |
| 9 | 문서 | `Api\V1\Documents\DocumentController` | `Api\Admin\DocumentApiController` | 🟡 중간 |
| 10 | 테넌트 | `Api\V1\TenantController` | `Api\Admin\TenantController` | 🟡 중간 |
### 3.2 상세 비교
#### (1) 사용자 관리 🔴
| 기능 | api/ | mng/ | 차이 |
|------|:----:|:----:|------|
| 기본 CRUD | ✅ | ✅ | 동일 |
| 복구 (restore) | ✅ | ✅ | 동일 |
| 비밀번호 초기화 | ✅ | ✅ | 동일 |
| 활성화/비활성화 | ✅ (PATCH /status) | ❌ | api/만 |
| 역할 부여/해제 | ✅ (POST/DELETE /roles) | ❌ | api/만 |
| 영구삭제 | ❌ | ✅ (DELETE /force) | mng/만 (슈퍼관리자) |
| 개발용 로그인토큰 | ❌ | ✅ (POST /login-token) | mng/만 |
| 모달 데이터 | ❌ | ✅ (GET /modal) | mng/만 |
#### (2) 역할 관리 🔴
| 기능 | api/ | mng/ | 차이 |
|------|:----:|:----:|------|
| 기본 CRUD | ✅ | ✅ | 동일 |
| 통계 (stats) | ✅ | ❌ | api/만 |
| 활성 목록 (active) | ✅ | ❌ | api/만 |
#### (3) 메뉴 관리 🔴
| 기능 | api/ | mng/ | 차이 |
|------|:----:|:----:|------|
| 기본 CRUD | ✅ | ✅ | 동일 |
| 순서변경 (reorder) | ✅ | ✅ | 동일 |
| 복구 (restore) | ✅ | ✅ | 동일 |
| 활성화 토글 | ✅ (toggle) | ✅ (toggle-active) | 동일 기능 |
| 동기화 | ✅ (sync, sync-new, sync-updates) | ❌ | api/만 |
| 트리 구조 | ❌ | ✅ (tree) | mng/만 |
| 글로벌 복사 | ❌ | ✅ (copy-from-global) | mng/만 |
| 일괄 작업 | ❌ | ✅ (bulk-delete/restore/force) | mng/만 |
| 숨김 토글 | ❌ | ✅ (toggle-hidden) | mng/만 |
| 영구삭제 | ❌ | ✅ (force) | mng/만 (슈퍼관리자) |
#### (4) 카테고리 🔴
| 기능 | api/ | mng/ | 차이 |
|------|:----:|:----:|------|
| 기본 CRUD | ✅ | ✅ | 동일 |
| 트리/순서변경/이동 | ✅ | ✅ | 동일 |
| 활성화 토글 | ✅ | ✅ | 동일 |
| 필드 관리 | ✅ (fields CRUD, bulk-upsert) | ❌ | api/만 |
| 템플릿 관리 | ✅ (templates, apply, preview, diff) | ❌ | api/만 |
| 로그 조회 | ✅ (logs) | ❌ | api/만 |
| 글로벌 관리 | ❌ | ✅ (global-categories) | mng/만 |
#### (5) 계좌 관리 🔴
| 기능 | api/ | mng/ | 차이 |
|------|:----:|:----:|------|
| 기본 CRUD | ✅ | ✅ | 동일 |
| 활성화 토글 | ✅ | ✅ | 동일 |
| 활성 목록 (active) | ✅ | ❌ | api/만 |
| 대표계좌 설정 | ✅ (set-primary) | ❌ | api/만 |
| 전체 조회 (all) | ❌ | ✅ | mng/만 |
| 요약 (summary) | ❌ | ✅ | mng/만 |
| 거래내역 | ❌ | ✅ (transactions) | mng/만 |
| 일괄 작업 | ❌ | ✅ (bulk-*) | mng/만 |
| 영구삭제/복구 | ❌ | ✅ (force/restore) | mng/만 |
#### (6) 권한 관리 🟡
| 기능 | api/ | mng/ | 차이 |
|------|:----:|:----:|------|
| 권한 매트릭스 조회 | ✅ (dept/role/user menu-matrix) | ❌ | api/만 (특화) |
| 기본 CRUD | ❌ | ✅ | mng/만 |
> **분석**: api/는 매트릭스 조회 전용, mng/는 CRUD 전용으로 기능 분리된 상태. 완전 중복은 아님.
---
## 4. 통합 가능 API
### 4.1 통합 대상 그룹
| # | 대상 | 현재 상태 | 통합 방안 | 우선순위 |
|---|------|----------|----------|:--------:|
| 1 | **인증 API** | signup + register 중복 | register 제거 (signup 유지) | 🔴 |
| 2 | **사용자 관리** | api/ + mng/ 각각 CRUD | mng/ → api/ 호출로 전환 | 🔴 |
| 3 | **역할 관리** | api/ + mng/ 각각 CRUD | api/에 통합, mng/는 호출만 | 🟡 |
| 4 | **메뉴 관리** | api/ 동기화 + mng/ 관리 분리 | 관리: mng/, 조회+동기화: api/ | 🟡 |
| 5 | **대시보드 데이터** | 개별 엔드포인트 분산 | 통합 대시보드 API 제공 | 🟢 |
| 6 | **일괄 업데이트** | withdrawals/deposits/sales 각각 | 공통 bulk-update 패턴 | 🟢 |
### 4.2 인증 API 중복 상세
```
현재:
POST /v1/login → 로그인
POST /v1/logout → 로그아웃
POST /v1/signup → 회원가입 (1)
POST /v1/register → 회원가입 (2) ← 중복!
POST /v1/token-login → 토큰 로그인 (MNG→DEV)
POST /v1/refresh → 토큰 갱신
POST /v1/internal/exchange-token → 내부 서버 토큰 교환
GET /v1/debug-apikey → 디버그용 ← 프로덕션 제거 필요
권장:
- register 제거 (signup 유지)
- debug-apikey 프로덕션 비활성화
```
---
## 5. 미사용 API
### 5.1 React에서 호출하지 않는 api/ 도메인
| 도메인 | 엔드포인트 수 | 미사용 이유 |
|--------|:----------:|-----------|
| HR 전체 (employees, attendance, leave, approval) | ~80+ | MNG에서 직접 관리 또는 React 미구현 |
| 생산 대부분 (processes, work-orders, inspections) | ~35+ | work-results만 사용 |
| 설계 전체 (models, versions, bom-templates) | ~55+ | 견적 계산 시 간접 사용만 |
| 재무 대부분 (cards, payroll, bad-debts 등) | ~100+ | CEO 대시보드 일부만 사용 |
| 사용자 초대 (invitations) | ~5 | React 미구현 |
| 알림 설정 (notification-settings) | ~5 | React 미구현 |
| 프로필 관리 (profiles) | ~5 | React 미구현 |
| 팝업 관리 (popups) | ~5 | React 미구현 |
| AI 리포트 (reports/ai) | ~4 | React 미구현 |
| 구독/결제 (subscriptions, payments) | ~20+ | React 미구현 |
| 현장/시공 (sites, construction) | ~30+ | React 미구현 |
| 검사 관리 (inspections) | ~8 | React 미구현 |
> **참고**: "미사용"은 React 프론트엔드 기준. MNG에서 Blade UI로 직접 사용하거나 향후 구현 예정인 경우 포함.
### 5.2 완전 미사용 가능성 높은 API
| 엔드포인트 | 이유 | 조치 권장 |
|-----------|------|----------|
| `GET /v1/debug-apikey` | 디버그 전용 | 프로덕션 비활성화 |
| `POST /v1/register` | signup과 중복 | 제거 |
| `GET /v1/welfare/*` | React/MNG 모두 미호출 확인 필요 | 사용 여부 확인 |
| `GET /v1/entertainment/*` | React/MNG 모두 미호출 확인 필요 | 사용 여부 확인 |
| `GET /v1/calendar/schedules` | React 미호출 | 사용 여부 확인 |
| `GET /v1/comprehensive-analysis` | React 미호출 | 사용 여부 확인 |
### 5.3 MNG 전용 기능 (정상)
| 기능 | 설명 | 상태 |
|------|------|:----:|
| 바로빌 (Barobill) | 전자세금계산서, 카드, 홈택스 연동 | ✅ 정상 |
| 프로젝트 관리 | 프로젝트, 태스크, 이슈 | ✅ 정상 |
| 데일리 로그 | 일일 스크럼 | ✅ 정상 |
| 견적 공식 | 견적 계산 공식 관리 | ✅ 정상 |
| 회의록 | 녹음, AI 요약 (Google Cloud) | ✅ 정상 |
| 신용 평가 | Coocon API 연동 | ✅ 정상 |
| 영업 관리 | 매니저, 전망, 기록 | ✅ 정상 |
| DevTools | API 탐색기, 흐름 테스터 | ✅ 정상 |
| Lab/R&D | AI, 전략 실험 | ✅ 정상 |
---
## 6. 프로젝트 간 API 관계도
### 6.1 시스템 구조
```
┌─────────────────────────────────────────────────────────────┐
│ 사용자 (브라우저) │
│ │
│ ┌──────────────┐ ┌──────────────────┐ │
│ │ React App │ │ MNG Admin │ │
│ │ (dev.sam.kr) │ │ (mng.sam.kr) │ │
│ └──────┬───────┘ └──────┬───────────┘ │
│ │ │ │
│ Next.js Proxy 자체 모델 직접 사용 │
│ (/api/proxy/*) + 일부 api/ 호출 │
│ │ │ │
│ ▼ │ │
│ ┌──────────────┐ │ │
│ │ API 서버 │◄─────────────────┘ │
│ │ (api.sam.kr) │ token-login, │
│ │ │ DevTools API 탐색 │
│ └──────┬───────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ │
│ │ Database │◄──── MNG도 동일 DB 직접 접근 │
│ │ (MySQL) │ │
│ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
외부 API:
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ Google │ │ Coocon │ │ FCM │ │ NTS │
│ Cloud │ │ (신용) │ │ (푸시) │ │ (홈택스) │
└────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘
└────────────┴────────────┴─────────────┘
MNG에서 호출
```
### 6.2 데이터 흐름
| 흐름 | 방식 | 설명 |
|------|------|------|
| React → API | HTTP (Proxy) | 모든 비즈니스 로직 API 호출 |
| MNG → DB | 직접 모델 | 관리 기능은 DB 직접 접근 |
| MNG → API | HTTP | token-login, DevTools, 일부 동기화 |
| MNG → 외부 | HTTP | Barobill, Google Cloud, Coocon, NTS |
| API → DB | 직접 모델 | 모든 비즈니스 로직 |
### 6.3 중복 발생 원인
```
문제: MNG가 api/를 호출하지 않고 DB 직접 접근
→ 동일 도메인에 대해 api/, mng/ 각각 독립 컨트롤러 보유
→ 비즈니스 로직 분산, 유지보수 부담 증가
현재:
React → api/ (REST API) → DB
MNG → DB 직접 ← 여기가 문제
이상적:
React → api/ (REST API) → DB
MNG → api/ (REST API) → DB (관리자 전용 엔드포인트 추가)
```
---
## 7. 개선 권장사항
### 7.1 즉시 정리 (Quick Wins) 🔴
| # | 작업 | 영향 | 노력 |
|---|------|------|:----:|
| 1 | `POST /v1/register` 제거 (signup 유지) | 코드 정리 | 소 |
| 2 | `GET /v1/debug-apikey` 프로덕션 비활성화 | 보안 강화 | 소 |
| 3 | 미사용 Swagger 문서 정리 | 문서 정확성 | 소 |
### 7.2 중복 해소 (Medium Term) 🟡
| # | 작업 | 현재 | 목표 |
|---|------|------|------|
| 1 | 사용자 관리 통합 | api/ + mng/ 각각 | api/ 마스터, mng/ 관리자 기능만 추가 |
| 2 | 역할 관리 통합 | api/ + mng/ 각각 | api/ 단일 소스 |
| 3 | 카테고리 통합 | api/ + mng/ 각각 | api/ 마스터, mng/ 글로벌 관리만 유지 |
| 4 | 계좌 관리 통합 | api/ + mng/ 각각 | 하나로 통합 |
| 5 | 메뉴 관리 정리 | api/ 동기화 + mng/ 관리 | 역할 분리 명확화 |
### 7.3 아키텍처 개선 (Long Term) 🟢
| # | 작업 | 설명 |
|---|------|------|
| 1 | MNG → API 호출 전환 | MNG가 DB 직접 접근 대신 api/ REST API 호출 |
| 2 | API Gateway 도입 | 인증/권한/레이트리밋 중앙 관리 |
| 3 | 미사용 API 비활성화 | deprecation 헤더 추가 후 단계적 제거 |
| 4 | API v2 전환 | 중복 정리 포함한 v2 설계 |
---
## 8. 전체 엔드포인트 도메인별 수
### API 프로젝트
| 도메인 | 파일 | 수 |
|--------|------|:--:|
| 인증 | auth.php | 8 |
| 사용자 | users.php | 25 |
| 테넌트 | tenants.php | 18 |
| 관리자 | admin.php | 22 |
| 공통 | common.php | 95+ |
| HR | hr.php | 85+ |
| 재무 | finance.php | 130+ |
| 영업 | sales.php | 85+ |
| 재고 | inventory.php | 65+ |
| 생산 | production.php | 35+ |
| 설계 | design.php | 55+ |
| 파일 | files.php | 15 |
| 게시판 | boards.php | 70+ |
| 문서 | documents.php | 5+ |
| **합계** | | **~710+** |
### MNG 프로젝트
| 그룹 | 수 |
|------|:--:|
| 사용자/역할/권한 | 30+ |
| 메뉴/글로벌메뉴 | 25+ |
| 게시판/필드 | 20+ |
| 카테고리/글로벌 | 15+ |
| 바로빌 | 60+ |
| 프로젝트 관리 | 25+ |
| 견적 공식 | 30+ |
| 품목 필드 | 25+ |
| 문서/템플릿 | 12+ |
| 계좌/자금일정 | 18+ |
| 기타 | 40+ |
| **합계** | **~300+** |
---
## 9. 참고 문서
- `docs/standards/api-rules.md` - API 규칙
- `docs/architecture/system-overview.md` - 시스템 아키텍처
- `docs/specs/database-schema.md` - DB 스키마
- `api/routes/api/v1/*.php` - API 라우트 파일
- `mng/routes/api.php` - MNG API 라우트
- `react/src/lib/api/` - React API 클라이언트
---
## 10. 결론
1. **api/와 mng/의 10개 도메인에서 컨트롤러 중복** 발생 - 동일 DB를 각각 직접 접근하는 구조적 문제
2. **React는 api/ 전체의 약 15%만 사용** - 나머지는 MNG 전용이거나 미구현 기능
3. **인증 API에 signup/register 중복** 존재 - 즉시 정리 가능
4. **장기적으로 MNG → API 호출 전환**이 이상적이나, 현재 아키텍처도 기능적으로 동작
5. **Quick Wins(register 제거, debug-apikey 비활성화)부터 시작** 권장
---
*이 문서는 /sc:plan 스킬로 생성되었습니다.*