Skip to content

[✨Feat] 자기소개서 soft delete API 구현#31

Merged
yong203 merged 1 commit into
devfrom
feat/#30
Jun 17, 2026
Merged

[✨Feat] 자기소개서 soft delete API 구현#31
yong203 merged 1 commit into
devfrom
feat/#30

Conversation

@yong203

@yong203 yong203 commented Jun 17, 2026

Copy link
Copy Markdown
Member

작업 내용

  • API-013 DELETE /cover-letters/{coverLetterId} 자기소개서 soft delete API를 구현했습니다.
  • 현재 사용자 소유이면서 삭제되지 않은 자기소개서만 삭제할 수 있도록 owner/deletedAt 기준 조회를 추가했습니다.
  • 삭제 시 deletedAtupdatedAt을 기록하고, 삭제 응답 DTO로 success/deletedAt을 반환합니다.
  • 존재하지 않거나, 다른 사용자 소유이거나, 이미 삭제된 자기소개서는 NOT_FOUND로 응답합니다.
  • repository/service/controller 테스트를 추가해 삭제 후 목록 제외 정책까지 검증했습니다.

결과 스크린샷

1. 기존에 존재하던 coverLetter 조회

totalItems = 8 이며, 1페이지 가장 상단 coverLetter id = "cl_4794327d-d746-470d-ac5b-69be2885b63e " 를 확인 가능
스크린샷 2026-06-18 오전 1 43 52

2. soft delete 진행 성공 결과 반환 확인

coverLetter id = "cl_4794327d-d746-470d-ac5b-69be2885b63e " soft delete 진행 성공 결과 반환 확인
스크린샷 2026-06-18 오전 1 44 04

3. soft delete 후 coverLetter 재조회

totalItems = 7 이며, 1페이지 가장 상단 coverLetter id != "cl_4794327d-d746-470d-ac5b-69be2885b63e " 확인
스크린샷 2026-06-18 오전 1 44 23

4. soft delete 후 동일 coverLetter id 로 재삭제 시도

404 Not Found 확인
스크린샷 2026-06-18 오전 1 44 58

관련 이슈

문서 반영

  • 반영한 문서:
    • docs/api/README.md
    • docs/api/cover-letters.md
    • docs/status.md

확인 결과

  • ./gradlew test
  • ./gradlew check
  • 기타: git diff --check
  • 실행하지 못함. 이유:

Summary by CodeRabbit

릴리스 노트

  • New Features

    • 자기소개서 삭제 기능 추가
    • 삭제 시 타임스탬프와 함께 결과 반환
  • Documentation

    • 삭제 API 상태를 '계획 중'에서 '구현 완료'로 업데이트
    • 삭제 조건 및 오류 응답 사항 문서화
    • 향후 LLM 작업 취소 연동 계획 명시

@yong203 yong203 linked an issue Jun 17, 2026 that may be closed by this pull request
8 tasks
@coderabbitai

coderabbitai Bot commented Jun 17, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

자기소개서 soft delete API(DELETE /cover-letters/{coverLetterId})를 구현한다. CoverLetterRepository에 소유자·삭제 상태 조건부 단건 조회 메서드를 추가하고, CoverLetterService에 논리 삭제 로직과 DeleteCoverLetterResponse DTO를 도입하며, CoverLetterController에 DELETE 엔드포인트를 연결한다. 전 계층 테스트와 API 문서 갱신이 포함된다.

Changes

자기소개서 Soft Delete 구현

Layer / File(s) Summary
Repository 쿼리 메서드 및 응답 DTO 계약 정의
src/main/java/com/daon/rewrite/coverletter/repository/CoverLetterRepository.java, src/main/java/com/daon/rewrite/coverletter/dto/DeleteCoverLetterResponse.java
CoverLetterRepositoryid·ownerId·deletedAt IS NULL 조건을 만족하는 단건 조회 메서드(findByIdAndOwnerIdAndDeletedAtIsNull)를 추가하고, DeleteCoverLetterResponse 레코드(success, deletedAt)와 Asia/Seoul 기준 InstantLocalDateTime 변환 팩토리 메서드를 신규 정의한다.
CoverLetterService 논리 삭제 메서드 구현
src/main/java/com/daon/rewrite/coverletter/service/CoverLetterService.java
deleteMyCoverLetter 트랜잭션 메서드를 추가한다. 현재 사용자 기준 조회 후 엔티티가 없으면 NOT_FOUND BusinessException을 발생시키고, 존재하면 markDeleted(clock) 처리 후 엔티티를 반환한다.
DELETE 엔드포인트 연결
src/main/java/com/daon/rewrite/coverletter/controller/CoverLetterController.java
@DeleteMapping("/cover-letters/{coverLetterId}") 핸들러 deleteMyCoverLetter를 추가하고, 서비스 반환값을 DeleteCoverLetterResponse.from(...)으로 변환해 응답한다.
Repository·Service·Controller 계층 테스트 추가
src/test/java/com/daon/rewrite/coverletter/repository/CoverLetterRepositoryTest.java, src/test/java/com/daon/rewrite/coverletter/service/CoverLetterServiceTest.java, src/test/java/com/daon/rewrite/coverletter/controller/CoverLetterControllerTest.java
findByIdAndOwnerIdAndDeletedAtIsNull의 active·삭제·다른 소유자 케이스, 삭제 성공 및 NOT_FOUND 예외 발생(미존재·타 소유자·이미 삭제), 성공 응답과 404/NOT_FOUND 응답을 각 계층에서 검증하는 테스트를 추가한다.
API 문서 및 상태 갱신
docs/api/README.md, docs/api/cover-letters.md, docs/status.md
API-013 상태를 PlannedImplemented로 갱신하고, 삭제 API의 Validation 섹션·NOT_FOUND 에러 응답 예시·LLM Job cancel 미구현 고지를 추가한다. docs/status.md의 REQ-003 구현 범위를 구체화하고 Next Issue Slice Candidates를 상세 조회로 교체한다.

Possibly related issues

  • #30 [✨Feat] 자기소개서 soft delete API 구현: 이 PR이 해당 이슈의 모든 완료 기준(소유자 검증, NOT_FOUND 처리, 응답 DTO, 테스트, 문서 갱신)을 직접 구현한다.

Possibly related PRs

  • Rewrite-Team/Rewrite-BE#19: 동일한 CoverLetterController·CoverLetterService에 새 엔드포인트(초안 생성 POST /cover-letters)와 DTO를 추가한 PR로, 이번 PR의 DELETE 엔드포인트 추가와 동일한 구조적 패턴을 공유한다.
  • Rewrite-Team/Rewrite-BE#27: CoverLetter 엔티티와 CoverLetterRepository를 JPA로 전환하고 타임스탬프 처리를 확립한 PR로, 이번 PR의 markDeleted(clock)deletedAt 필드 활용의 직접적인 선행 작업이다.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목이 "자기소개서 soft delete API 구현"으로 변경 사항의 핵심을 명확하게 요약하고 있습니다.
Description check ✅ Passed PR 설명이 작업 내용, 관련 이슈, 문서 반영, 확인 결과 항목을 모두 포함하며 템플릿을 충실히 따르고 있습니다.
Linked Issues check ✅ Passed 구현된 모든 요구사항(owner 검증, NOT_FOUND 응답, deletedAt/updatedAt 기록, 응답 DTO, 테스트 추가, 문서 업데이트)이 이슈 #30의 목표를 충족합니다.
Out of Scope Changes check ✅ Passed 모든 변경사항이 soft delete API 구현 범위 내에 있으며, 제외 대상(복구 API, 물리 삭제, llm_jobs 연동)은 포함되지 않았습니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@yong203 yong203 self-assigned this Jun 17, 2026
@yong203 yong203 added the ✨ Feature 새로운 기능 구현 label Jun 17, 2026
@codecov

codecov Bot commented Jun 17, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@yong203 yong203 marked this pull request as ready for review June 17, 2026 16:54

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs/api/cover-letters.md (1)

444-482: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

LLM Job 취소 문구를 현재 구현과 맞춰 주세요.

지금 문구는 삭제 시 진행 중인 LLM Job을 CANCELED로 전환한다고 적고 있는데, 바로 아래에는 llm_jobs persistence가 아직 없어 연동이 후속 작업이라고도 되어 있습니다. 현재 구현 기준으로는 deletedAt만 기록하는 쪽으로 명확히 적는 게 맞습니다.

수정 예시
-삭제 시 `deletedAt`을 기록하고, 진행 중인 LLM Job이 있으면 `CANCELED`로 전환한다.
+삭제 시 `deletedAt`을 기록한다. 진행 중인 LLM Job 취소 연동은 `llm_jobs` persistence가 준비된 뒤 후속 이슈에서 반영한다.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/api/cover-letters.md` around lines 444 - 482, The first paragraph of the
deletion description states that ongoing LLM Jobs are converted to CANCELED
status when a cover letter is deleted, but the final paragraph clarifies that
llm_jobs persistence does not yet exist and this integration is a follow-up
task. Remove or modify the reference to canceling LLM Jobs in the opening
paragraph to accurately reflect the current implementation, which only records
the deletedAt timestamp. Ensure the documentation clearly states what is
currently implemented versus what will be added in future work.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@docs/api/cover-letters.md`:
- Around line 444-482: The first paragraph of the deletion description states
that ongoing LLM Jobs are converted to CANCELED status when a cover letter is
deleted, but the final paragraph clarifies that llm_jobs persistence does not
yet exist and this integration is a follow-up task. Remove or modify the
reference to canceling LLM Jobs in the opening paragraph to accurately reflect
the current implementation, which only records the deletedAt timestamp. Ensure
the documentation clearly states what is currently implemented versus what will
be added in future work.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 7f52ed81-8df0-4607-b964-aa317edab6b8

📥 Commits

Reviewing files that changed from the base of the PR and between 1edd63e and d241a08.

📒 Files selected for processing (10)
  • docs/api/README.md
  • docs/api/cover-letters.md
  • docs/status.md
  • src/main/java/com/daon/rewrite/coverletter/controller/CoverLetterController.java
  • src/main/java/com/daon/rewrite/coverletter/dto/DeleteCoverLetterResponse.java
  • src/main/java/com/daon/rewrite/coverletter/repository/CoverLetterRepository.java
  • src/main/java/com/daon/rewrite/coverletter/service/CoverLetterService.java
  • src/test/java/com/daon/rewrite/coverletter/controller/CoverLetterControllerTest.java
  • src/test/java/com/daon/rewrite/coverletter/repository/CoverLetterRepositoryTest.java
  • src/test/java/com/daon/rewrite/coverletter/service/CoverLetterServiceTest.java

@yong203 yong203 merged commit 3b3a2e3 into dev Jun 17, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ Feature 새로운 기능 구현

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[✨Feat] 자기소개서 soft delete API 구현

1 participant