Skip to content

feat: 문서(Document) 삭제 API 구현#22

Merged
hellonaeunkim merged 6 commits intodevfrom
feat/#19_문서_삭제
Mar 19, 2026

Hidden character warning

The head ref may contain hidden characters: "feat/#19_\ubb38\uc11c_\uc0ad\uc81c"
Merged

feat: 문서(Document) 삭제 API 구현#22
hellonaeunkim merged 6 commits intodevfrom
feat/#19_문서_삭제

Conversation

@hellonaeunkim
Copy link
Copy Markdown
Collaborator

@hellonaeunkim hellonaeunkim commented Mar 18, 2026

📝 Part (해당되는 것만 체크)

  • BE
  • FE
  • Infra
  • Docs
  • Test

#️⃣ 연관된 이슈

closes #19


🔎 작업 내용

1. 주요 변경 사항 요약

  • 문서 삭제 API를 추가했습니다. (DELETE /v1/documents/{documentId})
  • 문서 soft delete 시 해당 문서에 속한 활성 블록도 함께 soft delete 되도록 연계 로직을 구현했습니다.
  • 문서 삭제 로직을 bulk update 방식으로 정리하고, 서비스/WebMvc/통합 테스트를 보강했습니다.

2. 상세 내용 (선택)

  • API 스펙
    • DELETE /v1/documents/{documentId}
    • Header: X-User-Id
  • 삭제 정책
    • 문서는 hard delete가 아닌, soft delete로 처리합니다.
    • 삭제 성공 시 Document.deletedAt, Document.updatedBy, updatedAt이 갱신됩니다.
    • 문서 삭제 시 해당 문서에 속한 활성 Block도 함께 soft delete 됩니다.
    • 다른 문서에 속한 Block은 영향을 받지 않습니다.
  • 구현 방식
    • documents-api에 문서 삭제 엔드포인트를 추가했습니다.
    • documents-coreDocumentService 계약에 삭제 메서드를 추가했습니다.
    • documents-infrastructure에서 문서 삭제와 블록 삭제를 하나의 트랜잭션으로 묶었습니다.
    • 문서 삭제와 Block soft delete는 repository의 벌크 update(@Modifying) 방식으로 처리했습니다.
  • 예외 처리
    • 존재하지 않거나 이미 soft delete된 문서를 삭제하면 DOCUMENT_NOT_FOUND를 반환합니다.
    • X-User-Id 헤더가 없으면 UNAUTHORIZED를 반환합니다.

3. 프롬프트 경로


💬 집중 리뷰 요청

  • 문서 삭제 시 해당 문서 소속 Block만 함께 soft delete 되도록 잡은 범위가 요구사항에 맞는지 확인 부탁드립니다.
  • DocumentServiceImpl에서 문서 삭제 후 Block 삭제를 연계하는 책임 분리가 현재 구조에 맞는지 봐주시면 좋겠습니다.
  • 문서/블록 soft delete를 @Modifying 벌크 update로 처리한 방식이 현재 구조에 맞는지 봐주시면 좋겠습니다.

🧪 테스트 방법

1. 로컬 실행 방법

  • ./gradlew :documents-api:test
  • ./gradlew :documents-infrastructure:test
  • ./gradlew :documents-boot:test

2. 테스트 시나리오

  • DELETE /v1/documents/{documentId} 호출 시 성공 응답이 반환되는지 확인
  • 존재하지 않는 문서 삭제 시 DOCUMENT_NOT_FOUND 응답이 반환되는지 확인
  • 이미 soft delete된 문서 삭제 시 DOCUMENT_NOT_FOUND 응답이 반환되는지 확인
  • 문서 삭제 시 해당 문서의 활성 Block도 함께 soft delete 되는지 확인
  • 다른 문서에 속한 Block은 함께 삭제되지 않는지 확인
  • X-User-Id 헤더가 없으면 UNAUTHORIZED 응답이 반환되는지 확인

✅ PR 체크리스트

  • 불필요한 디버그 로그 / 주석 제거
  • breaking change 여부 확인 및 문서화
  • 신규/변경된 기능에 대한 테스트 코드 추가 또는 기존 테스트 통과
  • 로컬에서 주요 시나리오 수동 테스트 완료
  • 관련 문서(노션, README, API 문서 등) 업데이트

@hellonaeunkim hellonaeunkim requested a review from oneplast March 18, 2026 15:34
@hellonaeunkim hellonaeunkim self-assigned this Mar 18, 2026
@hellonaeunkim hellonaeunkim added the enhancement New feature or request label Mar 18, 2026
@hellonaeunkim hellonaeunkim linked an issue Mar 18, 2026 that may be closed by this pull request
19 tasks
@hellonaeunkim hellonaeunkim moved this from Todo to Done in Block-server Mar 18, 2026
@oneplast
Copy link
Copy Markdown
Collaborator

전체적으로 요구사항에 맞는 흐름으로 잘 구현된 것 같습니다. 고생 많으셨습니다!
단, 지금 흐름으로 봤을 때는 문서 삭제 시 하위 문서를 삭제하는 쿼리가 parentId 를 받지 않기 때문에, 상위 문서만 삭제하고 끝날 것으로 예상됩니다.

이 부분 한 번 확인해주시고, 사실이라면 해당 부분만 픽스해주시면 될 것 같습니다.

제가 잘못 보거나 놓친 부분이 있을 수 있으니, 그런 경우 커멘트 남겨주시면 감사드리겠습니다!

추가로, 벌크 업데이트 쿼리가 실제로 1번만 나가는지 검증하는 테스트코드도 있으면 좋을 것 같습니다!

# Conflicts:
#	documents-core/src/main/java/com/documents/service/BlockService.java
#	documents-infrastructure/src/main/java/com/documents/service/BlockServiceImpl.java
#	documents-infrastructure/src/test/java/com/documents/service/BlockServiceImplTest.java
@hellonaeunkim hellonaeunkim force-pushed the feat/#19_문서_삭제 branch from 46e77cd to 54f6b35 Compare March 19, 2026 07:24
@oneplast
Copy link
Copy Markdown
Collaborator

수정 확인했습니다!
고생 많으셨어요~~!! 👍👍👍

@hellonaeunkim hellonaeunkim merged commit ca4ab10 into dev Mar 19, 2026
@hellonaeunkim hellonaeunkim deleted the feat/#19_문서_삭제 branch March 19, 2026 07:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

[FEATURE] 문서 삭제 API 추가

2 participants