feat(backend): Phase 3 MVP — Detection Model Registry 운영자 API #94

병합
htlee feature/phase3-detection-model-api 에서 develop 로 1 commits 를 머지했습니다 2026-04-20 13:53:52 +09:00
소유자

변경 요약

V034 detection_models / detection_model_versions 에 대한 운영자 CRUD 경량 API.
Phase 2 PoC 5 모델을 DRAFT→ACTIVE 승격할 수 있는 최소 범위.

엔드포인트 (8)

HTTP Path 권한 Auditable
GET /api/ai/detection-models READ
GET /api/ai/detection-models/{modelId} READ
GET /api/ai/detection-models/{modelId}/dependencies READ
GET /api/ai/detection-models/{modelId}/versions READ
GET /api/ai/detection-models/{modelId}/versions/{versionId} READ
POST /api/ai/detection-models/{modelId}/versions CREATE ✓ CREATE
POST /api/ai/detection-models/{modelId}/versions/{versionId}/activate UPDATE ✓ ACTIVATE
POST /api/ai/detection-models/{modelId}/versions/{versionId}/archive UPDATE ✓ ARCHIVE

상태 전이

 DRAFT ──(activate role=PRIMARY/SHADOW/CHALLENGER)──▶ ACTIVE(role)
 DRAFT ──(archive)─────────────────────────────────▶ ARCHIVED
 ACTIVE(*) ──(archive)─────────────────────────────▶ ARCHIVED
  • uk_detection_model_primary partial index 중복 방지: 기존 PRIMARY 가 있는데 role=PRIMARY activate 시 409 Conflict 반환 (promote-primary 는 후속 PR)
  • archive 는 idempotent

구성 요소 (gc.mda.kcg.domain.ai)

  • Entity: DetectionModel, DetectionModelVersion (JSONB params = JsonNode + @JdbcTypeCode(SqlTypes.JSON))
  • Repository: DetectionModelRepository (+ native DAG query), DetectionModelVersionRepository
  • Service: DetectionModelService (READ only), DetectionModelVersionService (create/activate/archive, 전이 화이트리스트)
  • DTO record 4종: Response 2 (Model + Version), Request 3 (Create / Activate / Archive)

권한

ai-operations:detection-models (V034 에서 이미 seed됨) — ADMIN 5 ops / OPERATOR READ+UPDATE / ANALYST·VIEWER READ

로컬 검증

  • mvn -q compile 성공 (warning 만, error 0)
  • mvn spring-boot:run -Dspring-boot.run.arguments=--server.port=8081 기동 성공
  • admin 계정 쿠키 인증으로 8 엔드포인트 전수 smoke test
    • GET 목록 → 5 모델 반환 (dark_suspicion / gear_violation_g01_g06 / pair_trawl_tier / risk_composite / transshipment_5stage)
    • GET 단건 + dependencies (0 rows, 정상)
    • POST versions1.0.1-test DRAFT 생성 → activate SHADOW (ACTIVE/SHADOW) → archive (ARCHIVED/null role) 전이 사이클 검증
    • 테스트 후 cleanup DELETE

범위 밖 (후속 PR)

  • promote-primary (SHADOW/CHALLENGER→PRIMARY 승격, 기존 PRIMARY 자동 ARCHIVED, 트랜잭션 내)
  • enable 토글 (카탈로그 수정)
  • metrics / compare / runs 조회 (PRIMARY vs SHADOW diff 집계)

배포 영향

  • 백엔드 재빌드 + 재배포 필요 — 신규 Entity 스캔에 Hibernate validate 통과 확인됨
  • 데이터베이스 스키마 변경 없음 (V034 기반 읽기/쓰기만)
  • feature flag 무관

다음 단계

머지 후 운영 서버 백엔드 재배포 → 프런트엔드 AIModelManagement 페이지 연동 (Mock 교체)

## 변경 요약 V034 `detection_models` / `detection_model_versions` 에 대한 운영자 CRUD 경량 API. Phase 2 PoC 5 모델을 **DRAFT→ACTIVE 승격**할 수 있는 최소 범위. ### 엔드포인트 (8) | HTTP | Path | 권한 | Auditable | |---|---|---|---| | GET | `/api/ai/detection-models` | READ | — | | GET | `/api/ai/detection-models/{modelId}` | READ | — | | GET | `/api/ai/detection-models/{modelId}/dependencies` | READ | — | | GET | `/api/ai/detection-models/{modelId}/versions` | READ | — | | GET | `/api/ai/detection-models/{modelId}/versions/{versionId}` | READ | — | | POST | `/api/ai/detection-models/{modelId}/versions` | CREATE | ✓ CREATE | | POST | `/api/ai/detection-models/{modelId}/versions/{versionId}/activate` | UPDATE | ✓ ACTIVATE | | POST | `/api/ai/detection-models/{modelId}/versions/{versionId}/archive` | UPDATE | ✓ ARCHIVE | ### 상태 전이 ``` DRAFT ──(activate role=PRIMARY/SHADOW/CHALLENGER)──▶ ACTIVE(role) DRAFT ──(archive)─────────────────────────────────▶ ARCHIVED ACTIVE(*) ──(archive)─────────────────────────────▶ ARCHIVED ``` - `uk_detection_model_primary` partial index 중복 방지: 기존 PRIMARY 가 있는데 role=PRIMARY activate 시 **409 Conflict** 반환 (promote-primary 는 후속 PR) - archive 는 idempotent ### 구성 요소 (`gc.mda.kcg.domain.ai`) - Entity: `DetectionModel`, `DetectionModelVersion` (JSONB params = `JsonNode` + `@JdbcTypeCode(SqlTypes.JSON)`) - Repository: `DetectionModelRepository` (+ native DAG query), `DetectionModelVersionRepository` - Service: `DetectionModelService` (READ only), `DetectionModelVersionService` (create/activate/archive, 전이 화이트리스트) - DTO record 4종: Response 2 (Model + Version), Request 3 (Create / Activate / Archive) ### 권한 `ai-operations:detection-models` (V034 에서 이미 seed됨) — ADMIN 5 ops / OPERATOR READ+UPDATE / ANALYST·VIEWER READ ### 로컬 검증 - [x] `mvn -q compile` 성공 (warning 만, error 0) - [x] `mvn spring-boot:run -Dspring-boot.run.arguments=--server.port=8081` 기동 성공 - [x] admin 계정 쿠키 인증으로 8 엔드포인트 전수 smoke test - GET 목록 → **5 모델 반환** (dark_suspicion / gear_violation_g01_g06 / pair_trawl_tier / risk_composite / transshipment_5stage) - GET 단건 + dependencies (0 rows, 정상) - POST `versions` 로 `1.0.1-test` DRAFT 생성 → activate SHADOW (ACTIVE/SHADOW) → archive (ARCHIVED/null role) **전이 사이클 검증** - 테스트 후 cleanup DELETE ### 범위 밖 (후속 PR) - `promote-primary` (SHADOW/CHALLENGER→PRIMARY 승격, 기존 PRIMARY 자동 ARCHIVED, 트랜잭션 내) - `enable` 토글 (카탈로그 수정) - `metrics` / `compare` / `runs` 조회 (PRIMARY vs SHADOW diff 집계) ### 배포 영향 - **백엔드 재빌드 + 재배포 필요** — 신규 Entity 스캔에 Hibernate validate 통과 확인됨 - 데이터베이스 스키마 변경 없음 (V034 기반 읽기/쓰기만) - feature flag 무관 ### 다음 단계 머지 후 운영 서버 백엔드 재배포 → 프런트엔드 `AIModelManagement` 페이지 연동 (Mock 교체)
htlee added 1 commit 2026-04-20 13:46:56 +09:00
V034 detection_models / detection_model_versions 에 대한 CRUD 경량 API.
MVP 8 엔드포인트로 Phase 2 PoC 5 모델을 DRAFT→ACTIVE 승격 가능한 최소 범위.

엔드포인트 (/api/ai/detection-models):
- GET  /                                    — 카탈로그 목록
- GET  /{modelId}                           — 단건
- GET  /{modelId}/dependencies              — DAG 선행
- GET  /{modelId}/versions                  — 버전 목록
- GET  /{modelId}/versions/{versionId}      — 버전 상세
- POST /{modelId}/versions                  — DRAFT 생성 [@Auditable]
- POST /.../{versionId}/activate            — DRAFT→ACTIVE(role) [@Auditable]
- POST /.../{versionId}/archive             — ACTIVE/DRAFT→ARCHIVED [@Auditable]

구성 요소 (gc.mda.kcg.domain.ai):
- DetectionModel / DetectionModelVersion 엔티티
  · JSONB params 는 Hibernate @JdbcTypeCode(SqlTypes.JSON) + JsonNode
- DetectionModelRepository / DetectionModelVersionRepository
- DetectionModelService (READ only)
- DetectionModelVersionService (전이 화이트리스트 + uk_detection_model_primary 409)
- 4 DTO record (Response 2, Request 3)

권한: ai-operations:detection-models (V034 에서 이미 seed)
  · READ (전체), CREATE (POST /versions), UPDATE (activate/archive)
  · ADMIN 5 ops / OPERATOR READ+UPDATE / ANALYST·VIEWER READ

검증:
- mvn -q compile 성공 (warning 만, error 없음)
- mvn spring-boot:run 로컬 기동 성공 (포트 8081)
- admin 계정 쿠키 인증으로 8 엔드포인트 전수 smoke test:
  · GET /api/ai/detection-models → 5 모델 (dark/risk/gear/pair/transship) 반환
  · GET /{modelId} 단건 + /dependencies (0 rows) 정상
  · POST /versions (1.0.1-test DRAFT) → activate SHADOW → archive 전이 사이클

후속 PR:
- promote-primary (SHADOW/CHALLENGER→PRIMARY, 기존 PRIMARY 자동 archive)
- enable 토글, metrics / compare / runs 조회

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
claude-bot 이 변경사항을 승인하였습니다. 2026-04-20 13:53:51 +09:00
claude-bot left a comment
멤버

Phase 3 MVP 8 엔드포인트 + 전이 사이클 smoke test 통과. 감사 로그 + UNIQUE 중복 방지 + 전이 화이트리스트. LGTM

Phase 3 MVP 8 엔드포인트 + 전이 사이클 smoke test 통과. 감사 로그 + UNIQUE 중복 방지 + 전이 화이트리스트. LGTM
htlee merged commit 87916a55bf into develop 2026-04-20 13:53:52 +09:00
htlee 삭제된 브랜치 feature/phase3-detection-model-api 2026-04-20 13:53:52 +09:00
"로그인하여 이 대화에 참여"
No reviewers
레이블 없음
마일스톤 없음
담당자 없음
참여자 2명
알림
마감일
기한이 올바르지 않거나 범위를 벗어났습니다. 'yyyy-mm-dd'형식을 사용해주십시오.

마감일이 설정되지 않았습니다.

의존성

No dependencies set.

Reference: gc/kcg-ai-monitoring#94
No description provided.