Skip to content

[FEATURE] 문서 삭제 API 추가 #19

@hellonaeunkim

Description

@hellonaeunkim

📝 작업 개요

문서(Document)를 soft delete 처리하고, 삭제된 문서에 속한 활성 블록(Block)도 함께 soft delete 처리하는 문서 삭제 API를 추가한다.

🎯 배경 / 문제 정의

  • 문서 서비스 MVP 요구사항에는 soft delete 정책이 포함되어 있으며, 삭제된 문서는 기본 조회에서 제외되어야 한다.
  • 문서만 삭제되고 해당 문서의 블록이 활성 상태로 남아 있으면 데이터 정합성이 깨질 수 있다.
  • 문서 삭제 시 해당 문서 소속 블록도 함께 soft delete 처리해야 문서 조회 / 블록 조회 기준이 일관되게 유지된다.
  • 현재 구조는 documents-api / documents-core / documents-infrastructure로 책임이 나뉘어 있으므로, 문서 삭제도 같은 계층 구조와 공통 응답 규약 안에서 구현할 필요가 있다.

📌 요구 사항 (Acceptance Criteria)

  • DELETE /v1/documents/{documentId} API를 추가한다.
  • 요청 헤더 X-User-Id를 받아 삭제 수행 사용자 식별자로 사용한다.
  • 삭제 대상 문서가 활성 상태가 아니거나 존재하지 않으면 DOCUMENT_NOT_FOUND 응답을 반환한다.
  • 문서 삭제는 soft delete 방식으로 처리한다.
  • 문서 삭제 시 Document.deletedAt을 현재 시각으로 설정한다.
  • 문서 삭제 시 Document.updatedBy를 요청 헤더 X-User-Id 값으로 갱신한다.
  • 문서 삭제 시 해당 documentId를 가진 활성 Block도 함께 soft delete 처리한다.
  • Block soft delete 시 Block.deletedAt을 현재 시각으로 설정한다.
  • Block soft delete 시 Block.updatedBy를 요청 헤더 X-User-Id 값으로 갱신한다.
  • 다른 문서에 속한 Block은 함께 삭제되지 않아야 한다.
  • 문서 삭제와 해당 문서 소속 Block 삭제는 하나의 트랜잭션 안에서 처리한다.
  • 문서 삭제와 Block 삭제는 벌크 update 방식(@Modifying)으로 처리한다.
  • 문서 삭제 벌크 update 결과가 0건이면 DOCUMENT_NOT_FOUND로 처리한다.
  • 응답 형식은 기존 GlobalResponse, SuccessCode, ErrorCode 구조를 유지한다.
  • WebMvc 테스트, 서비스 단위 테스트, 통합 테스트를 현재 프로젝트 테스트 구조에 맞춰 추가하거나 갱신한다.

📚 상세 설명 (선택)

  • API 스펙
    • Method: DELETE
    • Path: /v1/documents/{documentId}
    • Header: X-User-Id
  • 삭제 정책
    • Document는 hard delete가 아니라 soft delete로 처리한다.
    • Document가 삭제되면 해당 문서에 속한 활성 Block도 함께 soft delete 처리한다.
    • 이번 범위에서는 Document 복구 API, Block 단독 삭제 API, Block 복구 API는 포함하지 않는다.
  • 구현 방향
    • documents-api
      • DocumentController에 삭제 엔드포인트 추가
    • documents-core
      • DocumentService에 삭제 계약 추가
    • documents-infrastructure
      • DocumentRepository에 문서 soft delete 벌크 update 메서드 추가
      • BlockRepository에 documentId 기준 Block soft delete 벌크 update 메서드 추가
      • DocumentServiceImpl에서 문서 삭제와 Block 삭제를 하나의 트랜잭션으로 오케스트레이션
  • 트레이드오프
    • Block을 하나씩 조회 후 저장하는 방식보다 documentId 기준 벌크 update 방식이 현재 구조와 요구사항에 더 적합하다.
    • 이유는 삭제 조건이 단순하고, 문서 1건에 여러 Block이 연결될 수 있어 조회/반복 저장보다 벌크 update가 더 효율적이기 때문이다.
  • 주의 사항
    • 벌크 update 사용 시 JPA entity lifecycle callback에 의존하지 않고 deletedAt, updatedAt, updatedBy를 쿼리에서 직접 갱신해야 한다.

🚧 범위 - 포함(In Scope)

  • Document 삭제 API 추가
  • DocumentService 삭제 로직 추가
  • Document soft delete 벌크 update 구현
  • 해당 문서 소속 활성 Block soft delete 벌크 update 구현
  • 문서 삭제 트랜잭션 처리
  • 문서 삭제 API WebMvc 테스트 추가
  • 문서 삭제 서비스 단위 테스트 추가
  • 문서 삭제 API 통합 테스트 추가

🚧 범위 - 제외(Out of Scope)

No response

✅ 테스트 / 검증 항목

  • 단위 테스트 작성/수정
  • 로컬 환경에서 기능 동작 확인
  • 관련 문서(노션, README 등) 업데이트
  • 로그/모니터링 포인트 필요 시 추가

📎 참고 자료

No response

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Projects

Status

Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions