Skip to content

Conversation

@leeseojun34
Copy link
Member

✅ 관련 이슈

🛠️ 작업 내용

  • 회원 탈퇴 로직의 서비스 간 결합도를 낮추기 위해 Observer 패턴을 적용하여 리팩토링을 진행

  • AS-IS

    • MemberService의 withdraw 메서드가 회원 탈퇴 시 필요한 후속 처리를 위해 GroupCommandService, ScheduleCommandService 등 다른 서비스의 메서드를 직접 호출
    • MemberService가 다른 도메인의 탈퇴 처리 로직까지 알아야 하는 강한 결합 구조가 형성됨
    • 향후 회원 탈퇴와 관련된 새로운 기능이 추가될 때마다 MemberService의 수정이 불가피하여 OCP 원칙을 위반할 가능성이 높음
  • TO-BE

    • Spring의 이벤트 메커니즘(ApplicationEventPublisher)을 활용하여 Observer 패턴을 구현
    • MemberService: 이제 회원 탈퇴 시 MemberWithdrawalEvent라는 이벤트를 발행하는 역할만 수행 -> 더 이상 그룹이나 일정 서비스에 직접 의존하지 않음
    • GroupCommandService & ScheduleCommandService: 각각 EventListener를 통해 MemberWithdrawalEvent를 구독. 이벤트가 발생하면, 각 서비스는 자신에게 필요한 작업(예: 그룹 데이터 정리, 일정 마스터 위임)을 독립적으로 수행

📸 스크린샷

withdraw.sql 상황에서 5a 사용자가 회원 탈퇴
image

[문제]
- 기존의 회원 탈퇴(`withdraw`) 로직은 MemberService가 GroupCommandService, ScheduleCommandService 들을 직접 호출하는 구조
- 서비스 간의 의존성이 높아져 코드의 유연성과 확장성이 저하되는 문제 발생

[접근]
Spring의 ApplicationEventPublisher를 사용하여 Observer 패턴을 적용

[변경 사항]
- MemberWithdrawalEvent: 회원 탈퇴 시 발행할 이벤트를 정의
- MemberService: ApplicationEventPublisher를 주입받아, 회원 탈퇴가 발생하면 MemberWithdrawalEvent를 발행하도록 withdraw 메서드를 변경, GroupCommandService와 ScheduleCommandService에 대한 직접적인 의존성을 제거
- Group/ScheduleCommandService: @eventlistener 어노테이션을 사용하여 MemberWithdrawalEvent를 구독하는 메서드를 각 서비스에 추가, 각 서비스는 회원 탈퇴 이벤트를 감지하여 그룹 탈퇴 처리, 일정 관리자 위임 등 관련된 후속 작업을 독립적으로 수행

향후 회원 탈퇴 시 추가적인 작업이 필요할 경우 다른 서비스 코드의 수정 없이 새로운 리스너를 추가하는 것만으로 간단하게 확장할 수 있음
@leeseojun34 leeseojun34 self-assigned this Sep 11, 2025
@leeseojun34 leeseojun34 added the ♻️ refactor 리팩토링 label Sep 11, 2025
@qkqehenr7
Copy link
Collaborator

굿굿

@leeseojun34 leeseojun34 merged commit 2f55f00 into prgrms-web-devcourse-final-project:main Sep 13, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

♻️ refactor 리팩토링

Projects

None yet

Development

Successfully merging this pull request may close these issues.

리팩터링 - 회원 탈퇴

3 participants