feat: 워크플로우 연결 + 메뉴 DB SSOT 구조화 #26

병합
htlee feature/workflow-connection-step1 에서 develop 로 9 commits 를 머지했습니다 2026-04-09 16:03:26 +09:00
소유자

변경 사항

워크플로우 연결 5단계 (Step 1~5)

  • VesselAnalysis 직접 조회 API 5개 (iran proxy 제거)
  • EventList 인라인 액션 4종 + MMSI 드릴다운 링크
  • VesselDetail/DarkVessel prediction 전환
  • EnforcementHistory eventId 역추적 + EnforcementPlan CRITICAL 패널
  • 30초 자동갱신 (silentRefresh) + 모선추론 자동연결 + i18n

메뉴 DB SSOT 구조화

  • auth_perm_tree = 메뉴 + 권한 + i18n(labels JSONB) 통합 SSOT
  • 보이지 않는 도메인 그룹 8개 삭제 → 권한 트리 = 메뉴 트리 완전 동기화
  • 프론트: NAV_ENTRIES/PATH_TO_RESOURCE 하드코딩 제거 → DB 동적 렌더링
  • PermissionsPanel: labels 기반 표시명 + 페이지/패널 구분 + 메뉴 순서 정렬
  • V020~V024 마이그레이션 5건

기타

  • @RequirePermission 12곳 수정 (삭제된 그룹 → 구체적 자식 리소스)
  • DB migration README.md 전면 재작성 (V001~V024, 49테이블)
  • V018~V019: prediction features JSONB + llm-ops 권한

테스트

  • 백엔드 빌드 + V024 Flyway 마이그레이션 성공
  • 프론트 TypeScript + ESLint + Vite 빌드 통과
  • 역할별(admin/operator/viewer/field) 메뉴 표시/숨김 정상
  • 권한 관리 UI — 메뉴와 동일 구조 + 동일 라벨
  • API 검증 (/api/auth/me menuConfig, /api/menu-config, /api/perm-tree)
  • 운영 서버 배포 완료 (rocky-211 백엔드 + 프론트)
## 변경 사항 ### 워크플로우 연결 5단계 (Step 1~5) - VesselAnalysis 직접 조회 API 5개 (iran proxy 제거) - EventList 인라인 액션 4종 + MMSI 드릴다운 링크 - VesselDetail/DarkVessel prediction 전환 - EnforcementHistory eventId 역추적 + EnforcementPlan CRITICAL 패널 - 30초 자동갱신 (silentRefresh) + 모선추론 자동연결 + i18n ### 메뉴 DB SSOT 구조화 - auth_perm_tree = 메뉴 + 권한 + i18n(labels JSONB) 통합 SSOT - 보이지 않는 도메인 그룹 8개 삭제 → 권한 트리 = 메뉴 트리 완전 동기화 - 프론트: NAV_ENTRIES/PATH_TO_RESOURCE 하드코딩 제거 → DB 동적 렌더링 - PermissionsPanel: labels 기반 표시명 + 페이지/패널 구분 + 메뉴 순서 정렬 - V020~V024 마이그레이션 5건 ### 기타 - @RequirePermission 12곳 수정 (삭제된 그룹 → 구체적 자식 리소스) - DB migration README.md 전면 재작성 (V001~V024, 49테이블) - V018~V019: prediction features JSONB + llm-ops 권한 ## 테스트 - [x] 백엔드 빌드 + V024 Flyway 마이그레이션 성공 - [x] 프론트 TypeScript + ESLint + Vite 빌드 통과 - [x] 역할별(admin/operator/viewer/field) 메뉴 표시/숨김 정상 - [x] 권한 관리 UI — 메뉴와 동일 구조 + 동일 라벨 - [x] API 검증 (/api/auth/me menuConfig, /api/menu-config, /api/perm-tree) - [x] 운영 서버 배포 완료 (rocky-211 백엔드 + 프론트)
htlee added 9 commits 2026-04-09 16:03:15 +09:00
- V018 마이그레이션: prediction_events.features JSONB 컬럼 추가
- VesselAnalysis 직접 조회 API 5개 신설 (/api/analysis/*)
  - vessels 목록 (필터: mmsi, zone, riskLevel, isDark)
  - vessels/{mmsi} 최신 분석 (features 포함)
  - vessels/{mmsi}/history 분석 이력
  - dark 베셀 목록 (MMSI 중복 제거)
  - transship 의심 목록
- PredictionEvent entity에 features JSONB 필드 추가
- EnforcementController vesselMmsi 필터 파라미터 추가
- event_generator.py INSERT에 features 컬럼 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- EventList 인라인 액션 버튼 4종 추가 (확인/선박상세/단속등록/오탐)
  - 확인(ACK): NEW 상태 이벤트만 활성, ackEvent API 연동
  - 선박 상세: /vessel/{mmsi} 네비게이션
  - 단속 등록: createEnforcementRecord API → 이벤트 RESOLVED 자동 전환
  - 오탐 처리: updateEventStatus(FALSE_POSITIVE) 연동
- MMSI → VesselDetail 링크 3개 화면 적용
  - EventList: MMSI 컬럼 클릭 → /vessel/{mmsi}
  - DarkVesselDetection: MMSI 컬럼 클릭 → /vessel/{mmsi}
  - EnforcementHistory: 대상 선박 컬럼 클릭 → /vessel/{mmsi}
- PredictionEvent 타입에 features 필드 추가 (dark_tier, transship_score 등)
- analysisApi.ts 서비스 신규 생성 (직접 조회 API 5개 연동)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
VesselDetail:
- iran proxy → prediction 직접 API 전환 (getAnalysisLatest/getAnalysisHistory)
- dark 패턴 시각화: dark_tier Badge, 의심점수 바, dark_patterns 태그, 7일 반복 횟수
- 환적 의심 분석 섹션 추가 (transship_tier, transship_score)
- 24h AIS 수신 이력 타임라인 그래프 (시간대별 수신/소실 막대)
- 단속 이력 탭 신설 (GET /api/enforcement/records?vesselMmsi)
- 지도 중심좌표를 분석 결과의 lat/lon으로 자동 설정
- 위험도 점수 표시 0~100 직접 사용 (iran proxy의 0~1 변환 제거)

DarkVesselDetection:
- iran proxy → getDarkVessels() 직접 API 전환
- derivePattern() 제거 → features.dark_tier/dark_suspicion_score/dark_patterns 직접 표시
- tier 기반 KPI 카드 (CRITICAL/HIGH/WATCH) + 클릭 필터
- 의심 점수 내림차순 정렬 (가장 의심스러운 순)
- tier별 필터 셀렉트 추가
- 지도 범례: tier 기반 색상

enforcement.ts: getEnforcementRecords에 vesselMmsi 파라미터 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
EnforcementHistory:
- eventId 역추적 컬럼 추가 (#{eventId} 클릭 → EventList 이동)
- Record 인터페이스에 eventId 필드 추가

EnforcementPlan:
- 미배정 CRITICAL 이벤트 패널 신설 (NEW 상태 CRITICAL 이벤트 표시)
- getEvents(level=CRITICAL, status=NEW) 연동

MainLayout:
- admin 메뉴 4개 서브그룹 분리 (AI 플랫폼/시스템 운영/사용자 관리/감사·보안)
- NavDivider 타입 도입으로 그룹 내 소제목 라벨 렌더링
- 기존 RBAC 필터링 + collapsed 모드 호환 유지

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
자동 갱신 (30초, 깜박임 없음):
- eventStore: silentRefresh() 메서드 추가 (loading 상태 미변경, 데이터만 교체)
- EventList: 30초 인터벌로 silentRefresh + loadStats 호출
- DarkVesselDetection: 30초 인터벌로 getDarkVessels silent 갱신

모선추론 자동 연결:
- ParentReview CONFIRM → createLabelSession 자동 호출 (학습 데이터 수집 시작)
- ParentReview REJECT → excludeForGroup 자동 호출 (잘못된 후보 재추론 방지)
- 자동 연결 실패 시 리뷰 자체는 유지 (catch 무시)

i18n (ko/en):
- darkTier: CRITICAL/HIGH/WATCH/NONE 라벨
- transshipTier: CRITICAL/HIGH/WATCH 라벨
- adminSubGroup: AI 플랫폼/시스템 운영/사용자 관리/감사·보안

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- /map-control labelKey nav.riskMap → nav.mapControl (위험도 지도 중복 해소)
- i18n nav.mapControl 키 추가 (ko: 해역 관리, en: Map Control)
- V019 마이그레이션: ai-operations:llm-ops 권한 트리 항목 추가 (PR #22 누락분)
- system-flow 08-frontend.json: 누락 노드 14개 추가
  - ui.map_control, ui.risk_map, ui.patrol_route, ui.fleet_optimization
  - ui.report_management, ui.external_service
  - ui.ai_model, ui.mlops, ui.llm_ops
  - ui.mobile_service, ui.ship_agent
  - ui.admin_panel, ui.permissions

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## 핵심 변경
- auth_perm_tree를 메뉴 SSOT로 확장 (V020~V024)
  - url_path, label_key, component_key, nav_group, nav_sub_group, nav_sort 컬럼
  - labels JSONB (다국어: {"ko":"...", "en":"..."})
- 보이지 않는 도메인 그룹 8개 삭제 (surveillance, detection, risk-assessment 등)
  - 권한 트리 = 메뉴 트리 완전 동기화
  - 그룹 레벨 권한 → 개별 자식 권한으로 확장 후 그룹 삭제
- 패널 노드 parent_cd를 실제 소속 페이지로 수정
  (어구식별→어구탐지, 전역제외→후보제외, 역할관리→권한관리)
- vessel:vessel-detail 권한 노드 제거 (드릴다운 전용, 인증만 체크)

## 백엔드
- MenuConfigService: auth_perm_tree에서 menuConfig DTO 생성
- /api/auth/me 응답에 menuConfig 포함 (로그인 시 프리로드)
- @RequirePermission 12곳 수정 (삭제된 그룹명 → 구체적 자식 리소스)
- Caffeine 캐시 menuConfig 추가

## 프론트엔드
- NAV_ENTRIES 하드코딩 제거 → menuStore(Zustand) 동적 렌더링
- PATH_TO_RESOURCE 하드코딩 제거 → DB 기반 longest-match
- App.tsx 36개 정적 import/33개 Route → DynamicRoutes + componentRegistry
- PermissionsPanel: DB labels JSONB 기반 표시명 + 페이지/패널 아이콘 구분
- DB migration README.md 전면 재작성 (V001~V024, 49테이블, 149인덱스)

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

MR 승인 (via /mr skill)

MR 승인 (via /mr skill)
htlee merged commit 93429f012f into develop 2026-04-09 16:03:26 +09:00
htlee 삭제된 브랜치 feature/workflow-connection-step1 2026-04-09 16:03:26 +09:00
"로그인하여 이 대화에 참여"
No reviewers
레이블 없음
마일스톤 없음
담당자 없음
참여자 2명
알림
마감일
기한이 올바르지 않거나 범위를 벗어났습니다. 'yyyy-mm-dd'형식을 사용해주십시오.

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

의존성

No dependencies set.

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