Skip to content
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

Refactor: 회원 탈퇴 시 토큰 삭제 로직을 비동기 처리로 변경 #72

Open
wants to merge 5 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.wypl.wyplcore.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;

@Configuration
@EnableAsync
public class AsyncConfig {
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,4 @@ public interface AuthMemberFacade {
AuthTokensResponse generateToken(final String provider, final String code);
AuthTokensResponse reissueToken(final String accessToken, final String refreshToken);
void logout(final AuthMember authMember);
void quitMember(final AuthMember authMember);
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,19 +56,6 @@ public AuthTokensResponse reissueToken(final String accessToken, final String re
@Override
@Transactional
public void logout(final AuthMember authMember) {
deleteToken(authMember);
}

@Override
@Transactional
public void quitMember(final AuthMember authMember) {
// Todo : 회원 탈퇴 로직 논의
// Todo : deleteToken은 스프링에서 비동기 처리하고(토큰이 아니라 멤버 탈퇴가 중요한거다), deleteMember는 Member 쪽으로 옮기자
deleteToken(authMember);
memberService.deleteMember(authMember);
}

private void deleteToken(AuthMember authMember) {
tokenService.deleteToken(authMember.accessToken());
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.wypl.wyplcore.member.data;

public record MemberEventDto(
String accessToken
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.wypl.wyplcore.member.handler;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.transaction.event.TransactionPhase;
import org.springframework.transaction.event.TransactionalEventListener;

import com.wypl.wyplcore.member.data.MemberEventDto;
import com.wypl.wyplcore.token.service.TokenService;

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@Component
public class MemberEventListener {
private final TokenService tokenService;

@Async
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMPLETION)
public void deleteToken(MemberEventDto memberEventDto) {
tokenService.deleteToken(memberEventDto.accessToken());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.time.LocalDate;

import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -16,6 +17,7 @@
import com.wypl.jpamemberdomain.member.repository.MemberRepository;
import com.wypl.jpamemberdomain.member.repository.SocialMemberRepository;
import com.wypl.jpamemberdomain.member.utils.SocialMemberRepositoryUtils;
import com.wypl.wyplcore.member.data.MemberEventDto;

import lombok.RequiredArgsConstructor;

Expand All @@ -26,10 +28,13 @@ public class MemberService {
private final GoogleOAuthClient googleOAuthClient;
private final MemberRepository memberRepository;
private final SocialMemberRepository socialMemberRepository;
private final ApplicationEventPublisher applicationEventPublisher;

@Transactional
public void deleteMember(AuthMember authMember) {
// Todo : 회원 탈퇴 로직 변경 필요
memberRepository.deleteById(authMember.id());
applicationEventPublisher.publishEvent(new MemberEventDto(authMember.accessToken()));
}

@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,21 +141,4 @@ void logoutTest() {
// Then
verify(tokenService).deleteToken(anyString());
}

@DisplayName("회원탈퇴 로직이 정상적으로 동작한다.")
@Test
void quitMemberTest() {
// Given
AuthMember mockAuthMember = AuthMember.of(
1L,
"accessToken"
);

// When
authMemberFacade.quitMember(mockAuthMember);

// Then
verify(tokenService).deleteToken(anyString());
verify(memberService).deleteMember(any(AuthMember.class));
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.wypl.wyplcore.member.service;

import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentCaptor.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.BDDMockito.*;

Expand All @@ -14,9 +15,12 @@
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.EnumSource;
import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.test.context.event.RecordApplicationEvents;

import com.wypl.googleoauthclient.GoogleOAuthClient;
import com.wypl.googleoauthclient.data.response.GoogleUserInfoResponse;
Expand All @@ -26,8 +30,10 @@
import com.wypl.jpamemberdomain.member.domain.SocialMember;
import com.wypl.jpamemberdomain.member.repository.MemberRepository;
import com.wypl.jpamemberdomain.member.repository.SocialMemberRepository;
import com.wypl.wyplcore.member.data.MemberEventDto;
import com.wypl.wyplcore.member.fixture.MemberFixture;

@RecordApplicationEvents
@ExtendWith(MockitoExtension.class)
public class MemberServiceTest {
@InjectMocks
Expand All @@ -38,6 +44,8 @@ public class MemberServiceTest {
private GoogleOAuthClient googleOAuthClient;
@Mock
private SocialMemberRepository socialMemberRepository;
@Mock
private ApplicationEventPublisher applicationEventPublisher;

@DisplayName("Member를 정상적으로 삭제한다.")
@Test
Expand All @@ -53,6 +61,14 @@ void quitMemberTest() {

// Then
verify(memberRepository).deleteById(anyLong());

// ArgumentCaptor를 사용하여 이벤트 캡처 (파라미터 캡처)
ArgumentCaptor<MemberEventDto> eventCaptor = forClass(MemberEventDto.class);
verify(applicationEventPublisher).publishEvent(eventCaptor.capture());

// 캡처된 이벤트 검증 (파라미터 검증)
MemberEventDto capturedEvent = eventCaptor.getValue();
assertThat(capturedEvent.accessToken()).isEqualTo("accessToken");
}

@DisplayName("로그인 및 회원가입 로직을 테스트한다.")
Expand Down
12 changes: 0 additions & 12 deletions domain/auth-domain/build.gradle

This file was deleted.

Empty file.

This file was deleted.

This file was deleted.

This file was deleted.

Empty file.

This file was deleted.

Loading