[Feat] 모의 서류 결과 삭제 API 구현#92
Conversation
- DELETE /api/job-postings/{jobPostingId} 엔드포인트 추가
- 로그인 사용자 소유 공고만 삭제 가능하도록 검증
- 공고에 연결된 MockApply, 문항, 분석 결과, 문항 분석 결과 삭제
- 공고별 MockApply sequence 카운터도 함께 정리
- 공고 삭제 성공/권한 없음 테스트 추가
|
Caution Review failedPull request was closed or merged during review 📝 WalkthroughWalkthroughAdds authenticated DELETE /api/job-postings/{jobPostingId}, a transactional service method that validates ownership and cascades bulk deletions across question-analysis, question, analysis, mock-apply, mock-apply-sequence, and job posting repositories, plus repository delete methods and tests. ChangesJob Posting Deletion Cascade
Sequence DiagramsequenceDiagram
participant Client
participant JobPostingController
participant JobPostingService
participant QuestionAnalysisRepository
participant QuestionRepository
participant AnalysisRepository
participant MockApplyRepository
participant MockApplySequenceRepository
participant JobPostingRepository
Client->>JobPostingController: DELETE /api/job-postings/{jobPostingId}
JobPostingController->>JobPostingService: deleteJobPosting(user, jobPostingId)
Note over JobPostingService: validate ownership (getOwnedJobPosting)
JobPostingService->>QuestionAnalysisRepository: deleteAllByJobPostingId(jobPostingId)
JobPostingService->>QuestionRepository: deleteAllByJobPostingId(jobPostingId)
JobPostingService->>AnalysisRepository: deleteAllByJobPostingId(jobPostingId)
JobPostingService->>MockApplyRepository: deleteAllByJobPostingId(jobPostingId)
JobPostingService->>MockApplySequenceRepository: deleteAllByUserIdAndJobPostingId(userId, jobPostingId)
JobPostingService->>JobPostingRepository: deleteById(jobPostingId)
JobPostingService-->>JobPostingController: void
JobPostingController-->>Client: ApiResponse.success()
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 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.
Inline comments:
In
`@src/main/java/com/jobdri/jobdri_api/domain/jobposting/service/JobPostingService.java`:
- Around line 109-118: The current loop loads all MockApply entities via
mockApplyRepository.findAllByJobPostingId and issues per-row deletes
(analysisRepository.findByMockApplyId +
questionRepository.deleteAllByMockApplyId + analysisRepository.delete), causing
N+1 and large in-memory materialization; replace this with bulk delete
repository operations: add repository methods such as
mockApplyRepository.deleteAllByJobPostingId(jobPostingId) and/or
questionRepository.deleteAllByJobPostingId(jobPostingId),
analysisRepository.deleteAllByJobPostingId(jobPostingId) and
questionAnalysisRepository.deleteAllByJobPostingId(jobPostingId) (or implement
`@Modifying` JPQL/SQL queries using a subquery on MockApply ids) and invoke those
bulk deletes in the proper order (delete questionAnalysis -> question ->
analysis -> mockApply) to avoid loading individual MockApply/Analysis objects.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: aa11a110-5e8a-4f44-b906-bf4f1fa2bbe8
📒 Files selected for processing (4)
src/main/java/com/jobdri/jobdri_api/domain/jobposting/controller/JobPostingController.javasrc/main/java/com/jobdri/jobdri_api/domain/jobposting/service/JobPostingService.javasrc/main/java/com/jobdri/jobdri_api/domain/mockapply/repository/MockApplySequenceRepository.javasrc/test/java/com/jobdri/jobdri_api/domain/jobposting/service/JobPostingServiceTest.java
채용 공고 삭제 시 연결 데이터를 bulk delete로 정리하도록 수정 MockApply 전체 로딩 후 루프 삭제하던 로직 제거 문항 분석, 문항, 분석, 모의 서류 지원 순서로 bulk delete 수행 공고별 MockApply sequence 카운터 정리 유지 삭제 API 테스트로 연결 데이터 정리 검증
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
src/main/java/com/jobdri/jobdri_api/domain/analysis/repository/QuestionAnalysisRepository.java (1)
17-26: 💤 Low valueConsider simplifying the query for consistency.
The subquery approach works correctly but could be simplified to use direct property path navigation like the other repositories:
`@Query`(""" delete from QuestionAnalysis qa where qa.analysis.mockApply.jobPosting.id = :jobPostingId """)This would be more consistent with
AnalysisRepositoryandQuestionRepository, which use direct path navigation.🤖 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 `@src/main/java/com/jobdri/jobdri_api/domain/analysis/repository/QuestionAnalysisRepository.java` around lines 17 - 26, The method deleteAllByJobPostingId in QuestionAnalysisRepository uses a subquery; simplify it by changing the JPQL to use direct path navigation (navigate through qa.analysis.mockApply.jobPosting.id) similar to AnalysisRepository and QuestionRepository so the delete directly targets QuestionAnalysis entities by qa.analysis.mockApply.jobPosting.id = :jobPostingId and keep the existing `@Modifying` and `@Param` annotations and method signature intact.
🤖 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.
Inline comments:
In
`@src/main/java/com/jobdri/jobdri_api/domain/mockapply/repository/MockApplyRepository.java`:
- Around line 17-18: The derived delete method deleteAllByJobPostingId in
MockApplyRepository should use an explicit bulk JPQL DELETE to avoid entity
loading; update MockApplyRepository by adding a `@Query` annotation with a JPQL
statement like "DELETE FROM MockApply m WHERE m.jobPosting.id = :jobPostingId"
(keep the existing `@Modifying`(clearAutomatically = true, flushAutomatically =
true) and bind the parameter name jobPostingId) so the repository executes a
single bulk DELETE rather than removing entities one-by-one.
---
Nitpick comments:
In
`@src/main/java/com/jobdri/jobdri_api/domain/analysis/repository/QuestionAnalysisRepository.java`:
- Around line 17-26: The method deleteAllByJobPostingId in
QuestionAnalysisRepository uses a subquery; simplify it by changing the JPQL to
use direct path navigation (navigate through
qa.analysis.mockApply.jobPosting.id) similar to AnalysisRepository and
QuestionRepository so the delete directly targets QuestionAnalysis entities by
qa.analysis.mockApply.jobPosting.id = :jobPostingId and keep the existing
`@Modifying` and `@Param` annotations and method signature intact.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: b2b2ba35-a5c6-465c-8da4-109094cae002
📒 Files selected for processing (5)
src/main/java/com/jobdri/jobdri_api/domain/analysis/repository/AnalysisRepository.javasrc/main/java/com/jobdri/jobdri_api/domain/analysis/repository/QuestionAnalysisRepository.javasrc/main/java/com/jobdri/jobdri_api/domain/analysis/repository/QuestionRepository.javasrc/main/java/com/jobdri/jobdri_api/domain/jobposting/service/JobPostingService.javasrc/main/java/com/jobdri/jobdri_api/domain/mockapply/repository/MockApplyRepository.java
🚧 Files skipped from review as they are similar to previous changes (1)
- src/main/java/com/jobdri/jobdri_api/domain/jobposting/service/JobPostingService.java
MockApply 삭제 시 파생 delete 메서드 대신 JPQL bulk delete를 사용하도록 수정 MockApplyRepository.deleteAllByJobPostingId에 @query delete문 추가 공고 삭제 시 MockApply 엔티티 로딩 없이 일괄 삭제되도록 개선 기존 삭제 API 동작 검증 유지
✨ 어떤 이유로 PR를 하셨나요?
📋 세부 내용 - 왜 해당 PR이 필요한지 작업 내용을 자세하게 설명해주세요
📸 작업 화면 스크린샷
🚨 관련 이슈 번호 [#38]
Summary by CodeRabbit
New Features
Tests