refactor: 분리되어 관리하고 있던 문서 시스템을 하나로 통일
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
작업본 삭제를 막는 참조 — 실제 사례와 그 해소
|
||||
출처: hyeonworks-prod / postgres-0 / appdb
|
||||
진단 시각: 2026-09-04 (아래 [1]~[4])
|
||||
사후 확인: 2026-09-04, 사용자가 조치한 뒤 (아래 [5])
|
||||
|
||||
증상
|
||||
「DTO 변환 과정에서 발생한 Highlight 컬렉션 N+1」을 지우려는데, 관계를 다 지웠는데도
|
||||
삭제가 안 된다.
|
||||
|
||||
삭제 가드가 보는 다섯 테이블 (DeleteDocumentDraftUseCase → documentReferenced)
|
||||
SELECT 1 FROM document_relation WHERE target_document_id = :id
|
||||
UNION ALL SELECT 1 FROM question_document_link WHERE document_id = :id
|
||||
UNION ALL SELECT 1 FROM project_document_link WHERE document_id = :id ← 여기서 걸림
|
||||
UNION ALL SELECT 1 FROM topic_featured_document WHERE document_id = :id
|
||||
UNION ALL SELECT 1 FROM project_decision WHERE source_case_id = :id
|
||||
|
||||
다섯 이유가 전부 같은 한 문장으로 나온다:
|
||||
"another record still links to this one; unlink it first"
|
||||
「another record」라고 하니 관계를 찾아 지우게 되는데, 정작 막는 것은 record 가 아니라
|
||||
프로젝트 연결이다. 그리고 프로젝트 연결은 「관계」 편집기가 아니라 문서의 Project 필드다.
|
||||
|
||||
======================================================================
|
||||
[1] 대상 문서 (진단 시점 캡처)
|
||||
|
||||
58c2d5d9-5865-4b2c-b1cc-3c5c955c33dc | CASE | collection-nplus1-dto-mapping
|
||||
| DRAFT | PRIVATE | DTO 변환 과정에서 발생한 Highlight 컬렉션 N+1
|
||||
|
||||
→ workflow_status=DRAFT, target_visibility=PRIVATE 이고 publication /
|
||||
public_resource_projection / public_route 에 행이 없다. 즉 게시 가드는 통과한다.
|
||||
|
||||
[2] 이 문서 id 를 참조하는 행 — uuid 컬럼 전수 스캔 (진단 시점 캡처)
|
||||
|
||||
NOTICE: project_document_link . document_id => 1 행
|
||||
NOTICE: document . id => 1 행
|
||||
NOTICE: case_detail . document_id => 1 행
|
||||
|
||||
→ 셋뿐이다. document(자신), case_detail(본문), 그리고 project_document_link 1행.
|
||||
|
||||
[3] 막고 있는 그 행의 정체 (진단 시점 캡처)
|
||||
|
||||
relation_type=PRIMARY | featured_order=- | project=Liner N + 1문제
|
||||
|
||||
→ relation_type 이 PRIMARY 이므로 ProjectLinkStore.setPrimary() 의 DELETE 대상이다.
|
||||
즉 Studio 에서 Project 를 「미지정」으로 바꿔 저장하면 이 행이 지워진다.
|
||||
(setPrimary 는 relation_type='PRIMARY' 인 행만 지운다. 만약 이 행이 RELATED 였다면
|
||||
화면에서 풀 방법이 없어 진짜로 막혔을 것이다 — 그 경우는 아니었다.)
|
||||
|
||||
[4] document_relation 은 실제로 비어 있었다 (진단 시점 캡처)
|
||||
|
||||
document_relation 참조 행 수: 0
|
||||
|
||||
→ 사용자가 관계를 다 지운 것이 맞다. 관계는 문제가 아니었다.
|
||||
|
||||
======================================================================
|
||||
[5] 사후 확인 — 사용자가 Project 를 미지정으로 바꾸고 삭제한 뒤
|
||||
document 행: 0
|
||||
project_document_link 행: 0
|
||||
case_detail 행: 0
|
||||
|
||||
→ 삭제가 통과했다. 진단이 맞았다는 것이 이것으로 확인된다 — 프로젝트 연결을 푸는 것이
|
||||
막힘의 해소였다.
|
||||
|
||||
주의: 그래서 이 결함은 이제 실시간으로 재현할 수 없다. [1]~[4] 는 진단 당시의 캡처이고
|
||||
[5] 만 지금 다시 조회한 값이다.
|
||||
Reference in New Issue
Block a user