From 8a498d5ed3e572e5317bb863fc4970cd657fa669 Mon Sep 17 00:00:00 2001 From: msk226 Date: Tue, 19 Aug 2025 14:44:23 +0900 Subject: [PATCH 1/5] =?UTF-8?q?[SPOT-305][REFACTOR]=20OAuthStrategy=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20:=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=9D=98=20=EC=B1=85=EC=9E=84=EC=9D=84=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=EC=8B=9C=EC=BC=9C=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20-=20=EC=A0=84=EB=9E=B5=20=EA=B0=84=20=EA=B2=B0?= =?UTF-8?q?=ED=95=A9=20=EA=B0=90=EC=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/application/refactor/OAuthService.java | 2 +- .../application/refactor/dto/OAuthProfile.java | 15 +++++++++++++++ .../refactor/impl/OAuthMemberProcessor.java | 16 +++++++++------- .../refactor/strategy/OAuthStrategy.java | 6 +++--- .../strategy/provider/GoogleOAuthStrategy.java | 6 +++--- .../strategy/provider/KakaoOAuthStrategy.java | 6 +++--- .../strategy/provider/NaverOAuthStrategy.java | 8 ++++---- 7 files changed, 38 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/example/spot/auth/application/refactor/dto/OAuthProfile.java diff --git a/src/main/java/com/example/spot/auth/application/refactor/OAuthService.java b/src/main/java/com/example/spot/auth/application/refactor/OAuthService.java index fbb0ce6c..c3f1c443 100644 --- a/src/main/java/com/example/spot/auth/application/refactor/OAuthService.java +++ b/src/main/java/com/example/spot/auth/application/refactor/OAuthService.java @@ -21,6 +21,6 @@ public String redirectURL(LoginType type) { public SocialLoginSignInDTO loginOrSignUp(LoginType type, String code) { OAuthStrategy strategy = strategyFactory.getStrategy(type); - return memberProcessor.processOAuthMember(type, strategy.toMember(code)); + return memberProcessor.processOAuthMember(strategy.getOAuthProfile(code)); } } diff --git a/src/main/java/com/example/spot/auth/application/refactor/dto/OAuthProfile.java b/src/main/java/com/example/spot/auth/application/refactor/dto/OAuthProfile.java new file mode 100644 index 00000000..3da38ff5 --- /dev/null +++ b/src/main/java/com/example/spot/auth/application/refactor/dto/OAuthProfile.java @@ -0,0 +1,15 @@ +package com.example.spot.auth.application.refactor.dto; + +import com.example.spot.member.domain.enums.LoginType; + +public record OAuthProfile( + LoginType loginType, + String email, + String nickname, + String profileImageUrl +) { + + public static OAuthProfile of(LoginType loginType, String email, String nickname, String profileImageUrl) { + return new OAuthProfile(loginType, email, nickname, profileImageUrl); + } +} diff --git a/src/main/java/com/example/spot/auth/application/refactor/impl/OAuthMemberProcessor.java b/src/main/java/com/example/spot/auth/application/refactor/impl/OAuthMemberProcessor.java index dfffb1f2..d4c45ccf 100644 --- a/src/main/java/com/example/spot/auth/application/refactor/impl/OAuthMemberProcessor.java +++ b/src/main/java/com/example/spot/auth/application/refactor/impl/OAuthMemberProcessor.java @@ -1,5 +1,6 @@ package com.example.spot.auth.application.refactor.impl; +import com.example.spot.auth.application.refactor.dto.OAuthProfile; import com.example.spot.auth.domain.RefreshToken; import com.example.spot.auth.infrastructure.jpa.RefreshTokenRepository; import com.example.spot.auth.presentation.dto.token.TokenResponseDTO; @@ -7,7 +8,6 @@ import com.example.spot.common.api.exception.GeneralException; import com.example.spot.common.security.utils.JwtTokenProvider; import com.example.spot.member.domain.Member; -import com.example.spot.member.domain.enums.LoginType; import com.example.spot.member.infrastructure.jpa.MemberRepository; import com.example.spot.member.infrastructure.jpa.PreferredRegionRepository; import com.example.spot.member.infrastructure.jpa.PreferredThemeRepository; @@ -33,11 +33,10 @@ public class OAuthMemberProcessor { private EntityManager entityManager; @Transactional - public MemberResponseDTO.SocialLoginSignInDTO processOAuthMember(LoginType loginType, - Member providerMember) { + public MemberResponseDTO.SocialLoginSignInDTO processOAuthMember(OAuthProfile oAuthProfile) { // 다른 로그인 타입으로 가입된 경우 - if (memberRepository.existsByEmailAndLoginTypeNot(providerMember.getEmail(), loginType)) { - Member existing = memberRepository.findByEmail(providerMember.getEmail()) + if (memberRepository.existsByEmailAndLoginTypeNot(oAuthProfile.email(), oAuthProfile.loginType())) { + Member existing = memberRepository.findByEmail(oAuthProfile.email()) .orElseThrow(() -> new GeneralException(ErrorStatus._MEMBER_NOT_FOUND)); if (existing.getInactive() != null) { refreshTokenRepository.deleteByMemberId(existing.getId()); @@ -49,7 +48,7 @@ public MemberResponseDTO.SocialLoginSignInDTO processOAuthMember(LoginType login } boolean isSpotMember = false; - Member member = memberRepository.findByEmail(providerMember.getEmail()).orElse(null); + Member member = memberRepository.findByEmail(oAuthProfile.email()).orElse(null); if (member != null && member.getInactive() != null) { refreshTokenRepository.deleteByMemberId(member.getId()); @@ -59,7 +58,10 @@ public MemberResponseDTO.SocialLoginSignInDTO processOAuthMember(LoginType login } if (member == null) { - member = memberRepository.save(providerMember); + Member memberByOAuth = Member.toMemberByOAuth(oAuthProfile.loginType(), oAuthProfile.nickname(), + oAuthProfile.email(), + oAuthProfile.profileImageUrl()); + member = memberRepository.save(memberByOAuth); } isSpotMember = checkIsSpotMember(member); diff --git a/src/main/java/com/example/spot/auth/application/refactor/strategy/OAuthStrategy.java b/src/main/java/com/example/spot/auth/application/refactor/strategy/OAuthStrategy.java index 673ae864..5ea446bf 100644 --- a/src/main/java/com/example/spot/auth/application/refactor/strategy/OAuthStrategy.java +++ b/src/main/java/com/example/spot/auth/application/refactor/strategy/OAuthStrategy.java @@ -1,13 +1,13 @@ package com.example.spot.auth.application.refactor.strategy; -import com.example.spot.member.domain.Member; +import com.example.spot.auth.application.refactor.dto.OAuthProfile; import com.example.spot.member.domain.enums.LoginType; public interface OAuthStrategy { - + LoginType getType(); String getOauthRedirectURL(); - Member toMember(String code); // 전략별 구현에서 Member 객체 생성 + OAuthProfile getOAuthProfile(String code); // 전략별 구현에서 Member 객체 생성 } diff --git a/src/main/java/com/example/spot/auth/application/refactor/strategy/provider/GoogleOAuthStrategy.java b/src/main/java/com/example/spot/auth/application/refactor/strategy/provider/GoogleOAuthStrategy.java index 6829ce51..0b4517d7 100644 --- a/src/main/java/com/example/spot/auth/application/refactor/strategy/provider/GoogleOAuthStrategy.java +++ b/src/main/java/com/example/spot/auth/application/refactor/strategy/provider/GoogleOAuthStrategy.java @@ -1,10 +1,10 @@ package com.example.spot.auth.application.refactor.strategy.provider; +import com.example.spot.auth.application.refactor.dto.OAuthProfile; import com.example.spot.auth.application.refactor.strategy.OAuthStrategy; import com.example.spot.auth.infrastructure.oauth.GoogleOauth; import com.example.spot.auth.presentation.dto.oauth.google.GoogleOAuthToken; import com.example.spot.auth.presentation.dto.oauth.google.GoogleUser; -import com.example.spot.member.domain.Member; import com.example.spot.member.domain.enums.LoginType; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -26,9 +26,9 @@ public String getOauthRedirectURL() { } @Override - public Member toMember(String code) { + public OAuthProfile getOAuthProfile(String code) { GoogleOAuthToken token = googleOauth.requestAccessToken(code); GoogleUser user = googleOauth.requestUserInfo(token); - return Member.toMemberByOAuth(getType(), user.name(), user.email(), user.picture()); + return OAuthProfile.of(getType(), user.name(), user.email(), user.picture()); } } diff --git a/src/main/java/com/example/spot/auth/application/refactor/strategy/provider/KakaoOAuthStrategy.java b/src/main/java/com/example/spot/auth/application/refactor/strategy/provider/KakaoOAuthStrategy.java index 1dbcebe7..2d260c9a 100644 --- a/src/main/java/com/example/spot/auth/application/refactor/strategy/provider/KakaoOAuthStrategy.java +++ b/src/main/java/com/example/spot/auth/application/refactor/strategy/provider/KakaoOAuthStrategy.java @@ -1,10 +1,10 @@ package com.example.spot.auth.application.refactor.strategy.provider; +import com.example.spot.auth.application.refactor.dto.OAuthProfile; import com.example.spot.auth.application.refactor.strategy.OAuthStrategy; import com.example.spot.auth.infrastructure.oauth.KaKaoOauth; import com.example.spot.auth.presentation.dto.oauth.kakao.KaKaoOAuthTokenDTO; import com.example.spot.auth.presentation.dto.oauth.kakao.KaKaoUser; -import com.example.spot.member.domain.Member; import com.example.spot.member.domain.enums.LoginType; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -26,10 +26,10 @@ public String getOauthRedirectURL() { } @Override - public Member toMember(String code) { + public OAuthProfile getOAuthProfile(String code) { KaKaoOAuthTokenDTO token = kaKaoOauth.requestAccessToken(code); KaKaoUser user = kaKaoOauth.requestUserInfo(token); - return Member.toMemberByOAuth(getType(), user.properties().nickname(), user.properties().nickname(), + return OAuthProfile.of(getType(), user.kakao_account().email(), user.properties().nickname(), user.properties().profile_image()); } } diff --git a/src/main/java/com/example/spot/auth/application/refactor/strategy/provider/NaverOAuthStrategy.java b/src/main/java/com/example/spot/auth/application/refactor/strategy/provider/NaverOAuthStrategy.java index f8ed9adc..1d2ba22a 100644 --- a/src/main/java/com/example/spot/auth/application/refactor/strategy/provider/NaverOAuthStrategy.java +++ b/src/main/java/com/example/spot/auth/application/refactor/strategy/provider/NaverOAuthStrategy.java @@ -1,10 +1,10 @@ package com.example.spot.auth.application.refactor.strategy.provider; +import com.example.spot.auth.application.refactor.dto.OAuthProfile; import com.example.spot.auth.application.refactor.strategy.OAuthStrategy; import com.example.spot.auth.infrastructure.oauth.NaverOauth; import com.example.spot.auth.presentation.dto.oauth.naver.NaverOAuthTokenDTO; import com.example.spot.auth.presentation.dto.oauth.naver.NaverUser; -import com.example.spot.member.domain.Member; import com.example.spot.member.domain.enums.LoginType; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -26,11 +26,11 @@ public String getOauthRedirectURL() { } @Override - public Member toMember(String code) { + public OAuthProfile getOAuthProfile(String code) { NaverOAuthTokenDTO token = naverOauth.requestAccessToken(code); NaverUser user = naverOauth.requestUserInfo(token); - return Member.toMemberByOAuth( - getType(), user.response().name(), user.response().email(), + return OAuthProfile.of( + getType(), user.response().email(), user.response().name(), user.response().thumbnail_image()); } } From 9a00bd77d876153c0d4a8c964928275915d632bb Mon Sep 17 00:00:00 2001 From: msk226 Date: Tue, 19 Aug 2025 14:48:13 +0900 Subject: [PATCH 2/5] =?UTF-8?q?[SPOT-305][REFACTOR]=20=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=20EnumMap=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../strategy/OAuthStrategyFactory.java | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/spot/auth/application/refactor/strategy/OAuthStrategyFactory.java b/src/main/java/com/example/spot/auth/application/refactor/strategy/OAuthStrategyFactory.java index 4a9b647a..26a825df 100644 --- a/src/main/java/com/example/spot/auth/application/refactor/strategy/OAuthStrategyFactory.java +++ b/src/main/java/com/example/spot/auth/application/refactor/strategy/OAuthStrategyFactory.java @@ -3,20 +3,40 @@ import com.example.spot.auth.exception.UnsupportedSocialLoginTypeException; import com.example.spot.common.api.code.status.ErrorStatus; import com.example.spot.member.domain.enums.LoginType; +import jakarta.annotation.PostConstruct; +import java.util.Collections; +import java.util.EnumMap; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +@Slf4j @Component public class OAuthStrategyFactory { private final Map strategyMap; + @PostConstruct + void logRegistered() { + log.info("Registered OAuth strategies: {}", strategyMap.keySet()); + } + public OAuthStrategyFactory(List strategies) { - this.strategyMap = strategies.stream() - .collect(Collectors.toMap(OAuthStrategy::getType, s -> s)); + this.strategyMap = Collections.unmodifiableMap( + strategies.stream().collect( + Collectors.toMap( + OAuthStrategy::getType, + s -> s, + (a, b) -> { + throw new IllegalStateException("중복된 OAuth Strategy가 주입되었습니다. :" + a.getType()); + }, + () -> new EnumMap<>(LoginType.class) + ) + ) + ); } public OAuthStrategy getStrategy(LoginType type) { From fe40961d4534c930fd2e23c2aeb14551c9111e03 Mon Sep 17 00:00:00 2001 From: msk226 Date: Tue, 19 Aug 2025 15:31:13 +0900 Subject: [PATCH 3/5] =?UTF-8?q?[SPOT-305][REFACTOR]=20OAuthMemberProcessor?= =?UTF-8?q?=EC=9D=98=20=EC=B1=85=EC=9E=84=EC=9D=84=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=B6=84=EB=A6=AC=EB=A5=BC=20=ED=86=B5=ED=95=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../refactor/dto/SocialAccountResult.java | 16 ++++ .../refactor/impl/OAuthMemberProcessor.java | 86 ++++--------------- .../member/OAuthMemberConflictProcessor.java | 51 +++++++++++ .../refactor/member/OAuthMemberCreator.java | 20 +++++ .../member/ProfileCompletenessChecker.java | 22 +++++ .../refactor/member/RefreshTokenStore.java | 21 +++++ 6 files changed, 148 insertions(+), 68 deletions(-) create mode 100644 src/main/java/com/example/spot/auth/application/refactor/dto/SocialAccountResult.java create mode 100644 src/main/java/com/example/spot/auth/application/refactor/member/OAuthMemberConflictProcessor.java create mode 100644 src/main/java/com/example/spot/auth/application/refactor/member/OAuthMemberCreator.java create mode 100644 src/main/java/com/example/spot/auth/application/refactor/member/ProfileCompletenessChecker.java create mode 100644 src/main/java/com/example/spot/auth/application/refactor/member/RefreshTokenStore.java diff --git a/src/main/java/com/example/spot/auth/application/refactor/dto/SocialAccountResult.java b/src/main/java/com/example/spot/auth/application/refactor/dto/SocialAccountResult.java new file mode 100644 index 00000000..a855b4bc --- /dev/null +++ b/src/main/java/com/example/spot/auth/application/refactor/dto/SocialAccountResult.java @@ -0,0 +1,16 @@ +package com.example.spot.auth.application.refactor.dto; + +import com.example.spot.member.domain.Member; +import java.util.Optional; + +public record SocialAccountResult( + Optional member +) { + public static SocialAccountResult empty() { + return new SocialAccountResult(Optional.empty()); + } + + public static SocialAccountResult of(Member member) { + return new SocialAccountResult(Optional.of(member)); + } +} diff --git a/src/main/java/com/example/spot/auth/application/refactor/impl/OAuthMemberProcessor.java b/src/main/java/com/example/spot/auth/application/refactor/impl/OAuthMemberProcessor.java index d4c45ccf..ca67957b 100644 --- a/src/main/java/com/example/spot/auth/application/refactor/impl/OAuthMemberProcessor.java +++ b/src/main/java/com/example/spot/auth/application/refactor/impl/OAuthMemberProcessor.java @@ -1,20 +1,15 @@ package com.example.spot.auth.application.refactor.impl; import com.example.spot.auth.application.refactor.dto.OAuthProfile; -import com.example.spot.auth.domain.RefreshToken; -import com.example.spot.auth.infrastructure.jpa.RefreshTokenRepository; -import com.example.spot.auth.presentation.dto.token.TokenResponseDTO; -import com.example.spot.common.api.code.status.ErrorStatus; -import com.example.spot.common.api.exception.GeneralException; +import com.example.spot.auth.application.refactor.dto.SocialAccountResult; +import com.example.spot.auth.application.refactor.member.OAuthMemberConflictProcessor; +import com.example.spot.auth.application.refactor.member.OAuthMemberCreator; +import com.example.spot.auth.application.refactor.member.ProfileCompletenessChecker; +import com.example.spot.auth.application.refactor.member.RefreshTokenStore; +import com.example.spot.auth.presentation.dto.token.TokenResponseDTO.TokenDTO; import com.example.spot.common.security.utils.JwtTokenProvider; import com.example.spot.member.domain.Member; -import com.example.spot.member.infrastructure.jpa.MemberRepository; -import com.example.spot.member.infrastructure.jpa.PreferredRegionRepository; -import com.example.spot.member.infrastructure.jpa.PreferredThemeRepository; -import com.example.spot.member.infrastructure.jpa.StudyJoinReasonRepository; import com.example.spot.member.presentation.dto.MemberResponseDTO; -import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -23,53 +18,24 @@ @RequiredArgsConstructor public class OAuthMemberProcessor { - private final MemberRepository memberRepository; - private final RefreshTokenRepository refreshTokenRepository; - private final JwtTokenProvider tokenProvider; - private final PreferredThemeRepository preferredThemeRepository; - private final PreferredRegionRepository preferredRegionRepository; - private final StudyJoinReasonRepository studyJoinReasonRepository; - @PersistenceContext - private EntityManager entityManager; + private final OAuthMemberCreator oAuthMemberCreator; + private final OAuthMemberConflictProcessor oAuthMemberConflictProcessor; + private final ProfileCompletenessChecker profileCompletenessChecker; + private final JwtTokenProvider tokenService; // TODO 인터페이스 분리 + private final RefreshTokenStore refreshTokenStore; @Transactional public MemberResponseDTO.SocialLoginSignInDTO processOAuthMember(OAuthProfile oAuthProfile) { - // 다른 로그인 타입으로 가입된 경우 - if (memberRepository.existsByEmailAndLoginTypeNot(oAuthProfile.email(), oAuthProfile.loginType())) { - Member existing = memberRepository.findByEmail(oAuthProfile.email()) - .orElseThrow(() -> new GeneralException(ErrorStatus._MEMBER_NOT_FOUND)); - if (existing.getInactive() != null) { - refreshTokenRepository.deleteByMemberId(existing.getId()); - memberRepository.deleteById(existing.getId()); - entityManager.flush(); - } else { - throw new GeneralException(ErrorStatus._MEMBER_EMAIL_EXIST); - } - } + SocialAccountResult socialAccountResult = oAuthMemberConflictProcessor.resolveConflict(oAuthProfile); + Member member = socialAccountResult.member().orElseGet(() -> oAuthMemberCreator.createFrom(oAuthProfile)); - boolean isSpotMember = false; - Member member = memberRepository.findByEmail(oAuthProfile.email()).orElse(null); + boolean isSpotMember = profileCompletenessChecker.isComplete(member.getId()); - if (member != null && member.getInactive() != null) { - refreshTokenRepository.deleteByMemberId(member.getId()); - memberRepository.deleteById(member.getId()); - entityManager.flush(); - member = null; - } + TokenDTO token = tokenService.createToken(member.getId()); + refreshTokenStore.replace(member.getId(), token.getRefreshToken()); - if (member == null) { - Member memberByOAuth = Member.toMemberByOAuth(oAuthProfile.loginType(), oAuthProfile.nickname(), - oAuthProfile.email(), - oAuthProfile.profileImageUrl()); - member = memberRepository.save(memberByOAuth); - } - - isSpotMember = checkIsSpotMember(member); - - TokenResponseDTO.TokenDTO token = tokenProvider.createToken(member.getId()); - saveRefreshToken(member, token); - - return MemberResponseDTO.SocialLoginSignInDTO.toDTO(isSpotMember, + return MemberResponseDTO.SocialLoginSignInDTO.toDTO( + isSpotMember, MemberResponseDTO.MemberSignInDTO.builder() .tokens(token) .memberId(member.getId()) @@ -77,20 +43,4 @@ public MemberResponseDTO.SocialLoginSignInDTO processOAuthMember(OAuthProfile oA .email(member.getEmail()) .build()); } - - private void saveRefreshToken(Member member, TokenResponseDTO.TokenDTO token) { - refreshTokenRepository.deleteAllByMemberId(member.getId()); - RefreshToken refreshToken = RefreshToken.builder() - .memberId(member.getId()) - .token(token.getRefreshToken()) - .build(); - refreshTokenRepository.save(refreshToken); - } - - private boolean checkIsSpotMember(Member member) { - Long id = member.getId(); - return preferredThemeRepository.existsByMemberId(id) && - preferredRegionRepository.existsByMemberId(id) && - studyJoinReasonRepository.existsByMemberId(id); - } } \ No newline at end of file diff --git a/src/main/java/com/example/spot/auth/application/refactor/member/OAuthMemberConflictProcessor.java b/src/main/java/com/example/spot/auth/application/refactor/member/OAuthMemberConflictProcessor.java new file mode 100644 index 00000000..8e7b6c70 --- /dev/null +++ b/src/main/java/com/example/spot/auth/application/refactor/member/OAuthMemberConflictProcessor.java @@ -0,0 +1,51 @@ +package com.example.spot.auth.application.refactor.member; + +import com.example.spot.auth.application.refactor.dto.OAuthProfile; +import com.example.spot.auth.application.refactor.dto.SocialAccountResult; +import com.example.spot.auth.infrastructure.jpa.RefreshTokenRepository; +import com.example.spot.common.api.code.status.ErrorStatus; +import com.example.spot.common.api.exception.GeneralException; +import com.example.spot.member.domain.Member; +import com.example.spot.member.infrastructure.jpa.MemberRepository; +import jakarta.persistence.EntityManager; +import java.util.Optional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class OAuthMemberConflictProcessor { + + private final MemberRepository memberRepository; + private final RefreshTokenRepository refreshTokenRepository; + private final EntityManager em; + + public SocialAccountResult resolveConflict(OAuthProfile p) { + Optional opt = memberRepository.findByEmail(p.email()); + if (opt.isEmpty()) { + return SocialAccountResult.empty(); + } + + Member existing = opt.get(); + // 다른 타입으로 가입된 경우 + if (existing.getLoginType() != p.loginType()) { + if (existing.getInactive() != null) { + refreshTokenRepository.deleteByMemberId(existing.getId()); + memberRepository.deleteById(existing.getId()); + em.flush(); + + return SocialAccountResult.empty(); + } + throw new GeneralException(ErrorStatus._MEMBER_EMAIL_EXIST); + } + + // 같은 타입인데 탈퇴 상태면 정리 + if (existing.getInactive() != null) { + refreshTokenRepository.deleteByMemberId(existing.getId()); + memberRepository.deleteById(existing.getId()); + em.flush(); + return SocialAccountResult.empty(); + } + return SocialAccountResult.of(existing); + } +} diff --git a/src/main/java/com/example/spot/auth/application/refactor/member/OAuthMemberCreator.java b/src/main/java/com/example/spot/auth/application/refactor/member/OAuthMemberCreator.java new file mode 100644 index 00000000..94c17644 --- /dev/null +++ b/src/main/java/com/example/spot/auth/application/refactor/member/OAuthMemberCreator.java @@ -0,0 +1,20 @@ +package com.example.spot.auth.application.refactor.member; + +import com.example.spot.auth.application.refactor.dto.OAuthProfile; +import com.example.spot.member.domain.Member; +import com.example.spot.member.infrastructure.jpa.MemberRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class OAuthMemberCreator { + + private final MemberRepository memberRepository; + + public Member createFrom(OAuthProfile oAuthProfile) { + Member member = Member.toMemberByOAuth(oAuthProfile.loginType(), oAuthProfile.nickname(), oAuthProfile.email(), + oAuthProfile.profileImageUrl()); + return memberRepository.save(member); + } +} diff --git a/src/main/java/com/example/spot/auth/application/refactor/member/ProfileCompletenessChecker.java b/src/main/java/com/example/spot/auth/application/refactor/member/ProfileCompletenessChecker.java new file mode 100644 index 00000000..3144a637 --- /dev/null +++ b/src/main/java/com/example/spot/auth/application/refactor/member/ProfileCompletenessChecker.java @@ -0,0 +1,22 @@ +package com.example.spot.auth.application.refactor.member; + +import com.example.spot.member.infrastructure.jpa.PreferredRegionRepository; +import com.example.spot.member.infrastructure.jpa.PreferredThemeRepository; +import com.example.spot.member.infrastructure.jpa.StudyJoinReasonRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class ProfileCompletenessChecker { + + private final PreferredThemeRepository themeRepository; + private final PreferredRegionRepository regionRepository; + private final StudyJoinReasonRepository reasonRepository; + + public boolean isComplete(Long memberId) { + return themeRepository.existsByMemberId(memberId) + && regionRepository.existsByMemberId(memberId) + && reasonRepository.existsByMemberId(memberId); + } +} diff --git a/src/main/java/com/example/spot/auth/application/refactor/member/RefreshTokenStore.java b/src/main/java/com/example/spot/auth/application/refactor/member/RefreshTokenStore.java new file mode 100644 index 00000000..ef47a8b0 --- /dev/null +++ b/src/main/java/com/example/spot/auth/application/refactor/member/RefreshTokenStore.java @@ -0,0 +1,21 @@ +package com.example.spot.auth.application.refactor.member; + +import com.example.spot.auth.domain.RefreshToken; +import com.example.spot.auth.infrastructure.jpa.RefreshTokenRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class RefreshTokenStore { + + private final RefreshTokenRepository refreshTokenRepository; + + public void replace(Long memberId, String refresh) { + refreshTokenRepository.deleteAllByMemberId(memberId); + refreshTokenRepository.save(RefreshToken.builder() + .memberId(memberId). + token(refresh) + .build()); + } +} From 0e7b1f5117b4f83d3bbc253555d0fb4e165737a3 Mon Sep 17 00:00:00 2001 From: msk226 Date: Tue, 19 Aug 2025 15:42:35 +0900 Subject: [PATCH 4/5] =?UTF-8?q?[SPOT-305][REFACTOR]=20TokenProvider=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EB=8F=84?= =?UTF-8?q?=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/refactor/OAuthService.java | 2 +- .../application/refactor/TokenProvider.java | 23 +++ ...nService.java => TokenReissueService.java} | 2 +- ...rvice.java => JwtTokenReissueService.java} | 8 +- .../OAuthMemberProcessor.java | 12 +- .../controller/refactor/TokenController.java | 6 +- .../security/utils/JwtTokenProvider.java | 188 +++++++++--------- 7 files changed, 135 insertions(+), 106 deletions(-) create mode 100644 src/main/java/com/example/spot/auth/application/refactor/TokenProvider.java rename src/main/java/com/example/spot/auth/application/refactor/{TokenService.java => TokenReissueService.java} (87%) rename src/main/java/com/example/spot/auth/application/refactor/impl/{JwtTokenService.java => JwtTokenReissueService.java} (91%) rename src/main/java/com/example/spot/auth/application/refactor/{impl => member}/OAuthMemberProcessor.java (74%) diff --git a/src/main/java/com/example/spot/auth/application/refactor/OAuthService.java b/src/main/java/com/example/spot/auth/application/refactor/OAuthService.java index c3f1c443..533abdd4 100644 --- a/src/main/java/com/example/spot/auth/application/refactor/OAuthService.java +++ b/src/main/java/com/example/spot/auth/application/refactor/OAuthService.java @@ -1,6 +1,6 @@ package com.example.spot.auth.application.refactor; -import com.example.spot.auth.application.refactor.impl.OAuthMemberProcessor; +import com.example.spot.auth.application.refactor.member.OAuthMemberProcessor; import com.example.spot.auth.application.refactor.strategy.OAuthStrategy; import com.example.spot.auth.application.refactor.strategy.OAuthStrategyFactory; import com.example.spot.member.domain.enums.LoginType; diff --git a/src/main/java/com/example/spot/auth/application/refactor/TokenProvider.java b/src/main/java/com/example/spot/auth/application/refactor/TokenProvider.java new file mode 100644 index 00000000..9862b1d0 --- /dev/null +++ b/src/main/java/com/example/spot/auth/application/refactor/TokenProvider.java @@ -0,0 +1,23 @@ +package com.example.spot.auth.application.refactor; + +import com.example.spot.auth.presentation.dto.token.TokenResponseDTO.TokenDTO; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.userdetails.UserDetails; + +public interface TokenProvider { + + TokenDTO createToken(Long memberId); + + TokenDTO reissueToken(String refreshToken); + + boolean isTokenExpired(String token); + + boolean validateToken(String token); + + Authentication getAuthentication(String token, UserDetails userDetails); + + String resolveToken(HttpServletRequest request); + + Long getMemberIdByToken(String token); +} diff --git a/src/main/java/com/example/spot/auth/application/refactor/TokenService.java b/src/main/java/com/example/spot/auth/application/refactor/TokenReissueService.java similarity index 87% rename from src/main/java/com/example/spot/auth/application/refactor/TokenService.java rename to src/main/java/com/example/spot/auth/application/refactor/TokenReissueService.java index 6924e1d0..c638a4ff 100644 --- a/src/main/java/com/example/spot/auth/application/refactor/TokenService.java +++ b/src/main/java/com/example/spot/auth/application/refactor/TokenReissueService.java @@ -2,7 +2,7 @@ import com.example.spot.auth.presentation.dto.token.TokenResponseDTO; -public interface TokenService { +public interface TokenReissueService { // 리프레시 토큰을 사용하여 새로운 액세스 토큰을 발급 TokenResponseDTO.TokenDTO reissueToken(String refreshToken); diff --git a/src/main/java/com/example/spot/auth/application/refactor/impl/JwtTokenService.java b/src/main/java/com/example/spot/auth/application/refactor/impl/JwtTokenReissueService.java similarity index 91% rename from src/main/java/com/example/spot/auth/application/refactor/impl/JwtTokenService.java rename to src/main/java/com/example/spot/auth/application/refactor/impl/JwtTokenReissueService.java index 16d5f83e..6f8eb4d2 100644 --- a/src/main/java/com/example/spot/auth/application/refactor/impl/JwtTokenService.java +++ b/src/main/java/com/example/spot/auth/application/refactor/impl/JwtTokenReissueService.java @@ -1,12 +1,12 @@ package com.example.spot.auth.application.refactor.impl; -import com.example.spot.auth.application.refactor.TokenService; +import com.example.spot.auth.application.refactor.TokenProvider; +import com.example.spot.auth.application.refactor.TokenReissueService; import com.example.spot.auth.domain.RefreshToken; import com.example.spot.auth.infrastructure.jpa.RefreshTokenRepository; import com.example.spot.auth.presentation.dto.token.TokenResponseDTO; import com.example.spot.common.api.code.status.ErrorStatus; import com.example.spot.common.api.exception.GeneralException; -import com.example.spot.common.security.utils.JwtTokenProvider; import com.example.spot.member.domain.Member; import com.example.spot.member.infrastructure.jpa.MemberRepository; import java.util.Objects; @@ -17,10 +17,10 @@ @Service @Transactional @RequiredArgsConstructor -public class JwtTokenService implements TokenService { +public class JwtTokenReissueService implements TokenReissueService { private final MemberRepository memberRepository; - private final JwtTokenProvider jwtTokenProvider; + private final TokenProvider jwtTokenProvider; private final RefreshTokenRepository refreshTokenRepository; /** diff --git a/src/main/java/com/example/spot/auth/application/refactor/impl/OAuthMemberProcessor.java b/src/main/java/com/example/spot/auth/application/refactor/member/OAuthMemberProcessor.java similarity index 74% rename from src/main/java/com/example/spot/auth/application/refactor/impl/OAuthMemberProcessor.java rename to src/main/java/com/example/spot/auth/application/refactor/member/OAuthMemberProcessor.java index ca67957b..46a70c0d 100644 --- a/src/main/java/com/example/spot/auth/application/refactor/impl/OAuthMemberProcessor.java +++ b/src/main/java/com/example/spot/auth/application/refactor/member/OAuthMemberProcessor.java @@ -1,13 +1,9 @@ -package com.example.spot.auth.application.refactor.impl; +package com.example.spot.auth.application.refactor.member; +import com.example.spot.auth.application.refactor.TokenProvider; import com.example.spot.auth.application.refactor.dto.OAuthProfile; import com.example.spot.auth.application.refactor.dto.SocialAccountResult; -import com.example.spot.auth.application.refactor.member.OAuthMemberConflictProcessor; -import com.example.spot.auth.application.refactor.member.OAuthMemberCreator; -import com.example.spot.auth.application.refactor.member.ProfileCompletenessChecker; -import com.example.spot.auth.application.refactor.member.RefreshTokenStore; import com.example.spot.auth.presentation.dto.token.TokenResponseDTO.TokenDTO; -import com.example.spot.common.security.utils.JwtTokenProvider; import com.example.spot.member.domain.Member; import com.example.spot.member.presentation.dto.MemberResponseDTO; import lombok.RequiredArgsConstructor; @@ -21,7 +17,7 @@ public class OAuthMemberProcessor { private final OAuthMemberCreator oAuthMemberCreator; private final OAuthMemberConflictProcessor oAuthMemberConflictProcessor; private final ProfileCompletenessChecker profileCompletenessChecker; - private final JwtTokenProvider tokenService; // TODO 인터페이스 분리 + private final TokenProvider tokenProvider; // TODO 인터페이스 분리 private final RefreshTokenStore refreshTokenStore; @Transactional @@ -31,7 +27,7 @@ public MemberResponseDTO.SocialLoginSignInDTO processOAuthMember(OAuthProfile oA boolean isSpotMember = profileCompletenessChecker.isComplete(member.getId()); - TokenDTO token = tokenService.createToken(member.getId()); + TokenDTO token = tokenProvider.createToken(member.getId()); refreshTokenStore.replace(member.getId(), token.getRefreshToken()); return MemberResponseDTO.SocialLoginSignInDTO.toDTO( diff --git a/src/main/java/com/example/spot/auth/presentation/controller/refactor/TokenController.java b/src/main/java/com/example/spot/auth/presentation/controller/refactor/TokenController.java index 6e6f2d76..0eacc62a 100644 --- a/src/main/java/com/example/spot/auth/presentation/controller/refactor/TokenController.java +++ b/src/main/java/com/example/spot/auth/presentation/controller/refactor/TokenController.java @@ -1,6 +1,6 @@ package com.example.spot.auth.presentation.controller.refactor; -import com.example.spot.auth.application.refactor.TokenService; +import com.example.spot.auth.application.refactor.TokenReissueService; import com.example.spot.auth.presentation.dto.token.TokenResponseDTO; import com.example.spot.common.api.ApiResponse; import com.example.spot.common.api.code.status.SuccessStatus; @@ -20,7 +20,7 @@ @RequiredArgsConstructor public class TokenController { - private final TokenService tokenService; + private final TokenReissueService tokenReissueService; /* ----------------------------- JWT 토큰 관리 API ------------------------------------- */ @@ -35,7 +35,7 @@ public class TokenController { @PostMapping("/reissue") public ApiResponse reissueToken(HttpServletRequest request, @RequestHeader("refreshToken") String refreshToken) { - return ApiResponse.onSuccess(SuccessStatus._CREATED, tokenService.reissueToken(refreshToken)); + return ApiResponse.onSuccess(SuccessStatus._CREATED, tokenReissueService.reissueToken(refreshToken)); } } diff --git a/src/main/java/com/example/spot/common/security/utils/JwtTokenProvider.java b/src/main/java/com/example/spot/common/security/utils/JwtTokenProvider.java index ff3bb6c8..bf292a97 100644 --- a/src/main/java/com/example/spot/common/security/utils/JwtTokenProvider.java +++ b/src/main/java/com/example/spot/common/security/utils/JwtTokenProvider.java @@ -1,13 +1,22 @@ package com.example.spot.common.security.utils; -import com.example.spot.common.api.code.status.ErrorStatus; -import com.example.spot.common.api.exception.GeneralException; +import com.example.spot.auth.application.refactor.TokenProvider; import com.example.spot.auth.presentation.dto.token.TokenResponseDTO; import com.example.spot.auth.presentation.dto.token.TokenResponseDTO.TokenDTO; -import io.jsonwebtoken.*; +import com.example.spot.common.api.code.status.ErrorStatus; +import com.example.spot.common.api.exception.GeneralException; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.ExpiredJwtException; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.MalformedJwtException; +import io.jsonwebtoken.SignatureAlgorithm; +import io.jsonwebtoken.UnsupportedJwtException; import io.jsonwebtoken.security.Keys; import jakarta.annotation.PostConstruct; import jakarta.servlet.http.HttpServletRequest; +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import java.util.Date; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; @@ -16,14 +25,10 @@ import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Component; -import java.nio.charset.StandardCharsets; -import java.util.Base64; -import java.util.Date; - @Slf4j @Component @RequiredArgsConstructor -public class JwtTokenProvider { +public class JwtTokenProvider implements TokenProvider { @Value("${token.access_secret}") private String JWT_SECRET_KEY; @@ -41,10 +46,11 @@ protected void init() { /** * 토큰을 생성합니다. + * * @param memberId 회원 ID * @return 생성된 토큰 */ - // 액세스 및 리프레시 토큰 생성 + @Override public TokenDTO createToken(Long memberId) { // 현재 시간 Date now = new Date(); @@ -53,18 +59,74 @@ public TokenDTO createToken(Long memberId) { // 토큰 DTO 반환 return TokenDTO.builder() - .accessToken(accessToken) - .refreshToken(refreshToken) - .accessTokenExpiresIn(ACCESS_TOKEN_EXPIRATION_TIME) - .build(); + .accessToken(accessToken) + .refreshToken(refreshToken) + .accessTokenExpiresIn(ACCESS_TOKEN_EXPIRATION_TIME) + .build(); } - // + /** + * 리프레시 토큰을 이용하여 토큰을 재발급합니다. + * + * @param refreshToken 리프레시 토큰 + * @return 새로 발급된 토큰 + */ + @Override + public TokenDTO reissueToken(String refreshToken) { + Long memberId = getMemberIdByToken(refreshToken); + return createToken(memberId); + } + + @Override + public boolean isTokenExpired(String token) { + return validateToken(token, true) == ErrorStatus._EXPIRED_JWT; + } + + @Override + public boolean validateToken(String token) { + return validateToken(token, false) == null; + } + + /** + * 토큰을 이용하여 사용자 인증을 수행합니다. + * + * @param token 토큰 + * @param userDetails 사용자 정보 + * @return 사용자 인증 정보 + */ + @Override + public Authentication getAuthentication(String token, UserDetails userDetails) { + return new UsernamePasswordAuthenticationToken(userDetails, "", userDetails.getAuthorities()); + } + + /** + * 토큰을 해석하여 회원 ID를 반환합니다. + * + * @param request HTTP 요청 + * @return 회원 ID + */ + @Override + public String resolveToken(HttpServletRequest request) { + return resolveHeaderToken(request, "Authorization", "Bearer "); + } + + /** + * 토큰을 이용하여 회원 ID를 반환합니다. + * + * @param token 토큰 + * @return 회원 ID + */ + @Override + public Long getMemberIdByToken(String token) { + Claims claims = getClaims(token); + return claims.get("memberId", Long.class); + } /** * 전화번호 인증을 위한 임시 토큰을 생성합니다 + * * @param email 이메일 - * @return 생성된 임시 토큰 + * @return 생성된 임시 토큰 */ public TokenResponseDTO.TempTokenDTO createTempToken(String email) { Date now = new Date(); @@ -79,28 +141,28 @@ public TokenResponseDTO.TempTokenDTO createTempToken(String email) { /** * JWT 토큰 생성 -> 위 createToken 메서드에서 호출 - * @param memberId 회원 ID - * @param now 현재 시간 + * + * @param memberId 회원 ID + * @param now 현재 시간 * @param expirationTime 만료 시간 - * @param tokenType 토큰 타입 + * @param tokenType 토큰 타입 * @return 생성된 토큰 */ private String generateToken(Long memberId, Date now, long expirationTime, String tokenType) { return Jwts.builder() - .claim("memberId", memberId) // 회원 ID - .claim("tokenType", tokenType) // 토큰 타입 - .setIssuedAt(now) // 발급 시간 - .setExpiration(new Date(now.getTime() + expirationTime)) // 만료 시간 - .signWith(Keys.hmacShaKeyFor(JWT_SECRET_KEY.getBytes()), SignatureAlgorithm.HS256) - .compact(); + .claim("memberId", memberId) // 회원 ID + .claim("tokenType", tokenType) // 토큰 타입 + .setIssuedAt(now) // 발급 시간 + .setExpiration(new Date(now.getTime() + expirationTime)) // 만료 시간 + .signWith(Keys.hmacShaKeyFor(JWT_SECRET_KEY.getBytes()), SignatureAlgorithm.HS256) + .compact(); } - // JWT 임시 토큰 생성 -> 위 createTempToken 메서드에서 호출 - /** * JWT 임시 토큰 생성 + * * @param email 이메일 - * @param now 현재 시간 + * @param now 현재 시간 * @return 생성된 임시 토큰 */ private String generateTempToken(String email, Date now) { @@ -113,24 +175,17 @@ private String generateTempToken(String email, Date now) { .compact(); } - // 토큰 유효성 검사 -> 유효기간 만료 여부 확인 - public boolean isTokenExpired(String token) { - return validateToken(token, true) == ErrorStatus._EXPIRED_JWT; - } - // 토큰 유효성 검사 -> 외부 호출 용 - public boolean validateToken(String token) { - return validateToken(token, false) == null; - } - - // 토큰 유효성 검사 private ErrorStatus validateToken(String token, boolean checkExpirationOnly) { try { - Jwts.parserBuilder().setSigningKey(Keys.hmacShaKeyFor(JWT_SECRET_KEY.getBytes())).build().parseClaimsJws(token); + Jwts.parserBuilder().setSigningKey(Keys.hmacShaKeyFor(JWT_SECRET_KEY.getBytes())).build() + .parseClaimsJws(token); return null; } catch (ExpiredJwtException e) { // 만료된 토큰 - if (checkExpirationOnly) return ErrorStatus._EXPIRED_JWT; + if (checkExpirationOnly) { + return ErrorStatus._EXPIRED_JWT; + } throw new GeneralException(ErrorStatus._EXPIRED_JWT); } catch (io.jsonwebtoken.security.SecurityException | MalformedJwtException e) { // 잘못된 JWT 서명 @@ -151,39 +206,12 @@ private void logInvalidToken(Exception e) { log.info("Invalid JWT Token : {}", e.getMessage()); } - /** - * 토큰을 이용하여 사용자 인증을 수행합니다. - * @param token 토큰 - * @param userDetails 사용자 정보 - * @return 사용자 인증 정보 - */ - public Authentication getAuthentication(String token, UserDetails userDetails) { - return new UsernamePasswordAuthenticationToken(userDetails, "", userDetails.getAuthorities()); - } - - /** - * 토큰을 해석하여 회원 ID를 반환합니다. - * @param request HTTP 요청 - * @return 회원 ID - */ - public String resolveToken(HttpServletRequest request) { - return resolveHeaderToken(request, "Authorization", "Bearer "); - } - - /** - * 리프레시 토큰을 해석하여 반환합니다. - * @param request HTTP 요청 - * @return 리프레시 토큰 - */ - public String resolveRefreshToken(HttpServletRequest request) { - return resolveHeaderToken(request, "refreshToken", ""); - } - /** * 헤더에서 토큰을 추출합니다. - * @param request HTTP 요청 + * + * @param request HTTP 요청 * @param headerName 헤더 이름 - * @param prefix 토큰 접두사 + * @param prefix 토큰 접두사 * @return 추출된 토큰 */ private String resolveHeaderToken(HttpServletRequest request, String headerName, String prefix) { @@ -194,28 +222,9 @@ private String resolveHeaderToken(HttpServletRequest request, String headerName, return headerValue.substring(prefix.length()).trim(); } - /** - * 리프레시 토큰을 이용하여 토큰을 재발급합니다. - * @param refreshToken 리프레시 토큰 - * @return 새로 발급된 토큰 - */ - public TokenDTO reissueToken(String refreshToken) { - Long memberId = getMemberIdByToken(refreshToken); - return createToken(memberId); - } - - /** - * 토큰을 이용하여 회원 ID를 반환합니다. - * @param token 토큰 - * @return 회원 ID - */ - public Long getMemberIdByToken(String token) { - Claims claims = getClaims(token); - return claims.get("memberId", Long.class); - } - /** * 임시 토큰을 이용하여 이메일을 반환합니다. + * * @param tempToken 임시 토큰 * @return 이메일 */ @@ -226,6 +235,7 @@ public String getEmailByToken(String tempToken) { /** * 토큰을 해석하여 클레임을 반환합니다. + * * @param token 토큰 * @return 클레임 */ From bdc34b49a18d95352f0e3937695b0ef43ab39935 Mon Sep 17 00:00:00 2001 From: msk226 Date: Tue, 19 Aug 2025 16:01:39 +0900 Subject: [PATCH 5/5] =?UTF-8?q?[SPOT-305][REFACTOR]=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=A3=BC=EC=84=9D=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spot/auth/application/refactor/OAuthService.java | 2 +- .../refactor/{member => impl}/OAuthMemberProcessor.java | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) rename src/main/java/com/example/spot/auth/application/refactor/{member => impl}/OAuthMemberProcessor.java (81%) diff --git a/src/main/java/com/example/spot/auth/application/refactor/OAuthService.java b/src/main/java/com/example/spot/auth/application/refactor/OAuthService.java index 533abdd4..c3f1c443 100644 --- a/src/main/java/com/example/spot/auth/application/refactor/OAuthService.java +++ b/src/main/java/com/example/spot/auth/application/refactor/OAuthService.java @@ -1,6 +1,6 @@ package com.example.spot.auth.application.refactor; -import com.example.spot.auth.application.refactor.member.OAuthMemberProcessor; +import com.example.spot.auth.application.refactor.impl.OAuthMemberProcessor; import com.example.spot.auth.application.refactor.strategy.OAuthStrategy; import com.example.spot.auth.application.refactor.strategy.OAuthStrategyFactory; import com.example.spot.member.domain.enums.LoginType; diff --git a/src/main/java/com/example/spot/auth/application/refactor/member/OAuthMemberProcessor.java b/src/main/java/com/example/spot/auth/application/refactor/impl/OAuthMemberProcessor.java similarity index 81% rename from src/main/java/com/example/spot/auth/application/refactor/member/OAuthMemberProcessor.java rename to src/main/java/com/example/spot/auth/application/refactor/impl/OAuthMemberProcessor.java index 46a70c0d..7cb0cc05 100644 --- a/src/main/java/com/example/spot/auth/application/refactor/member/OAuthMemberProcessor.java +++ b/src/main/java/com/example/spot/auth/application/refactor/impl/OAuthMemberProcessor.java @@ -1,8 +1,12 @@ -package com.example.spot.auth.application.refactor.member; +package com.example.spot.auth.application.refactor.impl; import com.example.spot.auth.application.refactor.TokenProvider; import com.example.spot.auth.application.refactor.dto.OAuthProfile; import com.example.spot.auth.application.refactor.dto.SocialAccountResult; +import com.example.spot.auth.application.refactor.member.OAuthMemberConflictProcessor; +import com.example.spot.auth.application.refactor.member.OAuthMemberCreator; +import com.example.spot.auth.application.refactor.member.ProfileCompletenessChecker; +import com.example.spot.auth.application.refactor.member.RefreshTokenStore; import com.example.spot.auth.presentation.dto.token.TokenResponseDTO.TokenDTO; import com.example.spot.member.domain.Member; import com.example.spot.member.presentation.dto.MemberResponseDTO; @@ -17,7 +21,7 @@ public class OAuthMemberProcessor { private final OAuthMemberCreator oAuthMemberCreator; private final OAuthMemberConflictProcessor oAuthMemberConflictProcessor; private final ProfileCompletenessChecker profileCompletenessChecker; - private final TokenProvider tokenProvider; // TODO 인터페이스 분리 + private final TokenProvider tokenProvider; private final RefreshTokenStore refreshTokenStore; @Transactional