release: 2026-04-17 (11건 커밋) #72

병합
htlee develop 에서 main 로 11 commits 를 머지했습니다 2026-04-17 05:39:15 +09:00
소유자

릴리즈: 2026-04-17 — 프로젝트 뼈대 정비 (iran cleanup + 백엔드 계층 + i18n + 디자인시스템 SSOT)

3단계 리팩토링으로 10여 차례 릴리즈 누적된 구조적 드리프트를 한번에 정리. 총 98개 파일 변경, 기능 변경 없이 표현·구조 정비.

변경 (feat/refactor 중심)

1. 디자인 시스템 SSOT 일괄 준수 (30파일) — PR #C

  • raw <button><Button variant> / raw <input><Input> / raw <select><Select> / 커스텀 탭 → <TabBar> + <TabButton> / raw checkbox → <Checkbox>
  • text-red-400 같은 다크 전용 색상을 text-red-600 dark:text-red-400 쌍으로 라이트 모드 대응
  • StatBox color: string prop → intent: BadgeIntent + INTENT_TEXT_CLASS 매핑
  • 영역: detection(6) / detection/components(4) / enforcement / surveillance(2) / admin(7) / parent-inference(3) / statistics / ai-operations(3) / dashboard / field-ops(2) / auth

2. i18n 하드코딩 한글 제거 — PR #B

  • common.jsonaria / error / dialog / success / message 네임스페이스 추가 (ko/en 대칭, 54키)
  • alert('실패: ' + msg) 11건 + aria-label="역할 코드" 등 40+건 → t('aria.*') / t('error.*') / t('dialog.*') 일괄 치환
  • MainLayout 언어 토글 title={t('message.switchToEnglish')} + aria-label={t('aria.languageToggle')} 정비

3. iran 백엔드 프록시 잔재 제거 — PR #A

  • IranBackendClient dead class 삭제, application.yml iran-backend: 블록 + AppProperties.IranBackend inner class 정리
  • Frontend UI 라벨 iran 백엔드 (분석)AI 분석 엔진, system-flow manifest external.iran_backend 노드 status: deprecated 마킹
  • CLAUDE.md 시스템 구성 다이어그램 최신화 (prediction 이 kcgaidb 에 직접 write)

4. 백엔드 계층 분리 — PR #A

  • AlertController/MasterDataController/AdminStatsController 에서 repository·JdbcTemplate 직접 주입 제거
  • AlertService · MasterDataService · AdminStatsService 신규 계층 + @Transactional(readOnly=true)
  • RestClientConfig @Configuration 으로 predictionRestClient / signalBatchRestClient Bean 통합 (@PostConstruct ad-hoc 제거)

5. 감사 로그 보강 — PR #A

  • EnforcementService createRecord/updateRecord/createPlan 에 @Auditable (ENFORCEMENT_CREATE/UPDATE/PLAN_CREATE)
  • VesselAnalysisGroupService.resolveParentPARENT_RESOLVE 액션

6. alertLevels 카탈로그 확장 — PR #A

  • isValidAlertLevel / isHighSeverity / getAlertLevelOrder / ALERT_LEVEL_MARKER_OPACITY / ALERT_LEVEL_MARKER_RADIUS / ALERT_LEVEL_TIER_SCORE 헬퍼·상수 신설
  • LiveMapView 마커 시각 매핑, DarkVesselDetection tier→점수, GearIdentification 타입 가드, vesselAnomaly 패널 severity 할당 헬퍼로 치환

추가

7. performanceStatus 카탈로그 등록 — PR #A

  • shared/constants/performanceStatus.ts (10종) 를 catalogRegistry 에 등록
  • design-system 쇼케이스 자동 노출 + admin 성능/보관/검증 페이지 SSOT 일원화

커밋 구성 (11건)

  • PR #68 (#A): iran cleanup + 백엔드 계층 + 카탈로그
  • PR #69 (#B): i18n alert/confirm/aria-label
  • PR #70 (#C): 디자인시스템 SSOT 30파일
  • PR #71: 릴리즈 노트 정리 (2026-04-17)

검증 체크리스트

  • npx tsc --noEmit 0 errors
  • npx eslint . --quiet 0 errors
  • ./mvnw -pl backend compile 성공
  • pre-commit hook 통과
  • 배포 후 prediction 파이프라인 정상 동작 확인
  • /api/alerts, /api/master/*, /api/admin/stats/* 응답 스키마 변경 없음
  • auth_audit_log 에 ENFORCEMENT_*, PARENT_RESOLVE 액션 기록
  • 주요 10 화면 다크/라이트 시각 회귀 확인

후속 과제

  • JSX placeholder/텍스트 한글 35건 (별도 PR)
  • external.iran_backend manifest 노드 1~2 릴리즈 후 완전 삭제
  • spoofing_score 산출 로직 재설계 (중국 MID 412 전원 0 수렴)
## 릴리즈: 2026-04-17 — 프로젝트 뼈대 정비 (iran cleanup + 백엔드 계층 + i18n + 디자인시스템 SSOT) 3단계 리팩토링으로 10여 차례 릴리즈 누적된 **구조적 드리프트**를 한번에 정리. 총 98개 파일 변경, 기능 변경 없이 표현·구조 정비. ### 변경 (feat/refactor 중심) **1. 디자인 시스템 SSOT 일괄 준수 (30파일)** — PR #C - raw `<button>` → `<Button variant>` / raw `<input>` → `<Input>` / raw `<select>` → `<Select>` / 커스텀 탭 → `<TabBar>` + `<TabButton>` / raw checkbox → `<Checkbox>` - `text-red-400` 같은 다크 전용 색상을 `text-red-600 dark:text-red-400` 쌍으로 라이트 모드 대응 - StatBox `color: string` prop → `intent: BadgeIntent` + `INTENT_TEXT_CLASS` 매핑 - 영역: detection(6) / detection/components(4) / enforcement / surveillance(2) / admin(7) / parent-inference(3) / statistics / ai-operations(3) / dashboard / field-ops(2) / auth **2. i18n 하드코딩 한글 제거** — PR #B - `common.json` 에 `aria` / `error` / `dialog` / `success` / `message` 네임스페이스 추가 (ko/en 대칭, 54키) - `alert('실패: ' + msg)` 11건 + `aria-label="역할 코드"` 등 40+건 → `t('aria.*')` / `t('error.*')` / `t('dialog.*')` 일괄 치환 - MainLayout 언어 토글 `title={t('message.switchToEnglish')}` + `aria-label={t('aria.languageToggle')}` 정비 **3. iran 백엔드 프록시 잔재 제거** — PR #A - `IranBackendClient` dead class 삭제, `application.yml` `iran-backend:` 블록 + `AppProperties.IranBackend` inner class 정리 - Frontend UI 라벨 `iran 백엔드 (분석)` → `AI 분석 엔진`, system-flow manifest `external.iran_backend` 노드 `status: deprecated` 마킹 - CLAUDE.md 시스템 구성 다이어그램 최신화 (prediction 이 kcgaidb 에 직접 write) **4. 백엔드 계층 분리** — PR #A - AlertController/MasterDataController/AdminStatsController 에서 repository·JdbcTemplate 직접 주입 제거 - `AlertService` · `MasterDataService` · `AdminStatsService` 신규 계층 + `@Transactional(readOnly=true)` - `RestClientConfig @Configuration` 으로 `predictionRestClient` / `signalBatchRestClient` Bean 통합 (@PostConstruct ad-hoc 제거) **5. 감사 로그 보강** — PR #A - `EnforcementService` createRecord/updateRecord/createPlan 에 `@Auditable` (ENFORCEMENT_CREATE/UPDATE/PLAN_CREATE) - `VesselAnalysisGroupService.resolveParent` 에 `PARENT_RESOLVE` 액션 **6. alertLevels 카탈로그 확장** — PR #A - `isValidAlertLevel` / `isHighSeverity` / `getAlertLevelOrder` / `ALERT_LEVEL_MARKER_OPACITY` / `ALERT_LEVEL_MARKER_RADIUS` / `ALERT_LEVEL_TIER_SCORE` 헬퍼·상수 신설 - LiveMapView 마커 시각 매핑, DarkVesselDetection tier→점수, GearIdentification 타입 가드, vesselAnomaly 패널 severity 할당 헬퍼로 치환 ### 추가 **7. performanceStatus 카탈로그 등록** — PR #A - `shared/constants/performanceStatus.ts` (10종) 를 `catalogRegistry` 에 등록 - design-system 쇼케이스 자동 노출 + admin 성능/보관/검증 페이지 SSOT 일원화 ### 커밋 구성 (11건) - PR #68 (#A): iran cleanup + 백엔드 계층 + 카탈로그 - PR #69 (#B): i18n alert/confirm/aria-label - PR #70 (#C): 디자인시스템 SSOT 30파일 - PR #71: 릴리즈 노트 정리 (2026-04-17) ### 검증 체크리스트 - [x] `npx tsc --noEmit` 0 errors - [x] `npx eslint . --quiet` 0 errors - [x] `./mvnw -pl backend compile` 성공 - [x] pre-commit hook 통과 - [ ] 배포 후 prediction 파이프라인 정상 동작 확인 - [ ] `/api/alerts`, `/api/master/*`, `/api/admin/stats/*` 응답 스키마 변경 없음 - [ ] `auth_audit_log` 에 ENFORCEMENT_*, PARENT_RESOLVE 액션 기록 - [ ] 주요 10 화면 다크/라이트 시각 회귀 확인 ### 후속 과제 - JSX placeholder/텍스트 한글 35건 (별도 PR) - `external.iran_backend` manifest 노드 1~2 릴리즈 후 완전 삭제 - spoofing_score 산출 로직 재설계 (중국 MID 412 전원 0 수렴)
htlee added 11 commits 2026-04-17 05:39:05 +09:00
iran 백엔드 프록시 잔재 제거:
- IranBackendClient dead class 삭제, AppProperties/application.yml iran-backend 블록 제거
- Frontend UI 라벨/주석/system-flow manifest deprecated 마킹
- CLAUDE.md 시스템 구성 다이어그램 최신화

백엔드 계층 분리:
- AlertController/MasterDataController/AdminStatsController 에서 repository/JdbcTemplate 직접 주입 제거
- AlertService/MasterDataService/AdminStatsService 신규 계층 도입 + @Transactional(readOnly=true)
- Proxy controller 의 @PostConstruct RestClient 생성 → RestClientConfig @Bean 으로 통합

감사 로그 보강:
- EnforcementService createRecord/updateRecord/createPlan 에 @Auditable 추가
- VesselAnalysisGroupService.resolveParent 에 PARENT_RESOLVE 액션 기록

카탈로그 정합성:
- performanceStatus 를 catalogRegistry 에 등록 (쇼케이스 자동 노출)
- alertLevels 확장: isValidAlertLevel / isHighSeverity / getAlertLevelOrder
- LiveMapView/DarkVesselDetection 시각 매핑(opacity/radius/tier score) 상수로 추출
- GearIdentification/vesselAnomaly 직접 분기를 타입 가드/헬퍼로 치환
공통 번역 리소스 확장:
- common.json 에 aria / error / dialog / success / message 네임스페이스 추가
- ko/en 양쪽 동일 구조 유지 (aria 36 키 + error 7 키 + dialog 4 키 + message 5 키)

alert/confirm 11건 → t() 치환:
- parent-inference: ParentReview / LabelSession / ParentExclusion
- admin: PermissionsPanel / UserRoleAssignDialog / AccessControl

aria-label 한글 40+건 → t() 치환:
- parent-inference (group_key/sub_cluster/정답 parent MMSI/스코프 필터 등)
- admin (역할 코드/이름, 알림 제목/내용, 시작일/종료일, 코드 검색, 대분류 필터, 수신 현황 기준일)
- detection (그룹 유형/해역 필터, 관심영역, 필터 설정/초기화, 멤버 수, 미니맵/재생 닫기)
- enforcement (확인/선박 상세/단속 등록/오탐 처리)
- vessel/statistics/ai-operations (조회 시작/종료 시각, 업로드 패널 닫기, 전송, 예시 URL 복사)
- 공통 컴포넌트 (SearchInput, NotificationBanner)

MainLayout 언어 토글:
- title 삼항분기 → t('message.switchToEnglish'/'switchToKorean')
- aria-label="페이지 내 검색" → t('aria.searchInPage')
- 토글 버튼 자체에 aria-label={t('aria.languageToggle')} 추가
30개 파일 전 영역에 동일한 패턴으로 SSOT 준수:

**StatBox 재설계 (2파일)**:
- RealGearGroups, RealVesselAnalysis 의 `color: string` prop 제거
- `intent: BadgeIntent` prop + `INTENT_TEXT_CLASS` 매핑 도입

**raw `<button>` → Button 컴포넌트 (다수)**:
- `bg-blue-600 hover:bg-blue-500 text-on-vivid ...` → `<Button variant="primary">`
- `bg-orange-600 ...` / `bg-green-600 ...` → `<Button variant="primary">`
- `bg-red-600 ...` → `<Button variant="destructive">`
- 아이콘 전용 → `<Button variant="ghost" aria-label=".." icon={...} />`
- detection/enforcement/admin/parent-inference/statistics/ai-operations/auth 전영역

**raw `<input>` → Input 컴포넌트**:
- parent-inference (ParentReview, ParentExclusion, LabelSession)
- admin (PermissionsPanel, UserRoleAssignDialog)
- ai-operations (AIAssistant)
- auth (LoginPage)

**raw `<select>` → Select 컴포넌트**:
- detection (RealGearGroups, RealVesselAnalysis, ChinaFishing)

**커스텀 탭 → TabBar/TabButton (segmented/underline)**:
- ChinaFishing: 모드 탭 + 선박 탭 + 통계 탭

**raw `<input type="checkbox">` → Checkbox**:
- GearDetection FilterCheckGroup

**하드코딩 Tailwind 색상 라이트/다크 쌍 변환 (전영역)**:
- `text-red-400` → `text-red-600 dark:text-red-400`
- `text-green-400` → `text-green-600 dark:text-green-400`
- blue/cyan/orange/yellow/purple/amber 동일 패턴
- `text-*-500` 아이콘도 `text-*-600 dark:text-*-500` 로 라이트 모드 대응
- 상태 dot (bg-red-500 animate-pulse 등)은 의도적 시각 구분이므로 유지

**에러 메시지 한글 → t('error.errorPrefix') 통일**:
- detection/parent-inference/admin 에서 `에러: {error}` 패턴 → `t('error.errorPrefix', { msg: error })`

**결과**: tsc 0 errors / eslint 0 errors (84 warnings 기존)
claude-bot 이 변경사항을 승인하였습니다. 2026-04-17 05:39:13 +09:00
claude-bot left a comment
멤버

릴리즈 승인 (via /release skill) — 2026-04-17

릴리즈 승인 (via /release skill) — 2026-04-17
htlee merged commit 62d14fc519 into main 2026-04-17 05:39:15 +09:00
"로그인하여 이 대화에 참여"
No reviewers
레이블 없음
마일스톤 없음
담당자 없음
참여자 2명
알림
마감일
기한이 올바르지 않거나 범위를 벗어났습니다. 'yyyy-mm-dd'형식을 사용해주십시오.

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

의존성

No dependencies set.

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