📝 작업 개요
문서(Document)를 soft delete 처리하고, 삭제된 문서에 속한 활성 블록(Block)도 함께 soft delete 처리하는 문서 삭제 API를 추가한다.
🎯 배경 / 문제 정의
- 문서 서비스 MVP 요구사항에는 soft delete 정책이 포함되어 있으며, 삭제된 문서는 기본 조회에서 제외되어야 한다.
- 문서만 삭제되고 해당 문서의 블록이 활성 상태로 남아 있으면 데이터 정합성이 깨질 수 있다.
- 문서 삭제 시 해당 문서 소속 블록도 함께 soft delete 처리해야
문서 조회 / 블록 조회 기준이 일관되게 유지된다.
- 현재 구조는
documents-api / documents-core / documents-infrastructure로 책임이 나뉘어 있으므로, 문서 삭제도 같은 계층 구조와 공통 응답 규약 안에서 구현할 필요가 있다.
📌 요구 사항 (Acceptance Criteria)
📚 상세 설명 (선택)
- 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
✅ 테스트 / 검증 항목
📎 참고 자료
No response
📝 작업 개요
문서(Document)를 soft delete 처리하고, 삭제된 문서에 속한 활성 블록(Block)도 함께 soft delete 처리하는 문서 삭제 API를 추가한다.
🎯 배경 / 문제 정의
문서 조회 / 블록 조회기준이 일관되게 유지된다.documents-api / documents-core / documents-infrastructure로 책임이 나뉘어 있으므로, 문서 삭제도 같은 계층 구조와 공통 응답 규약 안에서 구현할 필요가 있다.📌 요구 사항 (Acceptance Criteria)
DELETE /v1/documents/{documentId}API를 추가한다.X-User-Id를 받아 삭제 수행 사용자 식별자로 사용한다.DOCUMENT_NOT_FOUND응답을 반환한다.Document.deletedAt을 현재 시각으로 설정한다.Document.updatedBy를 요청 헤더X-User-Id값으로 갱신한다.documentId를 가진 활성 Block도 함께 soft delete 처리한다.Block.deletedAt을 현재 시각으로 설정한다.Block.updatedBy를 요청 헤더X-User-Id값으로 갱신한다.@Modifying)으로 처리한다.DOCUMENT_NOT_FOUND로 처리한다.GlobalResponse,SuccessCode,ErrorCode구조를 유지한다.📚 상세 설명 (선택)
DELETE/v1/documents/{documentId}X-User-Iddocuments-apidocuments-coredocuments-infrastructuredocumentId기준 Block soft delete 벌크 update 메서드 추가documentId기준 벌크 update 방식이 현재 구조와 요구사항에 더 적합하다.deletedAt,updatedAt,updatedBy를 쿼리에서 직접 갱신해야 한다.🚧 범위 - 포함(In Scope)
🚧 범위 - 제외(Out of Scope)
No response
✅ 테스트 / 검증 항목
📎 참고 자료
No response