From 0f4a9cb7d63284ec627682a9620d9a73380ec58c Mon Sep 17 00:00:00 2001 From: htlee Date: Fri, 17 Apr 2026 11:51:35 +0900 Subject: [PATCH] =?UTF-8?q?fix(db):=20candidate=5Fsource=20=EC=BB=AC?= =?UTF-8?q?=EB=9F=BC=20VARCHAR(30)=E2=86=92(100)=20=ED=99=95=EC=9E=A5=20(V?= =?UTF-8?q?031)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gear_group_parent_candidate_snapshots.candidate_source 의 VARCHAR(30) 제약 때문에 prediction gear_correlation 스테이지가 매 사이클 실패하던 문제 해소. 원인: - prediction/algorithms/gear_parent_inference.py:875 의 candidate_source = ','.join(sorted(meta['sources'])) 가 복수 source 라벨 (CORRELATION/EPISODE/LABEL/LINEAGE/MATCH) 을 쉼표 join 하며 최대 약 39자. VARCHAR(30) 초과 시 psycopg2.errors.StringDataRightTruncation 을 유발해 _insert_candidate_snapshots 전체 ROLLBACK. 발견 경위: - Phase 0-1 (PR #83) 의 stage_runner + logger.exception 전환 후 journal 에 찍힌 풀 스택트레이스로 드러남. 기존에는 logger.warning 한 줄 ("gear correlation failed: ...") 만 남아 원인 특정 불가. 영향 범위: - 백엔드 JPA 엔티티 미참조 → 재빌드·재배포 불필요 - Flyway 자동 적용 (백엔드 기동 시) - prediction 재기동만 필요 (기존 코드 그대로, 이제 INSERT 성공 기대) 검증: - 재배포 후 journalctl 에서 'gear correlation failed' 로그 사라짐 확인 - kcg.gear_group_parent_candidate_snapshots 에 최근 15분 건수 증가 확인 --- .../V031__alter_candidate_source_length.sql | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 backend/src/main/resources/db/migration/V031__alter_candidate_source_length.sql diff --git a/backend/src/main/resources/db/migration/V031__alter_candidate_source_length.sql b/backend/src/main/resources/db/migration/V031__alter_candidate_source_length.sql new file mode 100644 index 0000000..ba80302 --- /dev/null +++ b/backend/src/main/resources/db/migration/V031__alter_candidate_source_length.sql @@ -0,0 +1,20 @@ +-- V031: gear_group_parent_candidate_snapshots.candidate_source VARCHAR(30) → VARCHAR(100) +-- +-- 원인: prediction/algorithms/gear_parent_inference.py 의 _rank_candidates 가 +-- candidate_source = ','.join(sorted(meta['sources'])) (line 875) +-- 로 여러 source 라벨(CORRELATION / EPISODE / LABEL / LINEAGE / MATCH 등) 을 쉼표로 +-- join 해 저장한다. 모든 source 가 맞춰지면 약 39자(5개 라벨 + 쉼표) 에 달해 +-- VARCHAR(30) 를 초과하며 psycopg2.errors.StringDataRightTruncation 을 유발. +-- +-- 영향: prediction 사이클의 gear_correlation 스테이지에서 `_insert_candidate_snapshots` +-- 실패 → `gear_group_parent_candidate_snapshots` 테이블 갱신 전체 스킵. +-- Phase 0-1 의 사이클 스테이지 에러 격리 덕분에 후속 스테이지(pair_detection / +-- per-vessel analysis / upsert_results / 출력 모듈들)는 정상 완주. +-- +-- 대안 검토: +-- (A) VARCHAR(100) — 여유치. 채택. +-- (B) TEXT — 제약 없음. 컬럼 의미가 "짧은 라벨 집합" 이라 VARCHAR 가 자연스러움. +-- (C) 코드에서 [:30] trim — 의미 손실(source 목록 절단). 부적합. + +ALTER TABLE kcg.gear_group_parent_candidate_snapshots + ALTER COLUMN candidate_source TYPE VARCHAR(100);