diff --git a/src/main/java/com/example/calpick/domain/entity/User.java b/src/main/java/com/example/calpick/domain/entity/User.java index adaeb8e..5ec4303 100644 --- a/src/main/java/com/example/calpick/domain/entity/User.java +++ b/src/main/java/com/example/calpick/domain/entity/User.java @@ -25,7 +25,7 @@ public class User { private String name; private String profileUrl; private String shareToken; - private String idToken; // 카카오 로그인에서 받은 ID 토큰 + private Long kakaoId; // 카카오 로그인에서 받은 ID 토큰 @Enumerated(EnumType.STRING) private UserStatus userStatus; diff --git a/src/main/java/com/example/calpick/domain/repository/UserRepository.java b/src/main/java/com/example/calpick/domain/repository/UserRepository.java index f7bda72..7f35fc3 100644 --- a/src/main/java/com/example/calpick/domain/repository/UserRepository.java +++ b/src/main/java/com/example/calpick/domain/repository/UserRepository.java @@ -8,7 +8,7 @@ public interface UserRepository extends JpaRepository { @Query( - value = " select user_id, email, password, name, profile_url, user_status, login_types, created_at, modified_at, deleted_at, share_token, id_token " + + value = " select user_id, email, password, name, profile_url, user_status, login_types, created_at, modified_at, deleted_at, share_token, kakao_id " + " from users where email=:email", nativeQuery = true ) @@ -21,9 +21,9 @@ public interface UserRepository extends JpaRepository { int existsByEmail(@Param("email") String email); @Query( - value = " select user_id, email, password, name, profile_url, user_status, login_types, created_at, modified_at, deleted_at, share_token, id_token " + - " from users where id_token=:idToken", + value = " select user_id, email, password, name, profile_url, user_status, login_types, created_at, modified_at, deleted_at, share_token, kakao_id " + + " from users where kakao_id=:kakaoId", nativeQuery = true ) - Optional findByUid(@Param("idToken") String idToken); + Optional findByUid(@Param("kakaoId") Long kakaoId); } diff --git a/src/main/java/com/example/calpick/domain/service/impl/KakaoService.java b/src/main/java/com/example/calpick/domain/service/impl/KakaoService.java index c65d5ad..f46dd1e 100644 --- a/src/main/java/com/example/calpick/domain/service/impl/KakaoService.java +++ b/src/main/java/com/example/calpick/domain/service/impl/KakaoService.java @@ -22,7 +22,6 @@ import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; import java.time.LocalDateTime; -import java.util.Set; @RequiredArgsConstructor @Service @@ -42,27 +41,16 @@ public class KakaoService{ public Mono kakaoAuthorize(KakaoCodeRequest request) { return getKakaoToken(request.getCode()) // 1. 인증 코드로 토큰 발급 .flatMap(tokenResp -> { - String idToken = tokenResp.getIdToken(); - if (idToken == null) { - return Mono.error(new CalPickException(ErrorCode.KAKAO_TOKEN_REQUEST_FAILED, "KAKAO Id Token이 없습니다.")); - } - // 2. idToken으로 이미 존재하는 사용자인지 DB 조회 - return Mono.just(idToken) - .flatMap(uid -> - Mono.justOrEmpty(userRepository.findByUid(uid)) - // 3. 이미 존재하는 유저일 경우 로그인으로 넘어감 - .flatMap(user -> Mono.just(kakaoLogin(user))) - // 4. 기존 카카오 로그인 유저가 아니므로 정보 받아와서 저장 - .switchIfEmpty( - getKakaoUserInfo(tokenResp.getAccessToken()) - .flatMap(userInfo->{ - return Mono.fromCallable(()->kakaoSignIn(userInfo, idToken)); - }) - ) - ); - }); - - + String accessToken = tokenResp.getAccessToken(); + if (accessToken==null){ + return Mono.error(new CalPickException(ErrorCode.KAKAO_TOKEN_REQUEST_FAILED, "Kakao AccessToken이 없습니다.")); + } + // 2. accessToken으로 사용자 정보 요청 + return getKakaoUserInfo(accessToken) + .flatMap(userInfo-> + Mono.fromCallable(()->kakaoSignIn(userInfo)) + ); + }); } // 인증 코드로 토큰 요청 받기 @@ -81,7 +69,7 @@ private Mono getKakaoToken(String code) { .retrieve() .bodyToMono(KakaoTokenResponse.class) .onErrorMap(e -> - new CalPickException(ErrorCode.KAKAO_TOKEN_REQUEST_FAILED, "카카오 토큰 요청이 실패하였습니다.") + new CalPickException(ErrorCode.KAKAO_TOKEN_REQUEST_FAILED, "카카오 토큰 요청이 실패하였습니다."+e) ); } @@ -98,11 +86,10 @@ private Mono getKakaoUserInfo(String accessToken) { .retrieve() .bodyToMono(KakaoUserInfoResponse.class) .onErrorMap(e -> - new CalPickException(ErrorCode.KAKAO_TOKEN_REQUEST_FAILED, "카카오 사용자 정보 조회에 실패하였습니다.") + new CalPickException(ErrorCode.KAKAO_TOKEN_REQUEST_FAILED, "카카오 사용자 정보 조회에 실패하였습니다."+e) ); } - //idToken으로 조회된 유저 있을 경우 로그인으로 넘어감 public LoginResponse kakaoLogin(User user){ Long id = user.getUserId(); String email = user.getEmail(); @@ -118,25 +105,24 @@ public LoginResponse kakaoLogin(User user){ } @Transactional - public LoginResponse kakaoSignIn(KakaoUserInfoResponse infoResponse, String idToken) { + public LoginResponse kakaoSignIn(KakaoUserInfoResponse infoResponse) { // 이메일로 유저를 찾음 -> 없으면 입력받은 것으로 생성 User user = userRepository.findByEmail(infoResponse.getEmail()) - .orElseGet(()->createNewUser(infoResponse, idToken)); - Set loginTypes = user.getLoginTypes(); - if(loginTypes.contains(LoginType.NORMAL)) { - user.setIdToken(idToken); + .orElseGet(()->createNewUser(infoResponse)); + if (user.getKakaoId() == null){ + // 카카오 로그인 한 적 없는 사람 + user.setKakaoId(infoResponse.getKakaoId()); + user.getLoginTypes().add(LoginType.KAKAO); + user.setModifiedAt(LocalDateTime.now()); + user = userRepository.save(user); } - loginTypes.add(LoginType.KAKAO); - user.setModifiedAt(LocalDateTime.now()); - User savedUser = userRepository.save(user); - return kakaoLogin(savedUser); + return kakaoLogin(user); } - public User createNewUser(KakaoUserInfoResponse request, String idToken){ + public User createNewUser(KakaoUserInfoResponse request){ LocalDateTime now = LocalDateTime.now(); return User.builder() .email(request.getEmail()) - .idToken(idToken) .name(request.getKakaoAccount().getProfile().getName()) .userStatus(UserStatus.ACTIVE) .createdAt(now)