diff --git a/src/main/java/com/grepp/spring/app/model/group/service/GroupCommandService.java b/src/main/java/com/grepp/spring/app/model/group/service/GroupCommandService.java index 90ba3edf..53d90d33 100644 --- a/src/main/java/com/grepp/spring/app/model/group/service/GroupCommandService.java +++ b/src/main/java/com/grepp/spring/app/model/group/service/GroupCommandService.java @@ -17,6 +17,7 @@ import com.grepp.spring.app.model.group.repository.GroupMemberCommandRepository; import com.grepp.spring.app.model.group.repository.GroupMemberRepository; import com.grepp.spring.app.model.member.entity.Member; +import com.grepp.spring.app.model.member.event.MemberWithdrawalEvent; import com.grepp.spring.app.model.member.repository.MemberRepository; import com.grepp.spring.app.model.schedule.code.ScheduleRole; import com.grepp.spring.app.model.schedule.entity.Schedule; @@ -38,6 +39,7 @@ import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.event.EventListener; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @@ -432,6 +434,14 @@ private void findScheduleMembersOrThrow(ScheduleToGroupRequest request) { } } + // 회원 탈퇴 이벤트 리스너 + @EventListener + @Transactional + public void handleMemberWithdrawal(MemberWithdrawalEvent event) { + Member member = event.getMember(); + handleGroupWithdrawal(member); + } + // 회원 탈퇴 중 그룹 관련 처리 메서드 @Transactional public void handleGroupWithdrawal(Member member) { diff --git a/src/main/java/com/grepp/spring/app/model/member/event/MemberWithdrawalEvent.java b/src/main/java/com/grepp/spring/app/model/member/event/MemberWithdrawalEvent.java new file mode 100644 index 00000000..ba1d56c9 --- /dev/null +++ b/src/main/java/com/grepp/spring/app/model/member/event/MemberWithdrawalEvent.java @@ -0,0 +1,16 @@ +package com.grepp.spring.app.model.member.event; + +import com.grepp.spring.app.model.member.entity.Member; +import lombok.Getter; +import org.springframework.context.ApplicationEvent; + +@Getter +public class MemberWithdrawalEvent extends ApplicationEvent { + + private final Member member; + + public MemberWithdrawalEvent(Object source, Member member) { + super(source); + this.member = member; + } +} \ No newline at end of file diff --git a/src/main/java/com/grepp/spring/app/model/member/service/MemberService.java b/src/main/java/com/grepp/spring/app/model/member/service/MemberService.java index 81406cbb..20a5582e 100644 --- a/src/main/java/com/grepp/spring/app/model/member/service/MemberService.java +++ b/src/main/java/com/grepp/spring/app/model/member/service/MemberService.java @@ -5,6 +5,7 @@ import com.grepp.spring.app.controller.api.member.payload.ModifyMemberInfoResponse; import com.grepp.spring.app.model.group.service.GroupCommandService; import com.grepp.spring.app.model.member.entity.Member; +import com.grepp.spring.app.model.member.event.MemberWithdrawalEvent; import com.grepp.spring.app.model.member.repository.MemberRepository; import com.grepp.spring.app.model.schedule.service.ScheduleCommandService; import com.grepp.spring.infra.error.exceptions.mypage.MemberNotFoundException; @@ -14,6 +15,7 @@ import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -25,8 +27,7 @@ public class MemberService { private final MemberRepository memberRepository; private final AuthService authService; - private final GroupCommandService groupCommandService; - private final ScheduleCommandService scheduleCommandService; + private final ApplicationEventPublisher eventPublisher; public Optional findById(String userId) { return memberRepository.findById(userId); @@ -75,14 +76,14 @@ public ModifyMemberInfoResponse modifyProfileImage(String userId) { public void withdraw(String userId, HttpServletResponse response, HttpServletRequest request) { Member member = memberRepository.findById(userId) .orElseThrow(() -> new MemberNotFoundException(MyPageErrorCode.MEMBER_NOT_FOUND)); - // 1. 그룹 관련 - groupCommandService.handleGroupWithdrawal(member); - // 2. 일정 관련 - scheduleCommandService.handleScheduleWithdrawal(member); - // 3. 회원 탈퇴(삭제) + + // 1. 회원 탈퇴 이벤트 발행 + eventPublisher.publishEvent(new MemberWithdrawalEvent(this, member)); + + // 2. 회원 탈퇴(삭제) memberRepository.delete(member); log.info("회원 탈퇴가 완료되었습니다. 회원 ID: {}, 회원명: {}", member.getId(), member.getName()); - // 4. 로그아웃 (토큰 무효화) + // 3. 로그아웃 (토큰 무효화) authService.logout(request, response); // 다른 서비스 참조. 괜찮은가 ? SecurityContextHolder.clearContext(); } diff --git a/src/main/java/com/grepp/spring/app/model/schedule/service/ScheduleCommandService.java b/src/main/java/com/grepp/spring/app/model/schedule/service/ScheduleCommandService.java index 23b118f0..aa0cffb1 100644 --- a/src/main/java/com/grepp/spring/app/model/schedule/service/ScheduleCommandService.java +++ b/src/main/java/com/grepp/spring/app/model/schedule/service/ScheduleCommandService.java @@ -8,6 +8,7 @@ import com.grepp.spring.app.controller.api.schedule.payload.response.CreateSchedulesResponse; import com.grepp.spring.app.model.event.entity.Event; import com.grepp.spring.app.model.member.entity.Member; +import com.grepp.spring.app.model.member.event.MemberWithdrawalEvent; import com.grepp.spring.app.model.member.repository.MemberRepository; import com.grepp.spring.app.model.schedule.code.MeetingPlatform; import com.grepp.spring.app.model.schedule.code.ScheduleRole; @@ -29,6 +30,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.event.EventListener; import org.springframework.http.*; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -555,6 +557,14 @@ private Location saveSuggestedLocation(Schedule schedule, WriteSuggestedLocation return location; } + // 회원 탈퇴 이벤트 리스너 + @EventListener + @Transactional + public void handleMemberWithdrawal(MemberWithdrawalEvent event) { + Member member = event.getMember(); + handleScheduleWithdrawal(member); + } + // 회원 탈퇴 중 일정 관련 처리 메서드 @Transactional public void handleScheduleWithdrawal(Member member) {