-
Notifications
You must be signed in to change notification settings - Fork 1
[refactor/#580] Member 액세스토큰 만료기간 단축 및 리프레시토큰 Redis에 저장하도록 수정, 탈퇴멤버 hard delete 스케줄러 도입 #581
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
kanghana1
wants to merge
8
commits into
develop
Choose a base branch
from
refactor/#580
base: develop
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
8 commits
Select commit
Hold shift + click to select a range
7cd65ea
refactor: 액세스토큰 만료시간 단축 및 리프레시토큰 재발급 주기 변경
kanghana1 f8232e3
refactor: refreshToken을 redis에 저장하도록 변경
kanghana1 cf672d0
feat: 탈퇴 14일 후 member hard delete되도록 스케줄러 추가 구현
kanghana1 3015e01
test: 메서드 파라미터 변경에 따른 테스트코드 수정
kanghana1 fc5b032
feat: 탈퇴시 채팅 senderId를 null로 변경
kanghana1 669a2cd
refactor: 하드딜리트 시 bulk로 삭제하도록 수정 (N+1 방지)
kanghana1 d430148
test: 테스트코드 인자 수정
kanghana1 221f9b6
chore: dev변경사항 반영
kanghana1 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
8 changes: 8 additions & 0 deletions
8
src/main/java/umc/cockple/demo/domain/member/repository/MemberAddrRepository.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,11 +1,19 @@ | ||
| package umc.cockple.demo.domain.member.repository; | ||
|
|
||
| import org.springframework.data.jpa.repository.JpaRepository; | ||
| import org.springframework.data.jpa.repository.Modifying; | ||
| import org.springframework.data.jpa.repository.Query; | ||
| import org.springframework.data.repository.query.Param; | ||
| import umc.cockple.demo.domain.member.domain.Member; | ||
| import umc.cockple.demo.domain.member.domain.MemberAddr; | ||
|
|
||
| import java.util.List; | ||
| import java.util.Optional; | ||
|
|
||
| public interface MemberAddrRepository extends JpaRepository<MemberAddr, Long> { | ||
| Optional<MemberAddr> findByMemberAndIsMain(Member member, Boolean isMain); | ||
|
|
||
| @Modifying | ||
| @Query("DELETE FROM MemberAddr ma WHERE ma.member.id IN :memberIds") | ||
| void deleteByMemberIds(@Param("memberIds") List<Long> memberIds); | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
16 changes: 16 additions & 0 deletions
16
src/main/java/umc/cockple/demo/domain/member/repository/MemberTermsRepository.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,16 @@ | ||
| package umc.cockple.demo.domain.member.repository; | ||
|
|
||
| import org.springframework.data.jpa.repository.JpaRepository; | ||
| import org.springframework.data.jpa.repository.Modifying; | ||
| import org.springframework.data.jpa.repository.Query; | ||
| import org.springframework.data.repository.query.Param; | ||
| import umc.cockple.demo.domain.member.domain.MemberTerms; | ||
|
|
||
| import java.util.List; | ||
|
|
||
| public interface MemberTermsRepository extends JpaRepository<MemberTerms, Long> { | ||
|
|
||
| @Modifying | ||
| @Query("DELETE FROM MemberTerms mt WHERE mt.member.id IN :memberIds") | ||
| void deleteByMemberIds(@Param("memberIds") List<Long> memberIds); | ||
| } |
16 changes: 16 additions & 0 deletions
16
src/main/java/umc/cockple/demo/domain/member/repository/ProfileImgRepository.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,16 @@ | ||
| package umc.cockple.demo.domain.member.repository; | ||
|
|
||
| import org.springframework.data.jpa.repository.JpaRepository; | ||
| import org.springframework.data.jpa.repository.Modifying; | ||
| import org.springframework.data.jpa.repository.Query; | ||
| import org.springframework.data.repository.query.Param; | ||
| import umc.cockple.demo.domain.member.domain.ProfileImg; | ||
|
|
||
| import java.util.List; | ||
|
|
||
| public interface ProfileImgRepository extends JpaRepository<ProfileImg, Long> { | ||
|
|
||
| @Modifying | ||
| @Query("DELETE FROM ProfileImg pi WHERE pi.member.id IN :memberIds") | ||
| void deleteByMemberIds(@Param("memberIds") List<Long> memberIds); | ||
| } |
92 changes: 92 additions & 0 deletions
92
src/main/java/umc/cockple/demo/domain/member/scheduler/WithdrawnMemberCleanupScheduler.java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,92 @@ | ||
| package umc.cockple.demo.domain.member.scheduler; | ||
|
|
||
| import lombok.RequiredArgsConstructor; | ||
| import lombok.extern.slf4j.Slf4j; | ||
| import org.springframework.scheduling.annotation.Scheduled; | ||
| import org.springframework.stereotype.Component; | ||
| import org.springframework.transaction.annotation.Transactional; | ||
| import umc.cockple.demo.domain.bookmark.repository.ExerciseBookmarkRepository; | ||
| import umc.cockple.demo.domain.bookmark.repository.PartyBookmarkRepository; | ||
| import umc.cockple.demo.domain.chat.repository.ChatMessageRepository; | ||
| import umc.cockple.demo.domain.chat.repository.ChatRoomMemberRepository; | ||
| import umc.cockple.demo.domain.chat.repository.MessageReadStatusRepository; | ||
| import umc.cockple.demo.domain.contest.repository.ContestRepository; | ||
| import umc.cockple.demo.domain.file.service.FileService; | ||
| import umc.cockple.demo.domain.member.domain.Member; | ||
| import umc.cockple.demo.domain.member.enums.MemberStatus; | ||
| import umc.cockple.demo.domain.member.repository.*; | ||
| import umc.cockple.demo.domain.notification.repository.NotificationRepository; | ||
| import umc.cockple.demo.domain.party.repository.PartyJoinRequestRepository; | ||
|
|
||
| import java.time.LocalDateTime; | ||
| import java.util.List; | ||
|
|
||
| @Component | ||
| @RequiredArgsConstructor | ||
| @Slf4j | ||
| public class WithdrawnMemberCleanupScheduler { | ||
|
|
||
| private final MemberRepository memberRepository; | ||
| private final ProfileImgRepository profileImgRepository; | ||
| private final MemberKeywordRepository memberKeywordRepository; | ||
| private final MemberAddrRepository memberAddrRepository; | ||
| private final MemberPartyRepository memberPartyRepository; | ||
| private final MemberExerciseRepository memberExerciseRepository; | ||
| private final MemberTermsRepository memberTermsRepository; | ||
| private final ContestRepository contestRepository; | ||
| private final NotificationRepository notificationRepository; | ||
| private final ExerciseBookmarkRepository exerciseBookmarkRepository; | ||
| private final PartyBookmarkRepository partyBookmarkRepository; | ||
| private final ChatRoomMemberRepository chatRoomMemberRepository; | ||
| private final ChatMessageRepository chatMessageRepository; | ||
| private final MessageReadStatusRepository messageReadStatusRepository; | ||
| private final PartyJoinRequestRepository partyJoinRequestRepository; | ||
| private final FileService fileService; | ||
|
|
||
| // 매일 새벽 3시에 탈퇴 후 14일이 지난 회원 데이터 하드 딜리트 | ||
| @Scheduled(cron = "0 0 3 * * *") | ||
| @Transactional | ||
| public void deleteExpiredWithdrawnMembers() { | ||
| LocalDateTime threshold = LocalDateTime.now().minusDays(14); | ||
| List<Member> targets = memberRepository.findAllByIsActiveAndDeletedAtBefore( | ||
| MemberStatus.INACTIVE, threshold); | ||
|
|
||
| if (targets.isEmpty()) { | ||
| return; | ||
| } | ||
|
|
||
| List<Long> memberIds = targets.stream().map(Member::getId).toList(); | ||
|
|
||
| // S3 프로필 이미지 삭제 (DB 삭제 전에 처리) | ||
| targets.stream() | ||
| .filter(m -> m.getProfileImg() != null) | ||
| .forEach(m -> fileService.delete(m.getProfileImg().getImgKey())); | ||
|
|
||
| // Contest 자식 테이블 먼저 (FK: contest_id) | ||
| contestRepository.deleteContestVideosByMemberIds(memberIds); | ||
| contestRepository.deleteContestImgsByMemberIds(memberIds); | ||
| contestRepository.deleteByMemberIds(memberIds); | ||
|
|
||
| // sender_id null 처리 (메시지 보존) | ||
| chatMessageRepository.nullifySenderByMemberIds(memberIds); | ||
|
|
||
| // 나머지 자식 테이블 일괄 삭제 | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 현재 자식 테이블 중 partyInvitationRepository에 대한 삭제 로직이 누락된 것 같습니다! 확인 부탁드립니다~ |
||
| messageReadStatusRepository.deleteByMemberIds(memberIds); | ||
| partyJoinRequestRepository.deleteByMemberIds(memberIds); | ||
| memberTermsRepository.deleteByMemberIds(memberIds); | ||
| notificationRepository.deleteByMemberIds(memberIds); | ||
| memberKeywordRepository.deleteByMemberIds(memberIds); | ||
| memberAddrRepository.deleteByMemberIds(memberIds); | ||
| chatRoomMemberRepository.deleteByMemberIds(memberIds); | ||
| exerciseBookmarkRepository.deleteByMemberIds(memberIds); | ||
| partyBookmarkRepository.deleteByMemberIds(memberIds); | ||
| memberPartyRepository.deleteByMemberIds(memberIds); | ||
| memberExerciseRepository.deleteByMemberIds(memberIds); | ||
| profileImgRepository.deleteByMemberIds(memberIds); | ||
|
|
||
| // Member 일괄 삭제 | ||
| memberRepository.deleteByMemberIds(memberIds); | ||
|
|
||
| log.info("[CLEANUP] 탈퇴 회원 하드 딜리트 완료 - {}명", memberIds.size()); | ||
| } | ||
| } | ||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이거 cron 시간 설정할 때 zone을 서울로 넣어줘야 저희가 생각하는 그 시간에 돌더라구요!