From 5d382989dd6eab8359a2563f27ce5833605203eb Mon Sep 17 00:00:00 2001 From: sjhjack Date: Sat, 25 Jan 2025 16:54:19 +0900 Subject: [PATCH 01/17] =?UTF-8?q?Move(#67):=20findMemberIdAfterSaveMember?= =?UTF-8?q?=20=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/service/AuthServiceImpl.java | 36 +--------------- .../member/service/MemberServiceImpl.java | 41 +++++++++++++++++++ 2 files changed, 42 insertions(+), 35 deletions(-) diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthServiceImpl.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthServiceImpl.java index f208ebf..168fc59 100644 --- a/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthServiceImpl.java +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthServiceImpl.java @@ -1,7 +1,5 @@ package com.wypl.wyplcore.auth.service; -import java.time.LocalDate; - import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -12,11 +10,6 @@ import com.wypl.googleoauthclient.domain.AuthMember; import com.wypl.googleoauthclient.exception.GoogleOAuthErrorCode; import com.wypl.googleoauthclient.exception.GoogleOAuthException; -import com.wypl.jpamemberdomain.member.OauthProvider; -import com.wypl.jpamemberdomain.member.data.MemberSaveDto; -import com.wypl.jpamemberdomain.member.data.SocialMemberSaveDto; -import com.wypl.jpamemberdomain.member.repository.SocialMemberRepository; -import com.wypl.jpamemberdomain.member.utils.SocialMemberRepositoryUtils; import com.wypl.wyplcore.auth.data.response.AuthTokensResponse; import com.wypl.wyplcore.member.service.MemberServiceImpl; @@ -27,7 +20,6 @@ @Service public class AuthServiceImpl { private final GoogleOAuthClient googleOAuthClient; - private final SocialMemberRepository socialMemberRepository; private final AuthDomainServiceImpl authDomainService; private final MemberServiceImpl memberService; @@ -38,7 +30,7 @@ public AuthTokensResponse generateToken(final String provider, final String code GoogleUserInfoResponse googleUserInfoResponse = googleOAuthClient.fetchUserInfo( googleTokenResponse.accessToken()); - long memberId = findMemberIdAfterSaveMember(googleTokenResponse.accessToken(), googleUserInfoResponse); + long memberId = memberService.findMemberIdAfterSaveMember(googleTokenResponse.accessToken(), googleUserInfoResponse); authDomainService.saveToken(googleTokenResponse.accessToken(), googleTokenResponse.refreshToken()); @@ -80,32 +72,6 @@ private boolean isInvalidRefreshToken(String accessToken, String refreshToken) { } // todo: - 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(); - } - // todo: - private boolean isNewMember(GoogleUserInfoResponse googleUserInfoResponse) { - return !socialMemberRepository.existsByOauthProviderAndOauthId(OauthProvider.GOOGLE, - googleUserInfoResponse.id()); - } } diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java index 992d66b..b212c9e 100644 --- a/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java @@ -1,10 +1,20 @@ package com.wypl.wyplcore.member.service; +import java.time.LocalDate; + import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import com.wypl.authdomain.auth.service.AuthDomainServiceImpl; +import com.wypl.googleoauthclient.GoogleOAuthClient; +import com.wypl.googleoauthclient.data.response.GoogleUserInfoResponse; import com.wypl.googleoauthclient.domain.AuthMember; +import com.wypl.jpamemberdomain.member.OauthProvider; +import com.wypl.jpamemberdomain.member.data.MemberSaveDto; +import com.wypl.jpamemberdomain.member.data.SocialMemberSaveDto; import com.wypl.jpamemberdomain.member.repository.MemberRepository; +import com.wypl.jpamemberdomain.member.repository.SocialMemberRepository; +import com.wypl.jpamemberdomain.member.utils.SocialMemberRepositoryUtils; import lombok.RequiredArgsConstructor; @@ -13,9 +23,40 @@ @Service public class MemberServiceImpl { private final MemberRepository memberRepository; + private final GoogleOAuthClient googleOAuthClient; + private final AuthDomainServiceImpl authDomainService; + private final SocialMemberRepository socialMemberRepository; @Transactional public void deleteMember(AuthMember authMember) { memberRepository.deleteById(authMember.id()); } + + public 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(); + } + + // todo: + private boolean isNewMember(GoogleUserInfoResponse googleUserInfoResponse) { + return !socialMemberRepository.existsByOauthProviderAndOauthId(OauthProvider.GOOGLE, + googleUserInfoResponse.id()); + } } From 79deff30b0fa522fb7d6962d08c9728eecc444b6 Mon Sep 17 00:00:00 2001 From: sjhjack Date: Sat, 25 Jan 2025 16:55:48 +0900 Subject: [PATCH 02/17] =?UTF-8?q?Rename(#67):=20findMemberIdAfterSaveMembe?= =?UTF-8?q?r=20=EB=A9=94=EC=84=9C=EB=93=9C=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 메서드 명이 직관적이지 않다는 피드백을 받았습니다. 이에 After를 Or로 변경합니다. --- .../java/com/wypl/wyplcore/auth/service/AuthServiceImpl.java | 2 +- .../com/wypl/wyplcore/member/service/MemberServiceImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthServiceImpl.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthServiceImpl.java index 168fc59..2e92a97 100644 --- a/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthServiceImpl.java +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthServiceImpl.java @@ -30,7 +30,7 @@ public AuthTokensResponse generateToken(final String provider, final String code GoogleUserInfoResponse googleUserInfoResponse = googleOAuthClient.fetchUserInfo( googleTokenResponse.accessToken()); - long memberId = memberService.findMemberIdAfterSaveMember(googleTokenResponse.accessToken(), googleUserInfoResponse); + long memberId = memberService.findMemberIdOrSaveMember(googleTokenResponse.accessToken(), googleUserInfoResponse); authDomainService.saveToken(googleTokenResponse.accessToken(), googleTokenResponse.refreshToken()); diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java index b212c9e..1144a26 100644 --- a/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java @@ -32,7 +32,7 @@ public void deleteMember(AuthMember authMember) { memberRepository.deleteById(authMember.id()); } - public long findMemberIdAfterSaveMember(String accessToken, GoogleUserInfoResponse googleUserInfoResponse) { + public long findMemberIdOrSaveMember(String accessToken, GoogleUserInfoResponse googleUserInfoResponse) { if (isNewMember(googleUserInfoResponse)) { LocalDate birthday = googleOAuthClient.fetchBirthday(accessToken); From 62b96b3ce28df876f7b41922b885f420e83840bd Mon Sep 17 00:00:00 2001 From: sjhjack Date: Sat, 25 Jan 2025 18:24:09 +0900 Subject: [PATCH 03/17] =?UTF-8?q?Chore(#67):=20@Transactional=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20=EC=A3=BC=EC=84=9D=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/wypl/wyplcore/auth/service/AuthServiceImpl.java | 3 --- .../com/wypl/wyplcore/member/service/MemberServiceImpl.java | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthServiceImpl.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthServiceImpl.java index 2e92a97..0067345 100644 --- a/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthServiceImpl.java +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthServiceImpl.java @@ -70,8 +70,5 @@ private void deleteToken(AuthMember authMember) { private boolean isInvalidRefreshToken(String accessToken, String refreshToken) { return refreshToken.isEmpty() || !refreshToken.equals(authDomainService.getRefreshToken(accessToken)); } - - // todo: - } diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java index 1144a26..f11f6cc 100644 --- a/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java @@ -32,6 +32,7 @@ public void deleteMember(AuthMember authMember) { memberRepository.deleteById(authMember.id()); } + @Transactional public long findMemberIdOrSaveMember(String accessToken, GoogleUserInfoResponse googleUserInfoResponse) { if (isNewMember(googleUserInfoResponse)) { LocalDate birthday = googleOAuthClient.fetchBirthday(accessToken); @@ -54,7 +55,6 @@ public long findMemberIdOrSaveMember(String accessToken, GoogleUserInfoResponse return SocialMemberRepositoryUtils.getSocialMember(socialMemberRepository, googleUserInfoResponse.id()).getId(); } - // todo: private boolean isNewMember(GoogleUserInfoResponse googleUserInfoResponse) { return !socialMemberRepository.existsByOauthProviderAndOauthId(OauthProvider.GOOGLE, googleUserInfoResponse.id()); From 7d3c3601b2835854e4950f6f0b76e54748c96948 Mon Sep 17 00:00:00 2001 From: sjhjack Date: Sat, 25 Jan 2025 18:32:40 +0900 Subject: [PATCH 04/17] =?UTF-8?q?Feat(#67):=20AuthMemberFacade=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AuthService, MemberService, AuthDomainService 간 의존성 제거를 위해 Facade Layer 추가 --- .../wyplcore/facade/AuthMemberFacade.java | 11 +++ .../wyplcore/facade/AuthMemberFacadeImpl.java | 77 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacade.java create mode 100644 application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacadeImpl.java diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacade.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacade.java new file mode 100644 index 0000000..7c755e8 --- /dev/null +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacade.java @@ -0,0 +1,11 @@ +package com.wypl.wyplcore.facade; + +import com.wypl.googleoauthclient.domain.AuthMember; +import com.wypl.wyplcore.auth.data.response.AuthTokensResponse; + +public interface AuthMemberFacade { + public AuthTokensResponse generateToken(final String provider, final String code); + public AuthTokensResponse reissueToken(final String accessToken, final String refreshToken); + public void logout(AuthMember authMember); + public void quitMember(AuthMember authMember); +} diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacadeImpl.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacadeImpl.java new file mode 100644 index 0000000..a4322c2 --- /dev/null +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacadeImpl.java @@ -0,0 +1,77 @@ +package com.wypl.wyplcore.facade; + +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import com.wypl.authdomain.auth.service.AuthDomainServiceImpl; +import com.wypl.googleoauthclient.GoogleOAuthClient; +import com.wypl.googleoauthclient.data.response.GoogleTokenResponse; +import com.wypl.googleoauthclient.data.response.GoogleUserInfoResponse; +import com.wypl.googleoauthclient.domain.AuthMember; +import com.wypl.googleoauthclient.exception.GoogleOAuthErrorCode; +import com.wypl.googleoauthclient.exception.GoogleOAuthException; +import com.wypl.wyplcore.auth.data.response.AuthTokensResponse; +import com.wypl.wyplcore.member.service.MemberServiceImpl; + +import lombok.RequiredArgsConstructor; + +@Transactional(readOnly = true) +@RequiredArgsConstructor +@Component +public class AuthMemberFacadeImpl implements AuthMemberFacade { + private final GoogleOAuthClient googleOAuthClient; + private final AuthDomainServiceImpl authDomainService; + private final MemberServiceImpl memberService; + + @Override + @Transactional + public AuthTokensResponse generateToken(final String provider, final String code) { + GoogleTokenResponse googleTokenResponse = googleOAuthClient.fetchGoogleOAuthToken(code); + + GoogleUserInfoResponse googleUserInfoResponse = googleOAuthClient.fetchUserInfo( + googleTokenResponse.accessToken()); + + long memberId = memberService.findMemberIdOrSaveMember(googleTokenResponse.accessToken(), googleUserInfoResponse); + + authDomainService.saveToken(googleTokenResponse.accessToken(), googleTokenResponse.refreshToken()); + + return AuthTokensResponse.of(memberId, googleTokenResponse); + } + + @Override + @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); + } + + @Override + @Transactional + public void logout(AuthMember authMember) { + deleteToken(authMember); + } + + @Override + @Transactional + public void quitMember(AuthMember authMember) { + // Todo : 회원 탈퇴 로직 논의 + deleteToken(authMember); + memberService.deleteMember(authMember); + } + + private void deleteToken(AuthMember authMember) { + authDomainService.deleteToken(authMember.accessToken()); + } + + private boolean isInvalidRefreshToken(String accessToken, String refreshToken) { + return refreshToken.isEmpty() || !refreshToken.equals(authDomainService.getRefreshToken(accessToken)); + } +} From a7f4358a9a4004b898e2b285f912a4c06b28b22d Mon Sep 17 00:00:00 2001 From: sjhjack Date: Sat, 25 Jan 2025 18:38:42 +0900 Subject: [PATCH 05/17] =?UTF-8?q?Refactor(#67):=20saveAuthData=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EB=A6=AC=ED=8E=99=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AuthDomainServiceImpl -> MemberServiceImpl 위치 변경 public -> private 변경 saveAuthData -> saveNewMember 메서드명 변경 --- .../wyplcore/member/service/MemberServiceImpl.java | 10 +++++++++- .../auth/service/AuthDomainServiceImpl.java | 11 +---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java index f11f6cc..95bb00b 100644 --- a/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java @@ -12,6 +12,8 @@ import com.wypl.jpamemberdomain.member.OauthProvider; import com.wypl.jpamemberdomain.member.data.MemberSaveDto; import com.wypl.jpamemberdomain.member.data.SocialMemberSaveDto; +import com.wypl.jpamemberdomain.member.domain.Member; +import com.wypl.jpamemberdomain.member.domain.SocialMember; import com.wypl.jpamemberdomain.member.repository.MemberRepository; import com.wypl.jpamemberdomain.member.repository.SocialMemberRepository; import com.wypl.jpamemberdomain.member.utils.SocialMemberRepositoryUtils; @@ -49,7 +51,7 @@ public long findMemberIdOrSaveMember(String accessToken, GoogleUserInfoResponse .oauthId(googleUserInfoResponse.id()) .build(); - return authDomainService.saveAuthData(memberSaveDto, socialMemberSaveDto); + return saveNewMember(memberSaveDto, socialMemberSaveDto); } return SocialMemberRepositoryUtils.getSocialMember(socialMemberRepository, googleUserInfoResponse.id()).getId(); @@ -59,4 +61,10 @@ private boolean isNewMember(GoogleUserInfoResponse googleUserInfoResponse) { return !socialMemberRepository.existsByOauthProviderAndOauthId(OauthProvider.GOOGLE, googleUserInfoResponse.id()); } + + private long saveNewMember(MemberSaveDto memberSaveDto, SocialMemberSaveDto socialMemberSaveDto) { + Member newMember = memberRepository.save(Member.of(memberSaveDto)); + SocialMember socialMember = socialMemberRepository.save(SocialMember.of(newMember, socialMemberSaveDto)); + return socialMember.getId(); + } } diff --git a/domain/auth-domain/src/main/java/com/wypl/authdomain/auth/service/AuthDomainServiceImpl.java b/domain/auth-domain/src/main/java/com/wypl/authdomain/auth/service/AuthDomainServiceImpl.java index 8028c93..00cb27c 100644 --- a/domain/auth-domain/src/main/java/com/wypl/authdomain/auth/service/AuthDomainServiceImpl.java +++ b/domain/auth-domain/src/main/java/com/wypl/authdomain/auth/service/AuthDomainServiceImpl.java @@ -3,10 +3,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import com.wypl.jpamemberdomain.member.data.MemberSaveDto; -import com.wypl.jpamemberdomain.member.data.SocialMemberSaveDto; -import com.wypl.jpamemberdomain.member.domain.Member; -import com.wypl.jpamemberdomain.member.domain.SocialMember; import com.wypl.jpamemberdomain.member.repository.MemberRepository; import com.wypl.jpamemberdomain.member.repository.SocialMemberRepository; import com.wypl.redistokendomain.TokenRepository; @@ -21,12 +17,7 @@ public class AuthDomainServiceImpl { private final SocialMemberRepository socialMemberRepository; private final TokenRepository tokenRepository; - @Transactional - public long saveAuthData(MemberSaveDto memberSaveDto, SocialMemberSaveDto socialMemberSaveDto) { - Member newMember = memberRepository.save(Member.of(memberSaveDto)); - SocialMember socialMember = socialMemberRepository.save(SocialMember.of(newMember, socialMemberSaveDto)); - return socialMember.getId(); - } + public boolean checkExistsToken(String accessToken) { return tokenRepository.checkExistsToken(accessToken); From 64086fff4da8b73314dbc248b730eb0bd7c4f4a8 Mon Sep 17 00:00:00 2001 From: sjhjack Date: Sat, 25 Jan 2025 18:42:13 +0900 Subject: [PATCH 06/17] =?UTF-8?q?Feat(#67):=20TokenService=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20Token=20Domain=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/wypl-core/build.gradle | 1 + .../token/service/TokenServiceImpl.java | 33 +++++++++++++++++++ .../auth/service/AuthDomainServiceImpl.java | 21 ------------ 3 files changed, 34 insertions(+), 21 deletions(-) create mode 100644 application/wypl-core/src/main/java/com/wypl/wyplcore/token/service/TokenServiceImpl.java diff --git a/application/wypl-core/build.gradle b/application/wypl-core/build.gradle index 1369f9c..b521914 100644 --- a/application/wypl-core/build.gradle +++ b/application/wypl-core/build.gradle @@ -18,6 +18,7 @@ dependencies { implementation project(':domain:jpa-member-domain') implementation project(':domain:auth-domain') implementation project(':domain:redis-embedded-domain') + implementation project(':domain:redis-token-domain') implementation project(':common') implementation 'org.springframework.boot:spring-boot-starter-actuator' diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/token/service/TokenServiceImpl.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/token/service/TokenServiceImpl.java new file mode 100644 index 0000000..cc969f7 --- /dev/null +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/token/service/TokenServiceImpl.java @@ -0,0 +1,33 @@ +package com.wypl.wyplcore.token.service; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.wypl.redistokendomain.TokenRepository; + +import lombok.RequiredArgsConstructor; + +@Transactional(readOnly = true) +@RequiredArgsConstructor +@Service +public class TokenServiceImpl { + private final TokenRepository tokenRepository; + + public boolean checkExistsToken(String accessToken) { + return tokenRepository.checkExistsToken(accessToken); + } + + @Transactional + public void saveToken(String accessToken, String refreshToken) { + tokenRepository.saveToken(accessToken, refreshToken); + } + + public String getRefreshToken(String accessToken) { + return tokenRepository.getRefreshToken(accessToken); + } + + @Transactional + public void deleteToken(String accessToken) { + tokenRepository.deleteToken(accessToken); + } +} diff --git a/domain/auth-domain/src/main/java/com/wypl/authdomain/auth/service/AuthDomainServiceImpl.java b/domain/auth-domain/src/main/java/com/wypl/authdomain/auth/service/AuthDomainServiceImpl.java index 00cb27c..5c7a42a 100644 --- a/domain/auth-domain/src/main/java/com/wypl/authdomain/auth/service/AuthDomainServiceImpl.java +++ b/domain/auth-domain/src/main/java/com/wypl/authdomain/auth/service/AuthDomainServiceImpl.java @@ -5,7 +5,6 @@ import com.wypl.jpamemberdomain.member.repository.MemberRepository; import com.wypl.jpamemberdomain.member.repository.SocialMemberRepository; -import com.wypl.redistokendomain.TokenRepository; import lombok.RequiredArgsConstructor; @@ -15,25 +14,5 @@ public class AuthDomainServiceImpl { private final MemberRepository memberRepository; private final SocialMemberRepository socialMemberRepository; - private final TokenRepository tokenRepository; - - - public boolean checkExistsToken(String accessToken) { - return tokenRepository.checkExistsToken(accessToken); - } - - @Transactional - public void saveToken(String accessToken, String refreshToken) { - tokenRepository.saveToken(accessToken, refreshToken); - } - - public String getRefreshToken(String accessToken) { - return tokenRepository.getRefreshToken(accessToken); - } - - @Transactional - public void deleteToken(String accessToken) { - tokenRepository.deleteToken(accessToken); - } } From 7abef259aaee38ca5d84b0d56d00f1e90a0bed5c Mon Sep 17 00:00:00 2001 From: sjhjack Date: Sat, 25 Jan 2025 18:44:21 +0900 Subject: [PATCH 07/17] =?UTF-8?q?Refactor(#67):=20TokenService=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=EC=82=AC=ED=95=AD=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wypl/wyplcore/auth/service/AuthMemberServiceImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthMemberServiceImpl.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthMemberServiceImpl.java index c76d9c7..b8690b8 100644 --- a/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthMemberServiceImpl.java +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthMemberServiceImpl.java @@ -2,7 +2,6 @@ import org.springframework.stereotype.Component; -import com.wypl.authdomain.auth.service.AuthDomainServiceImpl; import com.wypl.googleoauthclient.GoogleOAuthClient; import com.wypl.googleoauthclient.data.response.GoogleTokenValidationResponse; import com.wypl.googleoauthclient.domain.AuthMember; @@ -12,6 +11,7 @@ import com.wypl.jpamemberdomain.member.domain.SocialMember; import com.wypl.jpamemberdomain.member.repository.SocialMemberRepository; import com.wypl.jpamemberdomain.member.utils.SocialMemberRepositoryUtils; +import com.wypl.wyplcore.token.service.TokenServiceImpl; import lombok.RequiredArgsConstructor; @@ -20,7 +20,7 @@ public class AuthMemberServiceImpl implements AuthMemberService { private final GoogleOAuthClient googleOAuthClient; private final SocialMemberRepository socialMemberRepository; - private final AuthDomainServiceImpl authDomainService; + private final TokenServiceImpl tokenService; @Override public AuthMember getValidatedMemberId(String accessToken) { @@ -37,7 +37,7 @@ private GoogleTokenValidationResponse getGoogleTokenValidationResponse(String ac try { return googleOAuthClient.validateToken(accessToken); } catch (GoogleOAuthException e) { - if (authDomainService.checkExistsToken(accessToken)) { + if (tokenService.checkExistsToken(accessToken)) { throw new GoogleOAuthException(GoogleOAuthErrorCode.REFRESH_TOKEN); } throw new GoogleOAuthException(GoogleOAuthErrorCode.INVALID_TOKEN); From 9927e9b6e0dcb29efec5c3278076f43eb78b7e34 Mon Sep 17 00:00:00 2001 From: sjhjack Date: Sat, 25 Jan 2025 18:48:39 +0900 Subject: [PATCH 08/17] =?UTF-8?q?Refactor(#67):=20AuthMemberFacade=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wypl/wyplcore/auth/controller/AuthController.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/controller/AuthController.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/controller/AuthController.java index dcd6e8e..555bf30 100644 --- a/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/controller/AuthController.java +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/controller/AuthController.java @@ -12,7 +12,7 @@ import com.wypl.googleoauthclient.annotation.Authenticated; import com.wypl.googleoauthclient.domain.AuthMember; import com.wypl.wyplcore.auth.data.response.AuthTokensResponse; -import com.wypl.wyplcore.auth.service.AuthServiceImpl; +import com.wypl.wyplcore.facade.AuthMemberFacade; import lombok.RequiredArgsConstructor; @@ -20,14 +20,14 @@ @RequestMapping("/auth") @RestController public class AuthController { - private final AuthServiceImpl authService; + private final AuthMemberFacade authMemberFacade; @PostMapping("/v1/sign-in/{provider}") public WyplResponseEntity signIn( @PathVariable("provider") String provider, @RequestParam("code") String code ) { - AuthTokensResponse response = authService.generateToken(provider, code); + AuthTokensResponse response = authMemberFacade.generateToken(provider, code); return WyplResponseEntity.ok(response, "로그인에 성공하였습니다."); } @@ -36,7 +36,7 @@ public WyplResponseEntity reissue( @RequestParam("access_token") String accessToken, @RequestParam("refresh_token") String refreshToken ) { - AuthTokensResponse response = authService.reissueToken(accessToken, refreshToken); + AuthTokensResponse response = authMemberFacade.reissueToken(accessToken, refreshToken); return WyplResponseEntity.created(response, "토큰 재발급에 성공하였습니다."); } @@ -44,7 +44,7 @@ public WyplResponseEntity reissue( public WyplResponseEntity logout( @Authenticated AuthMember authMember ) { - authService.logout(authMember); + authMemberFacade.logout(authMember); return WyplResponseEntity.ok("로그아웃에 성공하였습니다."); } } From 694ea963a6405c5ea58cec91d9dc3a3c6646de8e Mon Sep 17 00:00:00 2001 From: sjhjack Date: Sat, 25 Jan 2025 18:49:56 +0900 Subject: [PATCH 09/17] =?UTF-8?q?Refactor(#67):=20TokenService=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wypl/wyplcore/facade/AuthMemberFacadeImpl.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacadeImpl.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacadeImpl.java index a4322c2..8734f0b 100644 --- a/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacadeImpl.java +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacadeImpl.java @@ -3,7 +3,6 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; -import com.wypl.authdomain.auth.service.AuthDomainServiceImpl; import com.wypl.googleoauthclient.GoogleOAuthClient; import com.wypl.googleoauthclient.data.response.GoogleTokenResponse; import com.wypl.googleoauthclient.data.response.GoogleUserInfoResponse; @@ -12,6 +11,7 @@ import com.wypl.googleoauthclient.exception.GoogleOAuthException; import com.wypl.wyplcore.auth.data.response.AuthTokensResponse; import com.wypl.wyplcore.member.service.MemberServiceImpl; +import com.wypl.wyplcore.token.service.TokenServiceImpl; import lombok.RequiredArgsConstructor; @@ -20,7 +20,7 @@ @Component public class AuthMemberFacadeImpl implements AuthMemberFacade { private final GoogleOAuthClient googleOAuthClient; - private final AuthDomainServiceImpl authDomainService; + private final TokenServiceImpl tokenService; private final MemberServiceImpl memberService; @Override @@ -33,7 +33,7 @@ public AuthTokensResponse generateToken(final String provider, final String code long memberId = memberService.findMemberIdOrSaveMember(googleTokenResponse.accessToken(), googleUserInfoResponse); - authDomainService.saveToken(googleTokenResponse.accessToken(), googleTokenResponse.refreshToken()); + tokenService.saveToken(googleTokenResponse.accessToken(), googleTokenResponse.refreshToken()); return AuthTokensResponse.of(memberId, googleTokenResponse); } @@ -47,8 +47,8 @@ public AuthTokensResponse reissueToken(final String accessToken, final String re GoogleTokenResponse googleTokenResponse = googleOAuthClient.fetchRefreshGoogleOAuthToken(refreshToken); - authDomainService.deleteToken(accessToken); - authDomainService.saveToken(googleTokenResponse.accessToken(), refreshToken); + tokenService.deleteToken(accessToken); + tokenService.saveToken(googleTokenResponse.accessToken(), refreshToken); return AuthTokensResponse.of(googleTokenResponse.accessToken(), refreshToken); } @@ -68,10 +68,10 @@ public void quitMember(AuthMember authMember) { } private void deleteToken(AuthMember authMember) { - authDomainService.deleteToken(authMember.accessToken()); + tokenService.deleteToken(authMember.accessToken()); } private boolean isInvalidRefreshToken(String accessToken, String refreshToken) { - return refreshToken.isEmpty() || !refreshToken.equals(authDomainService.getRefreshToken(accessToken)); + return refreshToken.isEmpty() || !refreshToken.equals(tokenService.getRefreshToken(accessToken)); } } From 504facf17332593fb2cf54b77fdc72d7ee46a9b6 Mon Sep 17 00:00:00 2001 From: sjhjack Date: Sat, 25 Jan 2025 19:00:34 +0900 Subject: [PATCH 10/17] =?UTF-8?q?Chore(#67):=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=88=9C=EC=84=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/wypl/wyplcore/member/service/MemberServiceImpl.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java index 95bb00b..2c09e0f 100644 --- a/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java @@ -5,7 +5,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import com.wypl.authdomain.auth.service.AuthDomainServiceImpl; import com.wypl.googleoauthclient.GoogleOAuthClient; import com.wypl.googleoauthclient.data.response.GoogleUserInfoResponse; import com.wypl.googleoauthclient.domain.AuthMember; @@ -24,9 +23,8 @@ @RequiredArgsConstructor @Service public class MemberServiceImpl { - private final MemberRepository memberRepository; private final GoogleOAuthClient googleOAuthClient; - private final AuthDomainServiceImpl authDomainService; + private final MemberRepository memberRepository; private final SocialMemberRepository socialMemberRepository; @Transactional From 3116c26927aa515baaf6832166e6fad3df564d58 Mon Sep 17 00:00:00 2001 From: sjhjack Date: Sun, 26 Jan 2025 16:40:22 +0900 Subject: [PATCH 11/17] =?UTF-8?q?Refactor(#67):=20Facade=20Layer=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Facade Layer 추가와 AuthDomainService의 제거로 인해 전체적인 코드가 변경되었습니다. 따라서 기존에 작성했던 테스트 코드를 변경 사항에 맞게 재작성했습니다. 또한, 기존 AuthServiceImpl -> AuthMemberFacadeImpl 로 클래스 명이 변경됨으로 인해 AuthServiceImplTest -> AuthMemberFacadeImplTest 로 변경했습니다. --- .../auth/controller/AuthControllerTest.java | 8 +- .../service/AuthMemberFacadeImplTest.java | 161 +++++++++++++ .../auth/service/AuthServiceImplTest.java | 215 ------------------ .../member/fixture/MemberFixture.java | 55 +++++ .../member/service/MemberServiceImplTest.java | 93 +++++++- .../token/service/TokenServiceImplTest.java | 61 +++++ 6 files changed, 373 insertions(+), 220 deletions(-) create mode 100644 application/wypl-core/src/test/java/com/wypl/wyplcore/auth/service/AuthMemberFacadeImplTest.java delete mode 100644 application/wypl-core/src/test/java/com/wypl/wyplcore/auth/service/AuthServiceImplTest.java create mode 100644 application/wypl-core/src/test/java/com/wypl/wyplcore/member/fixture/MemberFixture.java create mode 100644 application/wypl-core/src/test/java/com/wypl/wyplcore/token/service/TokenServiceImplTest.java diff --git a/application/wypl-core/src/test/java/com/wypl/wyplcore/auth/controller/AuthControllerTest.java b/application/wypl-core/src/test/java/com/wypl/wyplcore/auth/controller/AuthControllerTest.java index 1ea038c..913e461 100644 --- a/application/wypl-core/src/test/java/com/wypl/wyplcore/auth/controller/AuthControllerTest.java +++ b/application/wypl-core/src/test/java/com/wypl/wyplcore/auth/controller/AuthControllerTest.java @@ -31,7 +31,7 @@ import com.wypl.googleoauthclient.utils.AuthenticatedArgumentResolver; import com.wypl.wyplcore.WyplCoreTestApplication; import com.wypl.wyplcore.auth.data.response.AuthTokensResponse; -import com.wypl.wyplcore.auth.service.AuthServiceImpl; +import com.wypl.wyplcore.facade.AuthMemberFacade; @AutoConfigureRestDocs @ContextConfiguration(classes = WyplCoreTestApplication.class) @@ -43,7 +43,7 @@ class AuthControllerTest { @MockBean private AuthenticatedArgumentResolver authenticatedArgumentResolver; @MockBean - private AuthServiceImpl authService; + private AuthMemberFacade authMemberFacade; @MockBean private AuthMemberService authMemberService; @@ -52,7 +52,7 @@ class AuthControllerTest { void signInTest() throws Exception { /* Given */ AuthTokensResponse response = new AuthTokensResponse(0, "at", "rt"); - given(authService.generateToken(any(String.class), any(String.class))) + given(authMemberFacade.generateToken(any(String.class), any(String.class))) .willReturn(response); /* When */ @@ -95,7 +95,7 @@ void signInTest() throws Exception { void reissueTest() throws Exception { /* Given */ AuthTokensResponse response = new AuthTokensResponse(0, "at", "rt"); - given(authService.reissueToken(any(String.class), any(String.class))) + given(authMemberFacade.reissueToken(any(String.class), any(String.class))) .willReturn(response); /* When */ diff --git a/application/wypl-core/src/test/java/com/wypl/wyplcore/auth/service/AuthMemberFacadeImplTest.java b/application/wypl-core/src/test/java/com/wypl/wyplcore/auth/service/AuthMemberFacadeImplTest.java new file mode 100644 index 0000000..36677e3 --- /dev/null +++ b/application/wypl-core/src/test/java/com/wypl/wyplcore/auth/service/AuthMemberFacadeImplTest.java @@ -0,0 +1,161 @@ +package com.wypl.wyplcore.auth.service; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.BDDMockito.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullSource; +import org.junit.jupiter.params.provider.ValueSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import com.wypl.googleoauthclient.GoogleOAuthClient; +import com.wypl.googleoauthclient.data.response.GoogleTokenResponse; +import com.wypl.googleoauthclient.data.response.GoogleUserInfoResponse; +import com.wypl.googleoauthclient.domain.AuthMember; +import com.wypl.googleoauthclient.exception.GoogleOAuthErrorCode; +import com.wypl.googleoauthclient.exception.GoogleOAuthException; +import com.wypl.wyplcore.auth.data.response.AuthTokensResponse; +import com.wypl.wyplcore.facade.AuthMemberFacadeImpl; +import com.wypl.wyplcore.member.service.MemberServiceImpl; +import com.wypl.wyplcore.token.service.TokenServiceImpl; + +@ExtendWith(MockitoExtension.class) +class AuthMemberFacadeImplTest { + @InjectMocks + private AuthMemberFacadeImpl authMemberFacade; + @Mock + private GoogleOAuthClient googleOAuthClient; + @Mock + private TokenServiceImpl tokenService; + @Mock + private MemberServiceImpl memberService; + + @DisplayName("토큰을 성공적으로 발행한다.") + @Test + void generateTokenTest() { + // Given + GoogleTokenResponse mockGoogleTokenResponse = new GoogleTokenResponse( + "accessToken", + 3600, + "refreshToken", + "scope", + "idToken", + "tokenType" + ); + + GoogleUserInfoResponse mockGoogleUserInfoResponse = new GoogleUserInfoResponse( + "id", + "email", + "verifiedEmail", + "name", + "givenName", + "familyName" + ); + + given(googleOAuthClient.fetchGoogleOAuthToken(anyString())) + .willReturn(mockGoogleTokenResponse); + + given(googleOAuthClient.fetchUserInfo(anyString())) + .willReturn(mockGoogleUserInfoResponse); + + given(memberService.findMemberIdOrSaveMember(anyString(), any(GoogleUserInfoResponse.class))) + .willReturn(1L); + + // When + AuthTokensResponse result = authMemberFacade.generateToken("provider", "Authroization code"); + + // Then + verify(tokenService).saveToken(anyString(), anyString()); + assertThat(result.memberId()).isEqualTo(1L); + assertThat(result.accessToken()).isEqualTo(mockGoogleTokenResponse.accessToken()); + assertThat(result.refreshToken()).isEqualTo(mockGoogleTokenResponse.refreshToken()); + } + + @DisplayName("토큰 재발행 로직을 테스트한다.") + @Nested + class reissueTokenTest { + @DisplayName("유효하지 않은 리프레시 토큰으로 인해 인증되지 않은 회원 오류를 던진다.") + @ParameterizedTest + @ValueSource(strings = {"", "invalid Refresh Token"}) + @NullSource + void invalidRefreshTokenTest(String refreshToken) { + // Given + given(tokenService.getRefreshToken(anyString())) + .willReturn(refreshToken); + + // When & Then + assertThatThrownBy(() -> authMemberFacade.reissueToken("accessToken", "refreshToken")) + .isInstanceOf(GoogleOAuthException.class) + .hasMessageContaining(GoogleOAuthErrorCode.NOT_AUTHORIZATION_MEMBER.getMessage()); + } + + @DisplayName("토큰을 정상적으로 재발행한다.") + @Test + void reissueSuccessTest() { + // Given + GoogleTokenResponse mockGoogleTokenResponse = new GoogleTokenResponse( + "accessToken", + 3600, + "refreshToken", + "scope", + "idToken", + "tokenType" + ); + + given(tokenService.getRefreshToken(anyString())) + .willReturn("refreshToken"); + + given(googleOAuthClient.fetchRefreshGoogleOAuthToken(anyString())) + .willReturn(mockGoogleTokenResponse); + + // When + AuthTokensResponse result = authMemberFacade.reissueToken("accessToken", "refreshToken"); + + // Then + verify(tokenService).deleteToken(anyString()); + verify(tokenService).saveToken(anyString(), anyString()); + assertThat(result.accessToken()).isEqualTo(mockGoogleTokenResponse.accessToken()); + assertThat(result.refreshToken()).isEqualTo("refreshToken"); + } + } + + @DisplayName("로그아웃 로직이 정상적으로 동작한다.") + @Test + void logoutTest() { + // Given + AuthMember mockAuthMember = AuthMember.of( + 1L, + "accessToken" + ); + + // When + authMemberFacade.logout(mockAuthMember); + + // 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)); + } +} \ No newline at end of file diff --git a/application/wypl-core/src/test/java/com/wypl/wyplcore/auth/service/AuthServiceImplTest.java b/application/wypl-core/src/test/java/com/wypl/wyplcore/auth/service/AuthServiceImplTest.java deleted file mode 100644 index 00dcb23..0000000 --- a/application/wypl-core/src/test/java/com/wypl/wyplcore/auth/service/AuthServiceImplTest.java +++ /dev/null @@ -1,215 +0,0 @@ -package com.wypl.wyplcore.auth.service; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.BDDMockito.*; - -import java.time.LocalDate; -import java.util.Optional; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.NullSource; -import org.junit.jupiter.params.provider.ValueSource; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; - -import com.wypl.authdomain.auth.service.AuthDomainServiceImpl; -import com.wypl.googleoauthclient.GoogleOAuthClient; -import com.wypl.googleoauthclient.data.response.GoogleTokenResponse; -import com.wypl.googleoauthclient.data.response.GoogleUserInfoResponse; -import com.wypl.googleoauthclient.domain.AuthMember; -import com.wypl.googleoauthclient.exception.GoogleOAuthErrorCode; -import com.wypl.googleoauthclient.exception.GoogleOAuthException; -import com.wypl.jpamemberdomain.member.OauthProvider; -import com.wypl.jpamemberdomain.member.data.MemberSaveDto; -import com.wypl.jpamemberdomain.member.data.SocialMemberSaveDto; -import com.wypl.jpamemberdomain.member.domain.SocialMember; -import com.wypl.jpamemberdomain.member.repository.SocialMemberRepository; -import com.wypl.wyplcore.auth.data.response.AuthTokensResponse; -import com.wypl.wyplcore.member.service.MemberServiceImpl; - -@ExtendWith(MockitoExtension.class) -class AuthServiceImplTest { - @InjectMocks - private AuthServiceImpl authService; - @Mock - private GoogleOAuthClient googleOAuthClient; - @Mock - private SocialMemberRepository socialMemberRepository; - @Mock - private AuthDomainServiceImpl authDomainService; - @Mock - private MemberServiceImpl memberService; - - @DisplayName("로그인 및 회원가입 로직을 테스트한다.") - @Nested - class generateTokenTest { - private GoogleTokenResponse mockGoogleTokenResponse; - private GoogleUserInfoResponse mockGoogleUserInfoResponse; - - @BeforeEach - void setUp() { - mockGoogleTokenResponse = new GoogleTokenResponse( - "accessToken", - 3600, - "refreshToken", - "scope", - "idToken", - "tokenType" - ); - - mockGoogleUserInfoResponse = new GoogleUserInfoResponse( - "id", - "email", - "verifiedEmail", - "name", - "givenName", - "familyName" - ); - - given(googleOAuthClient.fetchGoogleOAuthToken(anyString())) - .willReturn(mockGoogleTokenResponse); - - given(googleOAuthClient.fetchUserInfo(anyString())) - .willReturn(mockGoogleUserInfoResponse); - } - - @DisplayName("이미 가입한 회원인 경우, 로그인에 성공한다.") - @Test - void signInTest() { - //Given - SocialMember mockSocialMember = SocialMember.builder() - .id(1L) - .oauthProvider(OauthProvider.GOOGLE) - .oauthId("mockOauthId") - .build(); - - given(socialMemberRepository.existsByOauthProviderAndOauthId(any(OauthProvider.class), anyString())) - .willReturn(true); - - given(socialMemberRepository.findByOauthProviderAndOauthId(any(OauthProvider.class), anyString())) - .willReturn(Optional.of(mockSocialMember)); - - // When - AuthTokensResponse result = authService.generateToken("provider", "Authroization code"); - - // Then - verify(authDomainService).saveToken(mockGoogleTokenResponse.accessToken(), - mockGoogleTokenResponse.refreshToken()); - assertThat(result.memberId()).isEqualTo(mockSocialMember.getId()); - assertThat(result.accessToken()).isEqualTo(mockGoogleTokenResponse.accessToken()); - assertThat(result.refreshToken()).isEqualTo(mockGoogleTokenResponse.refreshToken()); - } - - @DisplayName("신규 회원인 경우, 회원가입에 성공한다.") - @Test - void signUpTest() { - // Given - given(socialMemberRepository.existsByOauthProviderAndOauthId(any(OauthProvider.class), anyString())) - .willReturn(false); - - given(googleOAuthClient.fetchBirthday(anyString())) - .willReturn(LocalDate.now()); - - given(authDomainService.saveAuthData(any(MemberSaveDto.class), any(SocialMemberSaveDto.class))) - .willReturn(2L); - - // When - AuthTokensResponse result = authService.generateToken("provider", "Authroization code"); - - // Then - verify(authDomainService).saveToken(mockGoogleTokenResponse.accessToken(), - mockGoogleTokenResponse.refreshToken()); - assertThat(result.memberId()).isEqualTo(2L); - assertThat(result.accessToken()).isEqualTo(mockGoogleTokenResponse.accessToken()); - assertThat(result.refreshToken()).isEqualTo(mockGoogleTokenResponse.refreshToken()); - } - } - - @DisplayName("토큰 재발행 로직을 테스트한다.") - @Nested - class reissueTokenTest { - @DisplayName("유효하지 않은 리프레시 토큰으로 인해 인증되지 않은 회원 오류를 던진다.") - @ParameterizedTest - @ValueSource(strings = {"", "invalid Refresh Token"}) - @NullSource - void invalidRefreshTokenTest(String refreshToken) { - // Given - given(authDomainService.getRefreshToken(anyString())) - .willReturn(refreshToken); - - // When & Then - assertThatThrownBy(() -> authService.reissueToken("accessToken", "refreshToken")) - .isInstanceOf(GoogleOAuthException.class) - .hasMessageContaining(GoogleOAuthErrorCode.NOT_AUTHORIZATION_MEMBER.getMessage()); - } - - @DisplayName("토큰을 정상적으로 재발행한다.") - @Test - void reissueSuccessTest() { - // Given - GoogleTokenResponse mockGoogleTokenResponse = new GoogleTokenResponse( - "accessToken", - 3600, - "refreshToken", - "scope", - "idToken", - "tokenType" - ); - - given(authDomainService.getRefreshToken(anyString())) - .willReturn("refreshToken"); - - given(googleOAuthClient.fetchRefreshGoogleOAuthToken(anyString())) - .willReturn(mockGoogleTokenResponse); - - // When - AuthTokensResponse result = authService.reissueToken("accessToken", "refreshToken"); - - // Then - verify(authDomainService).deleteToken(anyString()); - verify(authDomainService).saveToken(anyString(), anyString()); - assertThat(result.accessToken()).isEqualTo(mockGoogleTokenResponse.accessToken()); - assertThat(result.refreshToken()).isEqualTo("refreshToken"); - } - } - - @DisplayName("로그아웃 로직이 정상적으로 동작한다.") - @Test - void logoutTest() { - // Given - AuthMember mockAuthMember = AuthMember.of( - 1L, - "accessToken" - ); - - // When - authService.logout(mockAuthMember); - - // Then - verify(authDomainService).deleteToken(anyString()); - } - - @DisplayName("회원탈퇴 로직이 정상적으로 동작한다.") - @Test - void quitMemberTest() { - // Given - AuthMember mockAuthMember = AuthMember.of( - 1L, - "accessToken" - ); - - // When - authService.quitMember(mockAuthMember); - - // Then - verify(authDomainService).deleteToken(anyString()); - verify(memberService).deleteMember(any(AuthMember.class)); - } -} \ No newline at end of file diff --git a/application/wypl-core/src/test/java/com/wypl/wyplcore/member/fixture/MemberFixture.java b/application/wypl-core/src/test/java/com/wypl/wyplcore/member/fixture/MemberFixture.java new file mode 100644 index 0000000..c0006b8 --- /dev/null +++ b/application/wypl-core/src/test/java/com/wypl/wyplcore/member/fixture/MemberFixture.java @@ -0,0 +1,55 @@ +package com.wypl.wyplcore.member.fixture; + +import java.time.LocalDate; +import java.util.UUID; + +import com.wypl.common.Color; +import com.wypl.jpamemberdomain.member.OauthProvider; +import com.wypl.jpamemberdomain.member.TimeZone; +import com.wypl.jpamemberdomain.member.domain.Member; +import com.wypl.jpamemberdomain.member.domain.SocialMember; + +// Todo : Access Level 고민해보자 +// @AllArgsConstructor +public enum MemberFixture { + JEONG_HOON(1L, "biosjh@gmail.com", "sjh", LocalDate.of(1999, 1, 15), "JHprofile", OauthProvider.GOOGLE) + ; + + private final Long memberId; + private final String email; + private final String nickname; + private final LocalDate birthday; + private final String profileImage; + private final OauthProvider oauthProvider; + + // @AllArgsConstructor 인식 불가로 인해, 명시적으로 생성자 추가 + MemberFixture(Long memberId, String email, String nickname, LocalDate birthday, String profileImage, OauthProvider oauthProvider) { + this.memberId = memberId; + this.email = email; + this.nickname = nickname; + this.birthday = birthday; + this.profileImage = profileImage; + this.oauthProvider = oauthProvider; + } + + public Member toMember() { + return Member.builder() + .memberId(memberId) + .email(email) + .nickname(nickname) + .birthday(birthday) + .profileImage(profileImage) + .color(Color.labelBrown) + .timeZone(TimeZone.KOREA) + .build(); + } + + public SocialMember toSocialMember() { + return SocialMember.builder() + .id(memberId) + .member(toMember()) + .oauthProvider(oauthProvider) + .oauthId(UUID.randomUUID().toString()) + .build(); + } +} diff --git a/application/wypl-core/src/test/java/com/wypl/wyplcore/member/service/MemberServiceImplTest.java b/application/wypl-core/src/test/java/com/wypl/wyplcore/member/service/MemberServiceImplTest.java index 69f516f..c1615e5 100644 --- a/application/wypl-core/src/test/java/com/wypl/wyplcore/member/service/MemberServiceImplTest.java +++ b/application/wypl-core/src/test/java/com/wypl/wyplcore/member/service/MemberServiceImplTest.java @@ -1,17 +1,32 @@ package com.wypl.wyplcore.member.service; +import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; +import static org.mockito.BDDMockito.*; +import java.time.LocalDate; +import java.util.Optional; + +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.EnumSource; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import com.wypl.googleoauthclient.GoogleOAuthClient; +import com.wypl.googleoauthclient.data.response.GoogleUserInfoResponse; import com.wypl.googleoauthclient.domain.AuthMember; +import com.wypl.jpamemberdomain.member.OauthProvider; +import com.wypl.jpamemberdomain.member.domain.Member; +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.fixture.MemberFixture; @ExtendWith(MockitoExtension.class) public class MemberServiceImplTest { @@ -19,6 +34,10 @@ public class MemberServiceImplTest { private MemberServiceImpl memberService; @Mock private MemberRepository memberRepository; + @Mock + private GoogleOAuthClient googleOAuthClient; + @Mock + private SocialMemberRepository socialMemberRepository; @DisplayName("Member를 정상적으로 삭제한다.") @Test @@ -35,4 +54,76 @@ void quitMemberTest() { // Then verify(memberRepository).deleteById(anyLong()); } + + @DisplayName("로그인 및 회원가입 로직을 테스트한다.") + @Nested + class generateTokenTest { + private GoogleUserInfoResponse mockGoogleUserInfoResponse; + private String accessToken; + + @BeforeEach + void setUp() { + mockGoogleUserInfoResponse = new GoogleUserInfoResponse( + "id", + "email", + "verifiedEmail", + "name", + "givenName", + "familyName" + ); + + accessToken = "access_token"; + } + + @DisplayName("이미 가입한 회원인 경우, 로그인에 성공한다.") + @Test + void signInTest() { + // Given + SocialMember mockSocialMember = SocialMember.builder() + .id(1L) + .oauthProvider(OauthProvider.GOOGLE) + .oauthId("mockOauthId") + .build(); + + given(socialMemberRepository.existsByOauthProviderAndOauthId(any(OauthProvider.class), anyString())) + .willReturn(true); + + given(socialMemberRepository.findByOauthProviderAndOauthId(any(OauthProvider.class), anyString())) + .willReturn(Optional.of(mockSocialMember)); + + // When + long result = memberService.findMemberIdOrSaveMember(accessToken, mockGoogleUserInfoResponse); + + // Then + assertThat(result).isEqualTo(1L); + } + + @DisplayName("신규 회원인 경우, 회원가입에 성공한다.") + @ParameterizedTest + @EnumSource + void signUpTest(MemberFixture fixture) { + // Given + Member memberMock = fixture.toMember(); + + SocialMember socialMemberMock = fixture.toSocialMember(); + + given(memberRepository.save(any(Member.class))) + .willReturn(memberMock); + + given(socialMemberRepository.save(any(SocialMember.class))) + .willReturn(socialMemberMock); + + given(socialMemberRepository.existsByOauthProviderAndOauthId(any(OauthProvider.class), anyString())) + .willReturn(false); + + given(googleOAuthClient.fetchBirthday(anyString())) + .willReturn(LocalDate.now()); + + // When + long result = memberService.findMemberIdOrSaveMember(accessToken, mockGoogleUserInfoResponse); + + // Then + assertThat(result).isEqualTo(socialMemberMock.getId()); + } + } } diff --git a/application/wypl-core/src/test/java/com/wypl/wyplcore/token/service/TokenServiceImplTest.java b/application/wypl-core/src/test/java/com/wypl/wyplcore/token/service/TokenServiceImplTest.java new file mode 100644 index 0000000..347b3a8 --- /dev/null +++ b/application/wypl-core/src/test/java/com/wypl/wyplcore/token/service/TokenServiceImplTest.java @@ -0,0 +1,61 @@ +package com.wypl.wyplcore.token.service; + +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import com.wypl.redistokendomain.TokenRepository; + +@ExtendWith(MockitoExtension.class) +class TokenServiceImplTest { + @InjectMocks + private TokenServiceImpl tokenService; + @Mock + private TokenRepository tokenRepository; + + @DisplayName("Redis에 존재하는 토큰인지 확인한다.") + @Test + void checkExistsTokenTest() { + // When + tokenService.checkExistsToken(anyString()); + + // Then + verify(tokenRepository).checkExistsToken(anyString()); + } + + @DisplayName("Redis에 토큰을 저장한다.") + @Test + void saveTokenTest() { + // When + tokenService.saveToken(anyString(), anyString()); + + // Then + verify(tokenRepository).saveToken(anyString(), anyString()); + } + + @DisplayName("Redis에서 Access Token으로 Refresh Token 값을 가져온다.") + @Test + void getRefreshTokenTest() { + // When + tokenService.getRefreshToken(anyString()); + + // Then + verify(tokenRepository).getRefreshToken(anyString()); + } + + @DisplayName("Redis에 저장된 토큰 정보를 삭제한다.") + @Test + void deleteToken() { + // When + tokenService.deleteToken(anyString()); + + // Then + verify(tokenRepository).deleteToken(anyString()); + } +} \ No newline at end of file From 12c30010912889db2481ec93419f403378911639 Mon Sep 17 00:00:00 2001 From: sjhjack Date: Sun, 26 Jan 2025 16:44:17 +0900 Subject: [PATCH 12/17] =?UTF-8?q?Chore(#67):=20=EC=95=88=20=EC=93=B0?= =?UTF-8?q?=EB=8A=94=20=ED=8C=8C=EC=9D=BC=20=EC=9E=84=EC=8B=9C=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/service/AuthServiceImpl.java | 88 ++----- .../auth/service/AuthDomainServiceImpl.java | 36 +-- .../service/AuthDomainServiceImplTest.java | 222 +++++++++--------- 3 files changed, 143 insertions(+), 203 deletions(-) diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthServiceImpl.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthServiceImpl.java index 0067345..2000128 100644 --- a/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthServiceImpl.java +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthServiceImpl.java @@ -1,74 +1,14 @@ -package com.wypl.wyplcore.auth.service; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.wypl.authdomain.auth.service.AuthDomainServiceImpl; -import com.wypl.googleoauthclient.GoogleOAuthClient; -import com.wypl.googleoauthclient.data.response.GoogleTokenResponse; -import com.wypl.googleoauthclient.data.response.GoogleUserInfoResponse; -import com.wypl.googleoauthclient.domain.AuthMember; -import com.wypl.googleoauthclient.exception.GoogleOAuthErrorCode; -import com.wypl.googleoauthclient.exception.GoogleOAuthException; -import com.wypl.wyplcore.auth.data.response.AuthTokensResponse; -import com.wypl.wyplcore.member.service.MemberServiceImpl; - -import lombok.RequiredArgsConstructor; - -@Transactional(readOnly = true) -@RequiredArgsConstructor -@Service -public class AuthServiceImpl { - private final GoogleOAuthClient googleOAuthClient; - private final AuthDomainServiceImpl authDomainService; - private final MemberServiceImpl memberService; - - @Transactional - public AuthTokensResponse generateToken(final String provider, final String code) { - GoogleTokenResponse googleTokenResponse = googleOAuthClient.fetchGoogleOAuthToken(code); - - GoogleUserInfoResponse googleUserInfoResponse = googleOAuthClient.fetchUserInfo( - googleTokenResponse.accessToken()); - - long memberId = memberService.findMemberIdOrSaveMember(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); - memberService.deleteMember(authMember); - } - - private void deleteToken(AuthMember authMember) { - authDomainService.deleteToken(authMember.accessToken()); - } - - private boolean isInvalidRefreshToken(String accessToken, String refreshToken) { - return refreshToken.isEmpty() || !refreshToken.equals(authDomainService.getRefreshToken(accessToken)); - } -} - +// package com.wypl.wyplcore.auth.service; +// +// import org.springframework.stereotype.Service; +// import org.springframework.transaction.annotation.Transactional; +// +// import lombok.RequiredArgsConstructor; +// +// @Transactional(readOnly = true) +// @RequiredArgsConstructor +// @Service +// public class AuthServiceImpl { +// +// } +// diff --git a/domain/auth-domain/src/main/java/com/wypl/authdomain/auth/service/AuthDomainServiceImpl.java b/domain/auth-domain/src/main/java/com/wypl/authdomain/auth/service/AuthDomainServiceImpl.java index 5c7a42a..0cb55ff 100644 --- a/domain/auth-domain/src/main/java/com/wypl/authdomain/auth/service/AuthDomainServiceImpl.java +++ b/domain/auth-domain/src/main/java/com/wypl/authdomain/auth/service/AuthDomainServiceImpl.java @@ -1,18 +1,18 @@ -package com.wypl.authdomain.auth.service; - -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.wypl.jpamemberdomain.member.repository.MemberRepository; -import com.wypl.jpamemberdomain.member.repository.SocialMemberRepository; - -import lombok.RequiredArgsConstructor; - -@Transactional(readOnly = true) -@RequiredArgsConstructor -@Service -public class AuthDomainServiceImpl { - private final MemberRepository memberRepository; - private final SocialMemberRepository socialMemberRepository; - -} +// package com.wypl.authdomain.auth.service; +// +// import org.springframework.stereotype.Service; +// import org.springframework.transaction.annotation.Transactional; +// +// import com.wypl.jpamemberdomain.member.repository.MemberRepository; +// import com.wypl.jpamemberdomain.member.repository.SocialMemberRepository; +// +// import lombok.RequiredArgsConstructor; +// +// @Transactional(readOnly = true) +// @RequiredArgsConstructor +// @Service +// public class AuthDomainServiceImpl { +// private final MemberRepository memberRepository; +// private final SocialMemberRepository socialMemberRepository; +// +// } diff --git a/domain/auth-domain/src/test/java/com/wypl/authdomain/auth/service/AuthDomainServiceImplTest.java b/domain/auth-domain/src/test/java/com/wypl/authdomain/auth/service/AuthDomainServiceImplTest.java index a3ca62e..aebabc3 100644 --- a/domain/auth-domain/src/test/java/com/wypl/authdomain/auth/service/AuthDomainServiceImplTest.java +++ b/domain/auth-domain/src/test/java/com/wypl/authdomain/auth/service/AuthDomainServiceImplTest.java @@ -1,111 +1,111 @@ -package com.wypl.authdomain.auth.service; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.BDDMockito.*; - -import java.time.LocalDate; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.EnumSource; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; - -import com.wypl.authdomain.auth.service.fixture.MemberFixture; -import com.wypl.jpamemberdomain.member.OauthProvider; -import com.wypl.jpamemberdomain.member.data.MemberSaveDto; -import com.wypl.jpamemberdomain.member.data.SocialMemberSaveDto; -import com.wypl.jpamemberdomain.member.domain.Member; -import com.wypl.jpamemberdomain.member.domain.SocialMember; -import com.wypl.jpamemberdomain.member.repository.MemberRepository; -import com.wypl.jpamemberdomain.member.repository.SocialMemberRepository; -import com.wypl.redistokendomain.TokenRepository; - -@ExtendWith(MockitoExtension.class) -class AuthDomainServiceImplTest { - @InjectMocks - private AuthDomainServiceImpl authDomainService; - @Mock - private MemberRepository memberRepository; - @Mock - private SocialMemberRepository socialMemberRepository; - @Mock - private TokenRepository tokenRepository; - - @DisplayName("유저의 Auth 데이터를 저장한다.") - @ParameterizedTest - @EnumSource - void saveAuthDateTest(MemberFixture fixture) { - // Given - MemberSaveDto memberSaveDtoMock = MemberSaveDto.builder() - .email("email") - .nickname("nickname") - .birthday(LocalDate.of(1999, 1, 15)) - .profileImage("profileImage") - .build(); - - SocialMemberSaveDto socialMemberSaveDtoMock = SocialMemberSaveDto.builder() - .oauthProvider(OauthProvider.GOOGLE) - .oauthId("oauthId") - .build(); - - Member memberMock = fixture.toMember(); - - SocialMember socialMemberMock = fixture.toSocialMember(); - - given(memberRepository.save(any(Member.class))) - .willReturn(memberMock); - - given(socialMemberRepository.save(any(SocialMember.class))) - .willReturn(socialMemberMock); - - // When - long result = authDomainService.saveAuthData(memberSaveDtoMock, socialMemberSaveDtoMock); - - // Then - assertThat(result).isEqualTo(socialMemberMock.getId()); - } - - @DisplayName("Redis에 존재하는 토큰인지 확인한다.") - @Test - void checkExistsTokenTest() { - // When - authDomainService.checkExistsToken(anyString()); - - // Then - verify(tokenRepository).checkExistsToken(anyString()); - } - - @DisplayName("Redis에 토큰을 저장한다.") - @Test - void saveTokenTest() { - // When - authDomainService.saveToken(anyString(), anyString()); - - // Then - verify(tokenRepository).saveToken(anyString(), anyString()); - } - - @DisplayName("Redis에서 Access Token으로 Refresh Token 값을 가져온다.") - @Test - void getRefreshTokenTest() { - // When - authDomainService.getRefreshToken(anyString()); - - // Then - verify(tokenRepository).getRefreshToken(anyString()); - } - - @DisplayName("Redis에 저장된 토큰 정보를 삭제한다.") - @Test - void deleteToken() { - // When - authDomainService.deleteToken(anyString()); - - // Then - verify(tokenRepository).deleteToken(anyString()); - } -} \ No newline at end of file +// package com.wypl.authdomain.auth.service; +// +// import static org.assertj.core.api.Assertions.*; +// import static org.mockito.BDDMockito.*; +// +// import java.time.LocalDate; +// +// import org.junit.jupiter.api.DisplayName; +// import org.junit.jupiter.api.Test; +// import org.junit.jupiter.api.extension.ExtendWith; +// import org.junit.jupiter.params.ParameterizedTest; +// import org.junit.jupiter.params.provider.EnumSource; +// import org.mockito.InjectMocks; +// import org.mockito.Mock; +// import org.mockito.junit.jupiter.MockitoExtension; +// +// import com.wypl.authdomain.auth.service.fixture.MemberFixture; +// import com.wypl.jpamemberdomain.member.OauthProvider; +// import com.wypl.jpamemberdomain.member.data.MemberSaveDto; +// import com.wypl.jpamemberdomain.member.data.SocialMemberSaveDto; +// import com.wypl.jpamemberdomain.member.domain.Member; +// import com.wypl.jpamemberdomain.member.domain.SocialMember; +// import com.wypl.jpamemberdomain.member.repository.MemberRepository; +// import com.wypl.jpamemberdomain.member.repository.SocialMemberRepository; +// import com.wypl.redistokendomain.TokenRepository; +// +// @ExtendWith(MockitoExtension.class) +// class AuthDomainServiceImplTest { +// @InjectMocks +// private AuthDomainServiceImpl authDomainService; +// @Mock +// private MemberRepository memberRepository; +// @Mock +// private SocialMemberRepository socialMemberRepository; +// @Mock +// private TokenRepository tokenRepository; +// +// @DisplayName("유저의 Auth 데이터를 저장한다.") +// @ParameterizedTest +// @EnumSource +// void saveAuthDateTest(MemberFixture fixture) { +// // Given +// MemberSaveDto memberSaveDtoMock = MemberSaveDto.builder() +// .email("email") +// .nickname("nickname") +// .birthday(LocalDate.of(1999, 1, 15)) +// .profileImage("profileImage") +// .build(); +// +// SocialMemberSaveDto socialMemberSaveDtoMock = SocialMemberSaveDto.builder() +// .oauthProvider(OauthProvider.GOOGLE) +// .oauthId("oauthId") +// .build(); +// +// Member memberMock = fixture.toMember(); +// +// SocialMember socialMemberMock = fixture.toSocialMember(); +// +// given(memberRepository.save(any(Member.class))) +// .willReturn(memberMock); +// +// given(socialMemberRepository.save(any(SocialMember.class))) +// .willReturn(socialMemberMock); +// +// // When +// long result = authDomainService.saveAuthData(memberSaveDtoMock, socialMemberSaveDtoMock); +// +// // Then +// assertThat(result).isEqualTo(socialMemberMock.getId()); +// } +// +// @DisplayName("Redis에 존재하는 토큰인지 확인한다.") +// @Test +// void checkExistsTokenTest() { +// // When +// authDomainService.checkExistsToken(anyString()); +// +// // Then +// verify(tokenRepository).checkExistsToken(anyString()); +// } +// +// @DisplayName("Redis에 토큰을 저장한다.") +// @Test +// void saveTokenTest() { +// // When +// authDomainService.saveToken(anyString(), anyString()); +// +// // Then +// verify(tokenRepository).saveToken(anyString(), anyString()); +// } +// +// @DisplayName("Redis에서 Access Token으로 Refresh Token 값을 가져온다.") +// @Test +// void getRefreshTokenTest() { +// // When +// authDomainService.getRefreshToken(anyString()); +// +// // Then +// verify(tokenRepository).getRefreshToken(anyString()); +// } +// +// @DisplayName("Redis에 저장된 토큰 정보를 삭제한다.") +// @Test +// void deleteToken() { +// // When +// authDomainService.deleteToken(anyString()); +// +// // Then +// verify(tokenRepository).deleteToken(anyString()); +// } +// } \ No newline at end of file From 5ae58380cac1f23df6a2bcd6acd975935b41d708 Mon Sep 17 00:00:00 2001 From: sjhjack Date: Sun, 26 Jan 2025 23:51:12 +0900 Subject: [PATCH 13/17] =?UTF-8?q?Chore(#67):=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EC=98=88=EC=A0=95=20=ED=8C=8C=EC=9D=BC=20=EC=9E=84=EC=8B=9C=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/exception/AuthErrorCode.java | 44 +++---- .../auth/exception/AuthException.java | 18 +-- .../auth/service/fixture/MemberFixture.java | 110 +++++++++--------- 3 files changed, 86 insertions(+), 86 deletions(-) diff --git a/domain/auth-domain/src/main/java/com/wypl/authdomain/auth/exception/AuthErrorCode.java b/domain/auth-domain/src/main/java/com/wypl/authdomain/auth/exception/AuthErrorCode.java index 99bd390..f3e087a 100644 --- a/domain/auth-domain/src/main/java/com/wypl/authdomain/auth/exception/AuthErrorCode.java +++ b/domain/auth-domain/src/main/java/com/wypl/authdomain/auth/exception/AuthErrorCode.java @@ -1,22 +1,22 @@ -package com.wypl.authdomain.auth.exception; - -import com.wypl.common.exception.ServerErrorCode; - -import lombok.Getter; - -@Getter -public enum AuthErrorCode implements ServerErrorCode { - INVALID_TOKEN(400, "AUTH_001", "올바르지 않은 토큰입니다."), - EXPIRED_TOKEN(401, "AUTH_002", "만료된 토큰입니다.") - ; - - private final int statusCode; - private final String errorCode; - private final String message; - - AuthErrorCode(int statusCode, String errorCode, String message) { - this.statusCode = statusCode; - this.errorCode = errorCode; - this.message = message; - } -} +// package com.wypl.authdomain.auth.exception; +// +// import com.wypl.common.exception.ServerErrorCode; +// +// import lombok.Getter; +// +// @Getter +// public enum AuthErrorCode implements ServerErrorCode { +// INVALID_TOKEN(400, "AUTH_001", "올바르지 않은 토큰입니다."), +// EXPIRED_TOKEN(401, "AUTH_002", "만료된 토큰입니다.") +// ; +// +// private final int statusCode; +// private final String errorCode; +// private final String message; +// +// AuthErrorCode(int statusCode, String errorCode, String message) { +// this.statusCode = statusCode; +// this.errorCode = errorCode; +// this.message = message; +// } +// } diff --git a/domain/auth-domain/src/main/java/com/wypl/authdomain/auth/exception/AuthException.java b/domain/auth-domain/src/main/java/com/wypl/authdomain/auth/exception/AuthException.java index e2408cd..d4929b8 100644 --- a/domain/auth-domain/src/main/java/com/wypl/authdomain/auth/exception/AuthException.java +++ b/domain/auth-domain/src/main/java/com/wypl/authdomain/auth/exception/AuthException.java @@ -1,9 +1,9 @@ -package com.wypl.authdomain.auth.exception; - -import com.wypl.common.exception.WyplException; - -public class AuthException extends WyplException { - public AuthException(AuthErrorCode serverErrorCode) { - super(serverErrorCode); - } -} +// package com.wypl.authdomain.auth.exception; +// +// import com.wypl.common.exception.WyplException; +// +// public class AuthException extends WyplException { +// public AuthException(AuthErrorCode serverErrorCode) { +// super(serverErrorCode); +// } +// } diff --git a/domain/auth-domain/src/test/java/com/wypl/authdomain/auth/service/fixture/MemberFixture.java b/domain/auth-domain/src/test/java/com/wypl/authdomain/auth/service/fixture/MemberFixture.java index 27a216b..75d15a2 100644 --- a/domain/auth-domain/src/test/java/com/wypl/authdomain/auth/service/fixture/MemberFixture.java +++ b/domain/auth-domain/src/test/java/com/wypl/authdomain/auth/service/fixture/MemberFixture.java @@ -1,55 +1,55 @@ -package com.wypl.authdomain.auth.service.fixture; - -import java.time.LocalDate; -import java.util.UUID; - -import com.wypl.common.Color; -import com.wypl.jpamemberdomain.member.OauthProvider; -import com.wypl.jpamemberdomain.member.TimeZone; -import com.wypl.jpamemberdomain.member.domain.Member; -import com.wypl.jpamemberdomain.member.domain.SocialMember; - -// Todo : Access Level 고민해보자 -// @AllArgsConstructor -public enum MemberFixture { - JEONG_HOON(1L, "biosjh@gmail.com", "sjh", LocalDate.of(1999, 1, 15), "JHprofile", OauthProvider.GOOGLE) - ; - - private final Long memberId; - private final String email; - private final String nickname; - private final LocalDate birthday; - private final String profileImage; - private final OauthProvider oauthProvider; - - // @AllArgsConstructor 인식 불가로 인해, 명시적으로 생성자 추가 - MemberFixture(Long memberId, String email, String nickname, LocalDate birthday, String profileImage, OauthProvider oauthProvider) { - this.memberId = memberId; - this.email = email; - this.nickname = nickname; - this.birthday = birthday; - this.profileImage = profileImage; - this.oauthProvider = oauthProvider; - } - - public Member toMember() { - return Member.builder() - .memberId(memberId) - .email(email) - .nickname(nickname) - .birthday(birthday) - .profileImage(profileImage) - .color(Color.labelBrown) - .timeZone(TimeZone.KOREA) - .build(); - } - - public SocialMember toSocialMember() { - return SocialMember.builder() - .id(memberId) - .member(toMember()) - .oauthProvider(oauthProvider) - .oauthId(UUID.randomUUID().toString()) - .build(); - } -} +// package com.wypl.authdomain.auth.service.fixture; +// +// import java.time.LocalDate; +// import java.util.UUID; +// +// import com.wypl.common.Color; +// import com.wypl.jpamemberdomain.member.OauthProvider; +// import com.wypl.jpamemberdomain.member.TimeZone; +// import com.wypl.jpamemberdomain.member.domain.Member; +// import com.wypl.jpamemberdomain.member.domain.SocialMember; +// +// // Todo : Access Level 고민해보자 +// // @AllArgsConstructor +// public enum MemberFixture { +// JEONG_HOON(1L, "biosjh@gmail.com", "sjh", LocalDate.of(1999, 1, 15), "JHprofile", OauthProvider.GOOGLE) +// ; +// +// private final Long memberId; +// private final String email; +// private final String nickname; +// private final LocalDate birthday; +// private final String profileImage; +// private final OauthProvider oauthProvider; +// +// // @AllArgsConstructor 인식 불가로 인해, 명시적으로 생성자 추가 +// MemberFixture(Long memberId, String email, String nickname, LocalDate birthday, String profileImage, OauthProvider oauthProvider) { +// this.memberId = memberId; +// this.email = email; +// this.nickname = nickname; +// this.birthday = birthday; +// this.profileImage = profileImage; +// this.oauthProvider = oauthProvider; +// } +// +// public Member toMember() { +// return Member.builder() +// .memberId(memberId) +// .email(email) +// .nickname(nickname) +// .birthday(birthday) +// .profileImage(profileImage) +// .color(Color.labelBrown) +// .timeZone(TimeZone.KOREA) +// .build(); +// } +// +// public SocialMember toSocialMember() { +// return SocialMember.builder() +// .id(memberId) +// .member(toMember()) +// .oauthProvider(oauthProvider) +// .oauthId(UUID.randomUUID().toString()) +// .build(); +// } +// } From a9e23a1ad282c867823236fd4fdf1fec8a70879e Mon Sep 17 00:00:00 2001 From: sjhjack Date: Tue, 28 Jan 2025 17:07:32 +0900 Subject: [PATCH 14/17] =?UTF-8?q?Chore(#67):=20interface=EC=9D=98=20public?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/wypl/wyplcore/facade/AuthMemberFacade.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacade.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacade.java index 7c755e8..3934aec 100644 --- a/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacade.java +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacade.java @@ -4,8 +4,8 @@ import com.wypl.wyplcore.auth.data.response.AuthTokensResponse; public interface AuthMemberFacade { - public AuthTokensResponse generateToken(final String provider, final String code); - public AuthTokensResponse reissueToken(final String accessToken, final String refreshToken); - public void logout(AuthMember authMember); - public void quitMember(AuthMember authMember); + AuthTokensResponse generateToken(final String provider, final String code); + AuthTokensResponse reissueToken(final String accessToken, final String refreshToken); + void logout(AuthMember authMember); + void quitMember(AuthMember authMember); } From 143b42a7f3c7cbfb2655eb74958075a7c4e48718 Mon Sep 17 00:00:00 2001 From: sjhjack Date: Fri, 31 Jan 2025 15:38:52 +0900 Subject: [PATCH 15/17] =?UTF-8?q?Rename(#67):=20class=20name=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 인터페이스가 없는 클래스의 클래스 명에서 impl을 제거합니다. --- .../wyplcore/auth/service/AuthMemberServiceImpl.java | 4 ++-- .../com/wypl/wyplcore/facade/AuthMemberFacadeImpl.java | 9 +++++---- .../{MemberServiceImpl.java => MemberService.java} | 2 +- .../service/{TokenServiceImpl.java => TokenService.java} | 2 +- .../wyplcore/auth/service/AuthMemberFacadeImplTest.java | 8 ++++---- ...MemberServiceImplTest.java => MemberServiceTest.java} | 4 ++-- .../{TokenServiceImplTest.java => TokenServiceTest.java} | 4 ++-- 7 files changed, 17 insertions(+), 16 deletions(-) rename application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/{MemberServiceImpl.java => MemberService.java} (98%) rename application/wypl-core/src/main/java/com/wypl/wyplcore/token/service/{TokenServiceImpl.java => TokenService.java} (96%) rename application/wypl-core/src/test/java/com/wypl/wyplcore/member/service/{MemberServiceImplTest.java => MemberServiceTest.java} (97%) rename application/wypl-core/src/test/java/com/wypl/wyplcore/token/service/{TokenServiceImplTest.java => TokenServiceTest.java} (95%) diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthMemberServiceImpl.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthMemberServiceImpl.java index b8690b8..793b603 100644 --- a/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthMemberServiceImpl.java +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/auth/service/AuthMemberServiceImpl.java @@ -11,7 +11,7 @@ import com.wypl.jpamemberdomain.member.domain.SocialMember; import com.wypl.jpamemberdomain.member.repository.SocialMemberRepository; import com.wypl.jpamemberdomain.member.utils.SocialMemberRepositoryUtils; -import com.wypl.wyplcore.token.service.TokenServiceImpl; +import com.wypl.wyplcore.token.service.TokenService; import lombok.RequiredArgsConstructor; @@ -20,7 +20,7 @@ public class AuthMemberServiceImpl implements AuthMemberService { private final GoogleOAuthClient googleOAuthClient; private final SocialMemberRepository socialMemberRepository; - private final TokenServiceImpl tokenService; + private final TokenService tokenService; @Override public AuthMember getValidatedMemberId(String accessToken) { diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacadeImpl.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacadeImpl.java index 8734f0b..dbf84cc 100644 --- a/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacadeImpl.java +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacadeImpl.java @@ -10,8 +10,8 @@ import com.wypl.googleoauthclient.exception.GoogleOAuthErrorCode; import com.wypl.googleoauthclient.exception.GoogleOAuthException; import com.wypl.wyplcore.auth.data.response.AuthTokensResponse; -import com.wypl.wyplcore.member.service.MemberServiceImpl; -import com.wypl.wyplcore.token.service.TokenServiceImpl; +import com.wypl.wyplcore.member.service.MemberService; +import com.wypl.wyplcore.token.service.TokenService; import lombok.RequiredArgsConstructor; @@ -20,8 +20,8 @@ @Component public class AuthMemberFacadeImpl implements AuthMemberFacade { private final GoogleOAuthClient googleOAuthClient; - private final TokenServiceImpl tokenService; - private final MemberServiceImpl memberService; + private final TokenService tokenService; + private final MemberService memberService; @Override @Transactional @@ -63,6 +63,7 @@ public void logout(AuthMember authMember) { @Transactional public void quitMember(AuthMember authMember) { // Todo : 회원 탈퇴 로직 논의 + // Todo : deleteToken은 스프링에서 비동기 처리하고(토큰이 아니라 멤버 탈퇴가 중요한거다), deleteMember는 Member 쪽으로 옮기자 deleteToken(authMember); memberService.deleteMember(authMember); } diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberService.java similarity index 98% rename from application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java rename to application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberService.java index 2c09e0f..7245340 100644 --- a/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberServiceImpl.java +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/member/service/MemberService.java @@ -22,7 +22,7 @@ @Transactional(readOnly = true) @RequiredArgsConstructor @Service -public class MemberServiceImpl { +public class MemberService { private final GoogleOAuthClient googleOAuthClient; private final MemberRepository memberRepository; private final SocialMemberRepository socialMemberRepository; diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/token/service/TokenServiceImpl.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/token/service/TokenService.java similarity index 96% rename from application/wypl-core/src/main/java/com/wypl/wyplcore/token/service/TokenServiceImpl.java rename to application/wypl-core/src/main/java/com/wypl/wyplcore/token/service/TokenService.java index cc969f7..7c78246 100644 --- a/application/wypl-core/src/main/java/com/wypl/wyplcore/token/service/TokenServiceImpl.java +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/token/service/TokenService.java @@ -10,7 +10,7 @@ @Transactional(readOnly = true) @RequiredArgsConstructor @Service -public class TokenServiceImpl { +public class TokenService { private final TokenRepository tokenRepository; public boolean checkExistsToken(String accessToken) { diff --git a/application/wypl-core/src/test/java/com/wypl/wyplcore/auth/service/AuthMemberFacadeImplTest.java b/application/wypl-core/src/test/java/com/wypl/wyplcore/auth/service/AuthMemberFacadeImplTest.java index 36677e3..928b723 100644 --- a/application/wypl-core/src/test/java/com/wypl/wyplcore/auth/service/AuthMemberFacadeImplTest.java +++ b/application/wypl-core/src/test/java/com/wypl/wyplcore/auth/service/AuthMemberFacadeImplTest.java @@ -23,8 +23,8 @@ import com.wypl.googleoauthclient.exception.GoogleOAuthException; import com.wypl.wyplcore.auth.data.response.AuthTokensResponse; import com.wypl.wyplcore.facade.AuthMemberFacadeImpl; -import com.wypl.wyplcore.member.service.MemberServiceImpl; -import com.wypl.wyplcore.token.service.TokenServiceImpl; +import com.wypl.wyplcore.member.service.MemberService; +import com.wypl.wyplcore.token.service.TokenService; @ExtendWith(MockitoExtension.class) class AuthMemberFacadeImplTest { @@ -33,9 +33,9 @@ class AuthMemberFacadeImplTest { @Mock private GoogleOAuthClient googleOAuthClient; @Mock - private TokenServiceImpl tokenService; + private TokenService tokenService; @Mock - private MemberServiceImpl memberService; + private MemberService memberService; @DisplayName("토큰을 성공적으로 발행한다.") @Test diff --git a/application/wypl-core/src/test/java/com/wypl/wyplcore/member/service/MemberServiceImplTest.java b/application/wypl-core/src/test/java/com/wypl/wyplcore/member/service/MemberServiceTest.java similarity index 97% rename from application/wypl-core/src/test/java/com/wypl/wyplcore/member/service/MemberServiceImplTest.java rename to application/wypl-core/src/test/java/com/wypl/wyplcore/member/service/MemberServiceTest.java index c1615e5..c11e504 100644 --- a/application/wypl-core/src/test/java/com/wypl/wyplcore/member/service/MemberServiceImplTest.java +++ b/application/wypl-core/src/test/java/com/wypl/wyplcore/member/service/MemberServiceTest.java @@ -29,9 +29,9 @@ import com.wypl.wyplcore.member.fixture.MemberFixture; @ExtendWith(MockitoExtension.class) -public class MemberServiceImplTest { +public class MemberServiceTest { @InjectMocks - private MemberServiceImpl memberService; + private MemberService memberService; @Mock private MemberRepository memberRepository; @Mock diff --git a/application/wypl-core/src/test/java/com/wypl/wyplcore/token/service/TokenServiceImplTest.java b/application/wypl-core/src/test/java/com/wypl/wyplcore/token/service/TokenServiceTest.java similarity index 95% rename from application/wypl-core/src/test/java/com/wypl/wyplcore/token/service/TokenServiceImplTest.java rename to application/wypl-core/src/test/java/com/wypl/wyplcore/token/service/TokenServiceTest.java index 347b3a8..f779b9a 100644 --- a/application/wypl-core/src/test/java/com/wypl/wyplcore/token/service/TokenServiceImplTest.java +++ b/application/wypl-core/src/test/java/com/wypl/wyplcore/token/service/TokenServiceTest.java @@ -13,9 +13,9 @@ import com.wypl.redistokendomain.TokenRepository; @ExtendWith(MockitoExtension.class) -class TokenServiceImplTest { +class TokenServiceTest { @InjectMocks - private TokenServiceImpl tokenService; + private TokenService tokenService; @Mock private TokenRepository tokenRepository; From c0ea9a93de30a140bed5c8464f8b1d40ecf54e10 Mon Sep 17 00:00:00 2001 From: sjhjack Date: Fri, 31 Jan 2025 15:41:16 +0900 Subject: [PATCH 16/17] =?UTF-8?q?Chore(#67):=20parameter=EC=97=90=20final?= =?UTF-8?q?=20=ED=82=A4=EC=9B=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/wypl/wyplcore/facade/AuthMemberFacade.java | 2 +- .../java/com/wypl/wyplcore/facade/AuthMemberFacadeImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacade.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacade.java index 3934aec..b871269 100644 --- a/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacade.java +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacade.java @@ -6,6 +6,6 @@ public interface AuthMemberFacade { AuthTokensResponse generateToken(final String provider, final String code); AuthTokensResponse reissueToken(final String accessToken, final String refreshToken); - void logout(AuthMember authMember); + void logout(final AuthMember authMember); void quitMember(AuthMember authMember); } diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacadeImpl.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacadeImpl.java index dbf84cc..e35fe73 100644 --- a/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacadeImpl.java +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacadeImpl.java @@ -55,7 +55,7 @@ public AuthTokensResponse reissueToken(final String accessToken, final String re @Override @Transactional - public void logout(AuthMember authMember) { + public void logout(final AuthMember authMember) { deleteToken(authMember); } From d99b23eb9fe4b44a2d15fc8482e3bda2125efd48 Mon Sep 17 00:00:00 2001 From: sjhjack Date: Fri, 31 Jan 2025 15:50:25 +0900 Subject: [PATCH 17/17] =?UTF-8?q?Chore(#67):=20parameter=EC=97=90=20final?= =?UTF-8?q?=20=ED=82=A4=EC=9B=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/wypl/wyplcore/facade/AuthMemberFacade.java | 2 +- .../java/com/wypl/wyplcore/facade/AuthMemberFacadeImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacade.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacade.java index b871269..92b8152 100644 --- a/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacade.java +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacade.java @@ -7,5 +7,5 @@ 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(AuthMember authMember); + void quitMember(final AuthMember authMember); } diff --git a/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacadeImpl.java b/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacadeImpl.java index e35fe73..9f3b574 100644 --- a/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacadeImpl.java +++ b/application/wypl-core/src/main/java/com/wypl/wyplcore/facade/AuthMemberFacadeImpl.java @@ -61,7 +61,7 @@ public void logout(final AuthMember authMember) { @Override @Transactional - public void quitMember(AuthMember authMember) { + public void quitMember(final AuthMember authMember) { // Todo : 회원 탈퇴 로직 논의 // Todo : deleteToken은 스프링에서 비동기 처리하고(토큰이 아니라 멤버 탈퇴가 중요한거다), deleteMember는 Member 쪽으로 옮기자 deleteToken(authMember);