diff --git a/src/main/java/com/dissonance/itit/factory/OAuthServiceFactory.java b/src/main/java/com/dissonance/itit/factory/OAuthServiceFactory.java new file mode 100644 index 0000000..6ac7a1e --- /dev/null +++ b/src/main/java/com/dissonance/itit/factory/OAuthServiceFactory.java @@ -0,0 +1,33 @@ +package com.dissonance.itit.factory; + +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.dissonance.itit.common.exception.CustomException; +import com.dissonance.itit.common.exception.ErrorCode; +import com.dissonance.itit.domain.enums.SocialLoginProvider; +import com.dissonance.itit.service.OAuthService; + +@Component +public class OAuthServiceFactory { + private final Map oAuthServices; + + @Autowired + public OAuthServiceFactory(List oAuthServiceList) { + oAuthServices = oAuthServiceList.stream() + .collect(Collectors.toMap(OAuthService::getProvider, Function.identity())); + } + + public OAuthService getOAuthService(SocialLoginProvider provider) { + OAuthService service = oAuthServices.get(provider); + if (service == null) { + throw new CustomException(ErrorCode.INVALID_PROVIDER); + } + return service; + } +} diff --git a/src/main/java/com/dissonance/itit/service/KakaoOAuthServiceImpl.java b/src/main/java/com/dissonance/itit/service/KakaoOAuthServiceImpl.java new file mode 100644 index 0000000..d01b299 --- /dev/null +++ b/src/main/java/com/dissonance/itit/service/KakaoOAuthServiceImpl.java @@ -0,0 +1,54 @@ +package com.dissonance.itit.service; + +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +import com.dissonance.itit.client.KakaoInformationFeignClient; +import com.dissonance.itit.domain.enums.SocialLoginProvider; +import com.dissonance.itit.dto.response.KakaoUserInformation; +import com.dissonance.itit.dto.response.OAuthUserInformation; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +@RequiredArgsConstructor +@Service +public class KakaoOAuthServiceImpl implements OAuthService { + private static final String TOKEN_PREFIX = "Bearer "; + private final KakaoInformationFeignClient kakaoInformationFeignClient; + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public SocialLoginProvider getProvider() { + return SocialLoginProvider.KAKAO; + } + + @Override + public OAuthUserInformation requestUserInformation(String token) { + log.info("Requesting user information with token: {}", token); + + // Feign Client 호출 + ResponseEntity responseEntity = kakaoInformationFeignClient.call( + "application/x-www-form-urlencoded;charset=utf-8", + TOKEN_PREFIX + token + ); + + // 원본 JSON 응답을 로그에 출력 + String jsonResponse = responseEntity.getBody(); + log.info("Raw JSON response: {}", jsonResponse); + + // JSON 응답을 KakaoUserInformation 객체로 변환 + KakaoUserInformation userInformation = null; + try { + userInformation = objectMapper.readValue(jsonResponse, KakaoUserInformation.class); + } catch (JsonProcessingException e) { + log.error("Error parsing JSON response", e); + } + + log.info("Parsed user information: {}", userInformation); + return userInformation; + } +} \ No newline at end of file diff --git a/src/main/java/com/dissonance/itit/service/OAuthService.java b/src/main/java/com/dissonance/itit/service/OAuthService.java new file mode 100644 index 0000000..4ab6bd1 --- /dev/null +++ b/src/main/java/com/dissonance/itit/service/OAuthService.java @@ -0,0 +1,10 @@ +package com.dissonance.itit.service; + +import com.dissonance.itit.domain.enums.SocialLoginProvider; +import com.dissonance.itit.dto.response.OAuthUserInformation; + +public interface OAuthService { + SocialLoginProvider getProvider(); + + OAuthUserInformation requestUserInformation(String token); +} diff --git a/src/main/java/com/dissonance/itit/service/OauthService.java b/src/main/java/com/dissonance/itit/service/OauthService.java deleted file mode 100644 index f8b18a8..0000000 --- a/src/main/java/com/dissonance/itit/service/OauthService.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.dissonance.itit.service; - -import com.dissonance.itit.client.KakaoInformationFeignClient; -import com.dissonance.itit.dto.response.KakaoUserInformation; -import com.dissonance.itit.dto.response.OAuthUserInformation; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Service; - - -@Slf4j -@RequiredArgsConstructor -@Service -public class OauthService { - private static final String TOKEN_PREFIX = "Bearer "; - private final KakaoInformationFeignClient kakaoInformationFeignClient; - private final ObjectMapper objectMapper = new ObjectMapper(); - - public OAuthUserInformation requestUserInformation(String token) { - log.info("Requesting user information with token: {}", token); - - // Feign Client 호출 - ResponseEntity responseEntity = kakaoInformationFeignClient.call( - "application/x-www-form-urlencoded;charset=utf-8", - TOKEN_PREFIX + token - ); - - // 원본 JSON 응답을 로그에 출력 - String jsonResponse = responseEntity.getBody(); - log.info("Raw JSON response: {}", jsonResponse); - - // JSON 응답을 KakaoUserInformation 객체로 변환 - KakaoUserInformation userInformation = null; - try { - userInformation = objectMapper.readValue(jsonResponse, KakaoUserInformation.class); - } catch (JsonProcessingException e) { - log.error("Error parsing JSON response", e); - } - - log.info("Parsed user information: {}", userInformation); - return userInformation; - } -} \ No newline at end of file diff --git a/src/main/java/com/dissonance/itit/service/UserService.java b/src/main/java/com/dissonance/itit/service/UserService.java index ac5e503..97467d3 100644 --- a/src/main/java/com/dissonance/itit/service/UserService.java +++ b/src/main/java/com/dissonance/itit/service/UserService.java @@ -12,6 +12,7 @@ import com.dissonance.itit.dto.response.GeneratedToken; import com.dissonance.itit.dto.response.LoginUserInfoRes; import com.dissonance.itit.dto.response.OAuthUserInformation; +import com.dissonance.itit.factory.OAuthServiceFactory; import com.dissonance.itit.repository.UserRepository; import lombok.RequiredArgsConstructor; @@ -24,33 +25,22 @@ public class UserService { private final JwtUtil jwtUtil; private final UserRepository userRepository; - private final KakaoOAuthServiceImpl kakaoOAuthService; - private final AppleOAuthServiceImpl appleOAuthService; + private final OAuthServiceFactory oAuthServiceFactory; @Transactional public GeneratedToken login(String provider, String token) { - OAuthUserInformation userInformation; SocialLoginProvider providerEnum = SocialLoginProvider.valueOf(provider.toUpperCase()); + OAuthService oAuthService = oAuthServiceFactory.getOAuthService(providerEnum); - if (providerEnum.equals(SocialLoginProvider.APPLE)) { - userInformation = appleOAuthService.requestUserInformation(token); - } else if (providerEnum.equals(SocialLoginProvider.KAKAO)) { - userInformation = kakaoOAuthService.requestUserInformation(token); - } else { - log.info("존재하지 않는 provider: " + provider); - throw new CustomException(ErrorCode.INVALID_PROVIDER); - } + OAuthUserInformation userInformation = oAuthService.requestUserInformation(token); User user; if (isExistsByProviderAndProviderId(providerEnum, userInformation.getProviderId())) { log.info("[UserService] login, response: {}", userInformation); - user = findByEmail(userInformation.getEmail()); - } else { log.info("[UserService] signUp, response: {}", userInformation); - user = saveUser(userInformation); }