LAXworkspace
알림 · 보고서
오프라인입력 0 (캐시 0%) · 출력 0
새 대화
세션 목록
⚠ 로컬 데몬이 오프라인입니다 — 메시지는 큐에 쌓였다가 데몬이 켜지면 처리됩니다.
변우석의 요청: 변우석입니다. 0063을 lax-db(테스트)에 적용하니 'UNIQUE constraint failed: legal_doc_catalog.slug'로 실패했습니다(전체 롤백, slug 컬럼 미생성). 실DB 진단 결과: [lax-db 실제 상태 — 깨끗한 로컬과 다름] - legal_doc_catalog = **2062행** (0043의 34행이 아니라 대규모 카탈로그로 확장돼 있음). doc_name 중복 다수(즉시항고장 21행, 송달료 예납 20행 …). - 라우트 4종 실측: · '소장' = 4행 (id 1,799,1257,1488 / in_scope=core 1행 / mvp_built 1행) · '준비서면' = 7행 (id 9,561,809,1105,1260,1459,1495 / core 1행) · '지급명령신청서' = 1행 (id 238 / core) · '답변서' = **0행** (정확히 그 doc_name이 없음 — 다른 표기이거나 카탈로그에서 빠짐) 원인: 0063의 `UPDATE … SET slug='sojang' WHERE doc_name='소장'` 가 4행을 전부 'sojang'으로 만들어 → UNIQUE INDEX에서 중복 충돌. [요청 — 0063 수정] 1. 라우트 4종 slug를 **정확히 1행에만** 부여(중복 회피). 식별기준은 in_scope='core' 권장(소장·준비서면·지급명령은 core 1행씩 존재). 또는 0043 원본 id(소장=1, 지급명령=238 등)로 못박아도 됩니다. 어느 게 안정적인지 판단해 주세요. 2. '답변서' 0행 원인 확인: lax-db 카탈로그에서 답변서가 어떤 doc_name으로 존재하는지(예: '답변서' 변형) 찾아서 그 행에 dapbyeon 부여, 정말 없으면 dapbyeon은 라우트 연결 보류(메뉴에서 빠짐)로 정리. 3. 'doc-'||id 백필은 NULL 행만이라 안전하나, 멱등성 보강: 재적용해도 안전하게(ADD COLUMN은 이미 있으면 에러 → 분리, UNIQUE INDEX는 IF NOT EXISTS 유지, UPDATE는 재실행 무해). 4. **prod(lax-prod)도 같은 2062행 상태인지** 확인해서 동일 수정이 양쪽에 먹는지 봐주세요. 수정된 0063(또는 0063b)만 주시면 제가 테스트→프로덕션 적용·검증하겠습니다. doc_slug.ts SSOT의 4종 slug와 일치만 지켜주세요.

검증 완료. 양쪽 DB에서 4종 라우트가 서로 다른 단일 id로 정확히 해소됩니다(충돌 불가). 보고드립니다.

결론 — 수정된 0063 적용 준비 완료 (양쪽 DB 동일하게 안전)

[무엇을 바꿨나] migrations/0063_legal_doc_catalog_slug.sql 교체 (단일 파일, doc_slug.ts SSOT는 손대지 않음 — 4종 slug 철자 동일 유지).

  • 라우트 4종 UPDATE를 WHERE id=(SELECT id ... WHERE doc_name=X AND in_scope='core' ORDER BY id LIMIT 1) 형태로 변경 → 구조적으로 최대 1행만 갱신.

[왜 이 식별축인가 — 요청 1] id 못박기(1/9/238)와 core 둘 다 지금은 맞지만, in_scope='core'를 채택했습니다. id는 재시드 시 깨지는 시드순서 부산물이고, core는 의미축이라 더 안정적입니다. 게다가 LIMIT 1 서브쿼리로 감싸 core가 또 2개로 늘어도 UNIQUE 충돌이 원천 불가능 — 0063이 다시는 같은 에러를 못 냅니다.

[답변서 — 요청 2] 실DB 양쪽에 정확명칭 답변서 행이 0개입니다. 존재하는 건 전부 변형(답변서(청구취지/원인) 15·11·4행 …, 전부 out, core 없음). 임의 변형에 dapbyeon을 붙이면 의미가 어긋나므로 보류 처리(UPDATE는 현재 0행 no-op). dapbyeon은 카탈로그 미연결 → 메뉴에서 빠짐, SSOT의 dapbyeon 항목은 유지. 후속에 법무가 답변서 core 행을 추가하면 그 문장 재실행만으로 자동 연결됩니다.

[멱등성 — 요청 3] UPDATE(0/1행 멱등)·CREATE UNIQUE INDEX IF NOT EXISTS·doc-||id(NULL 행만) 전부 재실행 무해. 유일한 비멱등 문장은 ALTER ... ADD COLUMN(SQLite는 IF NOT EXISTS 미지원) — 실DB 양쪽 slug 컬럼 미존재 실측 확인했으니 그대로 적용 OK. 재적용 시엔 ALTER 한 줄만 주석 처리하라고 파일에 명시했습니다.

[prod 동일성 — 요청 4] lax-prod도 2062행, core id 1/9/238 동일, slug 컬럼 미존재 — lax-db와 완전 일치. 동일 마이그레이션이 양쪽에 그대로 먹습니다.

[검증 결과 — 자가 DONE 아님, 양쪽 DB 실측]

route lax-db target_id (core_n) lax-prod target_id (core_n)
소장→sojang 1 (1) 1 (1)
지급명령→jigeup-myeongryeong 238 (1) 238 (1)
준비서면→junbi-seomyeon 9 (1) 9 (1)
답변서→dapbyeon null (0, 보류) null (0, 보류)

3종이 서로 다른 단일 id로 해소 → 충돌 불가. (UPDATE의 서브쿼리만 SELECT로 비파괴 실행해 확인. 실제 적용은 변우석님 몫으로 남겨둠.)

[롤백] DB는 제가 건드리지 않았습니다(파일만 수정). 파일 원복: git checkout migrations/0063_legal_doc_catalog_slug.sql. 적용 후 DB 원복이 필요하면 DROP INDEX idx_doccat_slug; 후 신규 테이블 재생성 없이는 컬럼 제거가 SQLite상 번거로우니, 적용 전 스냅샷(wrangler d1 export)을 떠두시길 권합니다.

바로 테스트→프로덕션 적용·검증 진행하셔도 됩니다.