Skip to content

Commit

Permalink
ITDS-25 refactor: 소셜 로그인 Factory Pattern 적용
Browse files Browse the repository at this point in the history
  • Loading branch information
kikingki committed Sep 9, 2024
1 parent 43c01e1 commit e7d4766
Show file tree
Hide file tree
Showing 5 changed files with 101 additions and 60 deletions.
33 changes: 33 additions & 0 deletions src/main/java/com/dissonance/itit/factory/OAuthServiceFactory.java
Original file line number Diff line number Diff line change
@@ -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<SocialLoginProvider, OAuthService> oAuthServices;

@Autowired
public OAuthServiceFactory(List<OAuthService> 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;
}
}
Original file line number Diff line number Diff line change
@@ -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<String> 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;
}
}
10 changes: 10 additions & 0 deletions src/main/java/com/dissonance/itit/service/OAuthService.java
Original file line number Diff line number Diff line change
@@ -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);
}
46 changes: 0 additions & 46 deletions src/main/java/com/dissonance/itit/service/OauthService.java

This file was deleted.

18 changes: 4 additions & 14 deletions src/main/java/com/dissonance/itit/service/UserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
}

Expand Down

0 comments on commit e7d4766

Please sign in to comment.