Skip to content

Comments

feat: Spring Batch 기반 연관 엔티티 삭제 및 하드 딜리트 기능 추가(#64)#69

Merged
chaiminwoo0223 merged 1 commit intodevelopfrom
feature/64
Sep 17, 2025
Merged

feat: Spring Batch 기반 연관 엔티티 삭제 및 하드 딜리트 기능 추가(#64)#69
chaiminwoo0223 merged 1 commit intodevelopfrom
feature/64

Conversation

@chaiminwoo0223
Copy link
Contributor

@chaiminwoo0223 chaiminwoo0223 commented Sep 2, 2025

📌 작업 내용 및 특이사항

✅ 하드 딜리트 배치 동작

  • 매일 04시에 소프트 삭제된 데이터와 상위 리소스가 삭제된 종속 데이터를 완전 삭제
  • 삭제는 자식 → 부모 순서로 안전하게 진행
  • 도메인별 하드 딜리트가 연쇄 실행(Pomodoro -> StudyLogDailyMission -> DailyMission ...)
  • 삭제 기준: deletedAt IS NOT NULL OR 소유 관계의 상위 엔티티가 삭제된 경우
  • 처리 결과: 엔티티별 삭제 건수로 요약되어 기록 (HardDeleteSummary)

✅ 하드 딜리트 배치 설정

  • application-batch.yml 추가
  • V2__create_batch_meta_tables.sql 추가(배치 메타테이블 생성)

✅ 하드 딜리트 구성 요소

  • BatchJobConfig: hardDeleteJob, hardDeleteStep, hardDeleteTasklet 정의
  • SchedulerConfig: 매일 04시hardDeleteJob 실행

✅ 하드 딜리트 기능

  • com.ject.studytrip.cleanup 패키지에 하드 딜리트 기능 구현
  • HardDeleteExecutor: 자식→부모 원칙, 페이즈 기반 삭제 순서·경계 관리
  • HardDeleteFacade: 배치 진입점, 삭제 실행

✅ QueryDSL 삭제 리포지토리 구현

  • PomodoroQueryRepository, PomodoroQueryRepositoryAdapter 구현
  • DailyGoalQueryRepository, DailyGoalQueryRepositoryAdapter 구현

✅ 리포지토리 메서드 추가

  • MemberQueryRepository: deleteAllByDeletedAtIsNotNull 메서드 추가
  • TripQueryRepository: deleteAllByDeletedAtIsNotNull, deleteAllByDeletedMemberOwner 메서드 추가
  • StampQueryRepository: deleteAllByDeletedAtIsNotNull, deleteAllByDeletedTripOwner 메서드 추가
  • MissionQueryRepository: deleteAllByDeletedAtIsNotNull, deleteAllByDeletedStampOwner 메서드 추가
  • DailyMissionQueryRepository: deleteAllByDeletedAtIsNotNull, deleteAllByDeletedMissionOwner, deleteAllByDeletedDailyGoalOwner 메서드 추가
  • StudyLogDailyMissionQueryRepository: deleteAllByDeletedAtIsNotNull, deleteAllByDeletedDailyMissionOwner, deleteAllByDeletedStudyLogOwner 메서드 추가
  • StudyLogQueryRepository: deleteAllByDeletedAtIsNotNull, deleteAllByDeletedMemberOwner, deleteAllByDeletedDailyGoalOwner 메서드 추가

✅ 서비스 메서드 추가

  • MemberService: hardDeleteMembers 메서드 추가
  • TripService: hardDeleteTrips, hardDeleteTripsOwnedByDeletedMember 메서드 추가
  • StampService: hardDeleteStamps, hardDeleteStampsOwnedByDeletedTrip 메서드 추가
  • MissionService: hardDeleteMissions, hardDeleteMissionsOwnedByDeletedStamp 메서드 추가
  • DailyMissionService: hardDeleteDailyMissions, hardDeleteDailyMissionsOwnedByDeletedMission, hardDeleteDailyMissionsOwnedByDeletedDailyGoal 메서드 추가
  • StudyLogDailyMissionService: hardDeleteStudyLogDailyMissions , hardDeleteStudyLogDailyMissionsOwnedByDeletedDailyMission, hardDeleteStudyLogDailyMissionsOwnedByDeletedStudyLog 메서드 추가
  • StudyLogService: hardDeleteStudyLogs, hardDeleteStudyLogsOwnedByDeletedMember, hardDeleteStudyLogsOwnedByDeletedDailyGoal 메서드 추가
  • PomodoroService: hardDeletePomodoros, hardDeletePomodorosOwnedByDeletedDailyGoal 메서드 추가
  • DailyGoalService: hardDeleteDailyGoals, hardDeleteDailyGoalsOwnedByDeletedTrip 메서드 추가

✅ 단위 테스트 추가

  • MemberServiceTest: HardDeleteMembers 단위 테스트 추가
  • TripServiceTest: HardDeleteTrips, HardDeleteTripsOwnedByDeletedMember 단위 테스트 추가
  • StampServiceTest: HardDeleteStamps, HardDeleteStampsOwnedByDeletedTrip 단위 테스트 추가
  • MissionServiceTest: HardDeleteMissions, HardDeleteMissionsOwnedByDeletedStamp 단위 테스트 추가
  • DailyMissionServiceTest: HardDeleteDailyMissions, HardDeleteDailyMissionsOwnedByDeletedMission, HardDeleteDailyMissionsOwnedByDeletedDailyGoal 단위 테스트 추가
  • StudyLogDailyMissionServiceTest: HardDeleteStudyLogDailyMissions, HardDeleteStudyLogDailyMissionsOwnedByDeletedDailyMission, HardDeleteStudyLogDailyMissionsOwnedByDeletedStudyLog 단위 테스트 추가
  • StudyLogServiceTest: HardDeleteStudyLogs, HardDeleteStudyLogsOwnedByDeletedMember, HardDeleteStudyLogsOwnedByDeletedDailyGoal 단위 테스트 추가
  • PomodoroServiceTest: HardDeletePomodoros, HardDeletePomodorosOwnedByDeletedDailyGoal 단위 테스트 추가
  • DailyGoalServiceTest: HardDeleteDailyGoals, HardDeleteDailyGoalsOwnedByDeletedTrip 단위 테스트 추가

🌱 관련 이슈


🔍 참고사항(선택)

  • application-flyway.yml을 추가하여, local, test, dev, prod 프로필 환경에서 flyway 설정 제거

📚 기타(선택)

@chaiminwoo0223 chaiminwoo0223 self-assigned this Sep 2, 2025
@chaiminwoo0223 chaiminwoo0223 added ⚙️chore 세팅 관련 ✨feature 구현, 개선 사항 관련 부분 labels Sep 2, 2025
@chaiminwoo0223
Copy link
Contributor Author

chaiminwoo0223 commented Sep 13, 2025

배치 완전 삭제 성공(도메인 스키마)

스크린샷 2025-09-13 오후 10 13 24

Copy link
Contributor

@hisonghy hisonghy left a comment

Choose a reason for hiding this comment

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

정말 고생많으셨습니다.
작업 내용보면서 코드 리뷰 작성해두었습니다. 확인 부탁드려요!

Copy link
Contributor

@hisonghy hisonghy left a comment

Choose a reason for hiding this comment

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

고생많으셨습니다!
커밋 정리 후 병합부탁드려요~
아 그리고 아직 확인 못하신 코드 리뷰 2개 확인부탁드려요!

* feat: PomodoroQueryRepository, PomodoroQueryRepositoryAdapter 구현
* feat: DailyGoalQueryRepository, DailyGoalQueryRepositoryAdapter 구현
* feat: HardDeleteExecutor, HardDeleteFacade 구현

* feat: MemberQueryRepository에 deleteAllByDeletedAtIsNotNull 메서드 추가
* feat: TripQueryRepository에 deleteAllByDeletedAtIsNotNull, deleteAllByDeletedMemberOwner 메서드 추가
* feat: StampQueryRepository에 deleteAllByDeletedAtIsNotNull, deleteAllByDeletedTripOwner 메서드 추가
* feat: MissionQueryRepository에 deleteAllByDeletedAtIsNotNull, deleteAllByDeletedStampOwner 메서드 추가
* feat: DailyMissionQueryRepository에 deleteAllByDeletedAtIsNotNull 메서드 추가
* feat: DailyMissionQueryRepository에 deleteAllByDeletedMissionOwner 메서드 추가
* feat: DailyMissionQueryRepository에 deleteAllByDeletedDailyGoalOwner 메서드 추가
* feat: StudyLogDailyMissionQueryRepository에 deleteAllByDeletedAtIsNotNull 메서드 추가
* feat: StudyLogDailyMissionQueryRepository에 deleteAllByDeletedDailyMissionOwner 메서드 추가
* feat: StudyLogDailyMissionQueryRepository에 deleteAllByDeletedStudyLogOwner 메서드 추가
* feat: StudyLogQueryRepository에 deleteAllByDeletedAtIsNotNull 메서드 추가
* feat: StudyLogQueryRepository에 deleteAllByDeletedMemberOwner, deleteAllByDeletedDailyGoalOwner 메서드 추가

* feat: MemberService에 hardDeleteMembers 메서드 추가
* feat: TripService에 hardDeleteTrips, hardDeleteTripsOwnedByDeletedMember 메서드 추가
* feat: StampService에 hardDeleteStamps, hardDeleteStampsOwnedByDeletedTrip 메서드 추가
* feat: MissionService에 hardDeleteMissions, hardDeleteMissionsOwnedByDeletedStamp 메서드 추가
* feat: DailyMissionService에 hardDeleteDailyMissions 메서드 추가
* feat: DailyMissionService에 hardDeleteDailyMissionsOwnedByDeletedMission 메서드 추가
* feat: DailyMissionService에 hardDeleteDailyMissionsOwnedByDeletedDailyGoal 메서드 추가
* feat: StudyLogDailyMissionService에 hardDeleteStudyLogDailyMissions 메서드 추가
* feat: StudyLogDailyMissionService에 hardDeleteStudyLogDailyMissionsOwnedByDeletedDailyMission 메서드 추가
* feat: StudyLogDailyMissionService에 hardDeleteStudyLogDailyMissionsOwnedByDeletedStudyLog 메서드 추가
* feat: StudyLogService에 hardDeleteStudyLogs 메서드 추가
* feat: StudyLogService에 hardDeleteStudyLogsOwnedByDeletedMember 메서드 추가
* feat: StudyLogService에 hardDeleteStudyLogsOwnedByDeletedDailyGoal 메서드 추가
* feat: PomodoroService에 hardDeletePomodoros, hardDeletePomodorosOwnedByDeletedDailyGoal 메서드 추가
* feat: DailyGoalService에 hardDeleteDailyGoals, hardDeleteDailyGoalsOwnedByDeletedTrip 메서드 추가

* chore: BatchJobConfig 추가
* chore: applicaiton-flyway.yml 구현
* chore: application.yml에 flyway 프로필 설정 추가
* chore: local, test, dev, prod 프로필 환경에서 flyway 설정 제거
* chore: application-batch.yml 추가
* chore: application-datasource.yml에
* chore: V2__create_batch_meta_tables.sql 추가
* chore: SchedulerConfig에 hardDeleteJob 스케줄링 추가

* test: MemberServiceTest에 HardDeleteMembers 단위 테스트 추가
* test: TripServiceTest에 HardDeleteTrips, HardDeleteTripsOwnedByDeletedMember 단위 테스트 추가
* test: StampServiceTest에 HardDeleteStamps, HardDeleteStampsOwnedByDeletedTrip 단위 테스트 추가
* test: MissionServiceTest에 HardDeleteMissions, HardDeleteMissionsOwnedByDeletedStamp 단위 테스트 추가
* test: DailyMissionServiceTest에 HardDeleteDailyMissions 단위 테스트 추가
* test: DailyMissionServiceTest에 HardDeleteDailyMissionsOwnedByDeletedMission 단위 테스트 추가
* test: DailyMissionServiceTest에 HardDeleteDailyMissionsOwnedByDeletedDailyGoal 단위 테스트 추가
* test: StudyLogDailyMissionServiceTest에 HardDeleteStudyLogDailyMissions 단위 테스트 추가
* test: StudyLogDailyMissionServiceTest에 HardDeleteStudyLogDailyMissionsOwnedByDeletedDailyMission 단위 테스트 추가
* test: StudyLogDailyMissionServiceTest에 HardDeleteStudyLogDailyMissionsOwnedByDeletedStudyLog 단위 테스트 추가
* test: StudyLogServiceTest에 HardDeleteStudyLogs 단위 테스트 추가
* test: StudyLogServiceTest에 HardDeleteStudyLogsOwnedByDeletedMember 단위 테스트 추가
* test: StudyLogServiceTest에 HardDeleteStudyLogsOwnedByDeletedDailyGoal 단위 테스트 추가
* test: PomodoroServiceTest에 HardDeletePomodoros, HardDeletePomodorosOwnedByDeletedDailyGoal 단위 테스트 추가
* test: DailyGoalServiceTest에 HardDeleteDailyGoals, HardDeleteDailyGoalsOwnedByDeletedTrip 단위 테스트 추가
@chaiminwoo0223 chaiminwoo0223 merged commit d82f107 into develop Sep 17, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

⚙️chore 세팅 관련 ✨feature 구현, 개선 사항 관련 부분

Projects

None yet

Development

Successfully merging this pull request may close these issues.

✨[FEAT]: Spring Batch 기반 연관 엔티티 삭제 및 하드 딜리트 기능 추가

2 participants