Skip to content

자료 삭제 시 내용물 즉시 파기 - #219

Merged
i3months merged 1 commit into
devfrom
feat/purge-content-on-delete
Aug 23, 2026
Merged

자료 삭제 시 내용물 즉시 파기#219
i3months merged 1 commit into
devfrom
feat/purge-content-on-delete

Conversation

@i3months

Copy link
Copy Markdown
Member

지금까지 자료 삭제는 soft delete 만 했다. 지워도 남는 것:

  • S3 업로드 원본 PDF (resumes.file_path) — 이름·연락처·주소가 들어 있다 (docs/security.md §5.2)
  • S3 분석 마크다운 (analyzed_documents.document_path) — 그걸 재구성한 문서
  • document_embeddings 청크 — 이력서 원문 조각이 그대로

#216 으로 검색에서 빠지고 #217 로 스코프가 닫혀 읽히지는 않게 됐다. 하지만 그건 노출 경로를 닫은 것이고, 보관 자체는 남아 있었다. 사용자가 '삭제'로 기대하는 건 사라지는 것이다.

무엇

대상 시점
업로드 원본 커밋 이후 (ObjectPurgeListener)
분석 마크다운 커밋 이후
임베딩 청크 삭제와 같은 트랜잭션

행 자체는 계속 soft delete 로 남긴다. session_contextsanalyzed_documents 를 FK 로 참조해서 행을 지우면 제약 위반이다. 남길 이유가 있는 건 참조 무결성뿐이고 내용물은 아니다.

설계 판단

스토리지 삭제가 커밋 이후인 이유 — 커밋 전에 지우면 트랜잭션이 롤백됐을 때 DB 는 살아 있고 내용물만 사라진 상태가 된다. 되돌릴 방법이 없다.

스토리지 삭제 실패가 사용자 요청을 실패시키지 않는 이유 — 이 시점엔 이미 커밋돼 행이 soft delete 라 어차피 도달 불가이고, 여기서 예외를 던져도 삭제를 되돌릴 수 없다. 대신 키를 ERROR 로 남긴다 — 조용히 삼키면 파기됐다고 착각하게 되고, 어떤 객체가 남았는지 알 방법도 없어진다.

임베딩은 같은 트랜잭션 — DB 작업이라 원자성을 지킬 수 있고, 청크 원문이 가장 직접적인 잔존물이다.

적용 범위

이력서·레포·자소서 세 경로 모두 (AnalyzedDocumentCascadeListener 가 이미 세 이벤트를 다룬다).

엣지 케이스:

  • 웹 이력서(URL 등록)는 업로드 원본이 없어 filePath 가 null
  • 분석 전에 지운 자료는 documentPath 가 없다

둘 다 ObjectPurgeEvent 생성자가 빈/null 키를 걸러내 빈 이벤트가 된다.

테스트

단위 (AnalyzedDocumentCascadeListenerTest, 로컬 통과):

  • soft delete + 임베딩 삭제 + 파기 이벤트 발행
  • documentPath 없으면 빈 키로 파기 이벤트를 내지 않는다
  • 분석 문서가 없으면 아무것도 하지 않는다

DB (DocumentEmbeddingSearchTest 에 추가):

  • deleteByDocumentIdsRemovesChunks — 대상 청크만 지우고 다른 문서 청크는 남긴다
  • deleteByDocumentIdsIsNoopForEmptyInput

검증 한계 — 정직하게

로컬 Docker 데몬이 응답하지 않아(디스크 정리 뒤 Docker Desktop 이 프로세스는 뜨지만 소켓 무응답) Testcontainers 기반 DB 테스트 2건을 로컬에서 돌리지 못했다. 컴파일과 단위 테스트는 통과했다.

CI 는 Docker 가 있으므로 이 PR 의 Backend 잡이 그 2건을 검증한다. 빨개지면 고치고 다시 올린다.

범위 밖

회원 탈퇴 시 사용자의 모든 자료 일괄 파기는 별건이다. 문서상 Phase 2 hard delete 에 묶여 있고, 세션·메시지·피드백까지 포함하는 훨씬 큰 작업이라 이번엔 개별 자료 삭제만 다뤘다. docs/security.md §5.1.1 에 그 경계를 명시했다.

지금까지 자료 삭제는 soft delete 만 했다. S3 의 업로드 원본 PDF·분석 마크다운과
document_embeddings 의 청크가 그대로 남았다. 이력서 PDF 에는 이름·연락처·주소가
들어 있고(docs/security.md §5.2) 임베딩 청크에는 그 원문 조각이 들어 있다.
#216 으로 검색에서 빠지고 #217 로 스코프가 닫혀 읽히지는 않게 됐지만,
보관 자체가 남아 있었다.

행은 계속 soft delete 로 남긴다 — session_contexts 가 analyzed_documents 를
FK 로 참조해서 행을 지우면 제약 위반이다. 남길 이유가 있는 건 참조 무결성뿐이고
내용물은 아니다.

- 임베딩 청크: 삭제와 같은 트랜잭션에서 DELETE
- 스토리지 객체: ObjectPurgeEvent → AFTER_COMMIT 리스너
  커밋 전에 지우면 롤백된 삭제로 객체만 사라져 되돌릴 수 없다
- 스토리지 삭제 실패는 사용자 요청을 실패시키지 않는다. 이미 커밋돼 행이 도달
  불가이고 예외를 던져도 삭제를 되돌릴 수 없다. 키를 ERROR 로 남겨 수동 회수만
  가능하게 한다 — 조용히 삼키면 파기됐다고 착각하게 된다

이력서·레포·자소서 세 경로 모두 적용(AnalyzedDocumentCascadeListener 가 이미
세 이벤트를 다룬다). 웹 이력서는 업로드 원본이 없어 filePath 가 null 이고,
분석 전에 지운 자료는 documentPath 가 없다 — 빈 키는 이벤트에서 걸러진다.
@i3months
i3months merged commit c59ecc1 into dev Aug 23, 2026
5 checks passed
@i3months
i3months deleted the feat/purge-content-on-delete branch August 23, 2026 17:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant