kcg-ai-monitoring/backend
htlee 2e18960bf2 feat(backend): Phase 3 MVP — Detection Model Registry 운영자 API
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>
2026-04-20 13:46:31 +09:00
..
.mvn/wrapper feat: Phase 2 - Spring Boot 백엔드 + DB 마이그레이션 초기화 2026-04-07 09:01:13 +09:00
src feat(backend): Phase 3 MVP — Detection Model Registry 운영자 API 2026-04-20 13:46:31 +09:00
.sdkmanrc feat: Phase 2 - Spring Boot 백엔드 + DB 마이그레이션 초기화 2026-04-07 09:01:13 +09:00
mvnw feat: Phase 2 - Spring Boot 백엔드 + DB 마이그레이션 초기화 2026-04-07 09:01:13 +09:00
mvnw.cmd feat: Phase 2 - Spring Boot 백엔드 + DB 마이그레이션 초기화 2026-04-07 09:01:13 +09:00
pom.xml fix(backend): Spring 6.1 RestClient bean 모호성 기동 실패 해소 2026-04-17 07:40:57 +09:00
README.md docs: prediction-analysis 신규 + 루트/SFR 문서 drift 해소 2026-04-17 11:20:53 +09:00

Backend (Spring Boot)

운영 배포 중 — rocky-211 :18080 (kcg-ai-backend systemd).

구성

  • Runtime: Spring Boot 3.5.7 + Java 21
  • DB: PostgreSQL (kcgaidb) + Flyway V001~V030 (51 테이블)
  • Auth: Spring Security + JWT 쿠키 + BCrypt
  • Cache: Caffeine (권한 트리 10분 TTL)
  • Permission: 트리 기반 RBAC (47 리소스 × 5 operation)
  • HTTP client: RestClient + 명시적 @Bean 주입 (predictionRestClient, signalBatchRestClient)

책임

  • 자체 인증/권한/감사 로그 + 관리자 API
  • 운영자 의사결정 (모선 확정·제외·학습, 어구 정체성 충돌 분류)
  • prediction 분석 결과 조회 (/api/analysis/*) + 이벤트 허브 (/api/events, /api/alerts)
  • prediction 실시간 상태 프록시 (/api/prediction/*)

빌드 · 배포

# 로컬 실행
./mvnw spring-boot:run

# 프로덕션 빌드
./mvnw clean package -DskipTests
# → target/kcg-ai-backend-*.jar

# 운영 배포 (수동)
scp target/kcg-ai-backend-*.jar rocky-211:/opt/kcg-ai-backend/
ssh rocky-211 "sudo systemctl restart kcg-ai-backend"

필수 컴파일 설정 (PR #79 hotfix)

Spring 6.1 의 parameter-level @Qualifier 주입이 동작하려면 두 가지가 필수:

  1. pom.xmlmaven-compiler-plugindefault-compiledefault-testCompile 양쪽 execution 에 <parameters>true</parameters> 설정. 파라미터 이름을 바이트코드에 보존해야 @Qualifier resolve 가 가능.
  2. src/main/java/lombok.configlombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier 설정. Lombok @RequiredArgsConstructor 가 필드의 @Qualifier 를 생성자 파라미터에 복사해야 Spring 이 인식.

둘 중 하나라도 누락되면 PredictionProxyController 같은 다중 RestClient bean 주입 컨트롤러가 기동 시점에 NoUniqueBeanDefinitionException 으로 크래시 루프에 빠진다. 로컬에서 ./mvnw spring-boot:run 실패는 운영 restart 시 동일하게 재현되므로 MR 범위 밖이어도 우선 해결.

주요 패키지 구조

src/main/java/gc/mda/kcg/
├── config/                # RestClientConfig, SecurityConfig, OpenApi, CorsConfig, CaffeineConfig 등
├── auth/                  # LoginController, JWT, 비밀번호 정책
├── permission/            # 트리 RBAC, @RequirePermission AOP, 캐시
├── audit/                 # @Auditable AOP, AuditLogService, AccessLogFilter
├── domain/
│   ├── analysis/          # VesselAnalysisController, GearCollisionController (V030), PredictionProxyController 등
│   ├── fleet/             # ParentInferenceWorkflowController, FleetService
│   ├── event/             # EventController, AlertController
│   ├── enforcement/       # EnforcementController, EnforcementPlanController
│   ├── master/            # MasterDataController (CodeMaster, GearTypeMaster, VesselPermit 등)
│   ├── admin/             # AdminLogController, AdminStatsController, UserManagementController
│   └── stats/             # StatsController (KPI 집계)
└── Application.java

모든 컨트롤러는 controller → service → repository 계층을 준수하며, 쓰기 액션은 @RequirePermission + @Auditable 로 권한·감사 일관 적용.

Flyway 마이그레이션

디렉토리 밖 의존성

  • prediction → kcgaidb: prediction 이 직접 write. backend 는 HTTP 호출 없이 DB 조회로만 연동
  • signal-batch: http://192.168.1.18:18090/signal-batch (정적정보 보강, signalBatchRestClient 주입)
  • prediction (FastAPI): http://redis-211:18092 (실시간 상태/채팅 프록시 전용)

운영 체크리스트

  1. 빌드 성공 → local ./mvnw spring-boot:run 기동 확인 → curl /api/auth/me 200 확인
  2. scp 배포 → systemctl restart kcg-ai-backendjournalctl -u kcg-ai-backend -n 100
  3. 응답 확인: curl -k https://kcg-ai-monitoring.gc-si.dev/api/analysis/vessels?hours=1
  4. Flyway 에러 시: backend.application 로그에서 Migration ... failed 확인