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

회원 서비스 관련 기능을 분리한다. #57

Open
KIMSEI1124 opened this issue Jan 11, 2025 · 0 comments
Open

회원 서비스 관련 기능을 분리한다. #57

KIMSEI1124 opened this issue Jan 11, 2025 · 0 comments

Comments

@KIMSEI1124
Copy link
Member

KIMSEI1124 commented Jan 11, 2025

📑 개요

@Transactional(readOnly = true)
@RequiredArgsConstructor
@Service
public class AuthServiceImpl {
	private final GoogleOAuthClient googleOAuthClient;
	private final SocialMemberRepository socialMemberRepository;
	private final MemberRepository memberRepository;
	private final AuthDomainServiceImpl authDomainService;

	@Transactional
	public AuthTokensResponse generateToken(final String provider, final String code) {
		GoogleTokenResponse googleTokenResponse = googleOAuthClient.fetchGoogleOAuthToken(code);

		GoogleUserInfoResponse googleUserInfoResponse = googleOAuthClient.fetchUserInfo(
			googleTokenResponse.accessToken());

		long memberId = findMemberIdAfterSaveMember(googleTokenResponse.accessToken(), googleUserInfoResponse);

		authDomainService.saveToken(googleTokenResponse.accessToken(), googleTokenResponse.refreshToken());

		return AuthTokensResponse.of(memberId, googleTokenResponse);
	}

	@Transactional
	public AuthTokensResponse reissueToken(final String accessToken, final String refreshToken) {
		if (isInvalidRefreshToken(accessToken, refreshToken)) {
			throw new GoogleOAuthException(GoogleOAuthErrorCode.NOT_AUTHORIZATION_MEMBER);
		}

		GoogleTokenResponse googleTokenResponse = googleOAuthClient.fetchRefreshGoogleOAuthToken(refreshToken);

		authDomainService.deleteToken(accessToken);
		authDomainService.saveToken(googleTokenResponse.accessToken(), refreshToken);

		return AuthTokensResponse.of(googleTokenResponse.accessToken(), refreshToken);
	}

	@Transactional
	public void logout(AuthMember authMember) {
		deleteToken(authMember);
	}

	@Transactional
	public void quitMember(AuthMember authMember) {
		// Todo : 회원 탈퇴 로직 논의
		deleteToken(authMember);
		deleteMember(authMember);
	}

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

	private void deleteMember(AuthMember authMember) {
		memberRepository.deleteById(authMember.id());
	}

	private boolean isInvalidRefreshToken(String accessToken, String refreshToken) {
		return refreshToken.isEmpty() || !refreshToken.equals(authDomainService.getRefreshToken(accessToken));
	}

	private long findMemberIdAfterSaveMember(String accessToken, GoogleUserInfoResponse googleUserInfoResponse) {
		if (isNewMember(googleUserInfoResponse)) {
			LocalDate birthday = googleOAuthClient.fetchBirthday(accessToken);

			MemberSaveDto memberSaveDto = MemberSaveDto.builder()
				.email(googleUserInfoResponse.email())
				.birthday(birthday)
				.nickname(googleUserInfoResponse.name())
				.profileImage(googleUserInfoResponse.picture())
				.build();

			SocialMemberSaveDto socialMemberSaveDto = SocialMemberSaveDto.builder()
				.oauthProvider(OauthProvider.GOOGLE)
				.oauthId(googleUserInfoResponse.id())
				.build();

			return authDomainService.saveAuthData(memberSaveDto, socialMemberSaveDto);
		}

		return SocialMemberRepositoryUtils.getSocialMember(socialMemberRepository, googleUserInfoResponse.id()).getId();
	}

	private boolean isNewMember(GoogleUserInfoResponse googleUserInfoResponse) {
		return !socialMemberRepository.existsByOauthProviderAndOauthId(OauthProvider.GOOGLE,
			googleUserInfoResponse.id());
	}
}

해당 서비스는 사용자의 인증과 관련된 서비스를 제공합니다.
그러나 현재 “회원 탈퇴”와 같은 기능이 포함되어 있어 토큰 관련 기능과의 연관성이 부족한 부분이 있습니다.

“회원 탈퇴” 기능은 인증 서비스의 범위를 벗어나므로, MemberService로 분리하는 것이 더 적절하다고 판단됩니다.
따라서 이번 이슈에서는 서비스의 역할을 명확히 하기 위해 분리해야 할 메서드를 파악하고, 이를 MemberService로 이동하는 작업을 진행하고자 합니다.

이 작업을 통해 서비스의 책임을 명확히 분리하고, 코드의 가독성과 유지보수성을 개선할 수 있을 것으로 생각합니다.

🚀 상세 작업 내용


1. 분리 대상 메서드 파악

  • 인증 서비스 내 “회원 탈퇴” 관련 메서드 확인
  • 해당 메서드가 다른 기능과 의존성을 가지는지 분석

2. MemberService 생성 및 메서드 이동

  • 새로운 MemberService 클래스(혹은 컴포넌트) 생성
  • “회원 탈퇴” 관련 비즈니스 로직을 MemberService로 이동
  • 이동된 메서드에 필요한 의존성 주입 및 테스트 추가

3. 서비스 간 호출 및 의존성 수정

  • AuthService에서 “회원 탈퇴” 호출 제거
  • 필요한 경우 MemberService를 인증 서비스에서 호출하도록 의존성 재설정

4. 테스트 코드 수정 및 추가

  • 변경된 구조에 맞게 기존 테스트 코드 수정
  • 신규 작성된 MemberService의 단위 테스트 추가

⏰ 예상 소요 시간


4시간

📁 ETC


@KIMSEI1124 KIMSEI1124 changed the title 새로운 기능에 대한 내용을 작성해주세요 회원 서비스 관련 기능을 분리한다. Jan 12, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
Status: No status
Development

No branches or pull requests

1 participant