From 966bf52d34ddaddae0212e76936cf6bd48820fed Mon Sep 17 00:00:00 2001 From: ekgns33 Date: Tue, 1 Apr 2025 00:32:16 +0900 Subject: [PATCH] =?UTF-8?q?:bug:=20fix=20:=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runimo/runimo/auth/service/OidcService.java | 2 -- .../java/org/runimo/runimo/common/BaseEntity.java | 1 + .../runimo/exceptions/GlobalExceptionHandler.java | 9 ++++++++- .../runimo/user/enums/UserHttpResponseCode.java | 5 ++++- .../runimo/user/exceptions/SignUpException.java | 15 +++++++++++++++ .../usecases/auth/UserOAuthUsecaseImpl.java | 6 ++++-- 6 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 src/main/java/org/runimo/runimo/user/exceptions/SignUpException.java diff --git a/src/main/java/org/runimo/runimo/auth/service/OidcService.java b/src/main/java/org/runimo/runimo/auth/service/OidcService.java index aaa99870..adaed8d4 100644 --- a/src/main/java/org/runimo/runimo/auth/service/OidcService.java +++ b/src/main/java/org/runimo/runimo/auth/service/OidcService.java @@ -11,7 +11,6 @@ public class OidcService { private final KakaoTokenVerifier verifier; - private final OidcNonceService nonceService; public String validateOidcTokenAndGetProviderId(final DecodedJWT token, final SocialProvider provider) { DecodedJWT verifyResult; @@ -20,7 +19,6 @@ public String validateOidcTokenAndGetProviderId(final DecodedJWT token, final So case KAKAO -> verifyResult = verifier.verifyToken(token); default -> throw new IllegalStateException("not supported provider"); } - nonceService.checkNonceAndSave(provider, verifyResult); return verifyResult.getSubject(); } } diff --git a/src/main/java/org/runimo/runimo/common/BaseEntity.java b/src/main/java/org/runimo/runimo/common/BaseEntity.java index 23de1604..7dc8f01f 100644 --- a/src/main/java/org/runimo/runimo/common/BaseEntity.java +++ b/src/main/java/org/runimo/runimo/common/BaseEntity.java @@ -18,6 +18,7 @@ public abstract class BaseEntity implements Serializable { @Serial private static final long serialVersionUID = 1L; @Id + @Column(name = "id", nullable = false, updatable = false) @GeneratedValue(strategy = GenerationType.IDENTITY) protected Long id; diff --git a/src/main/java/org/runimo/runimo/exceptions/GlobalExceptionHandler.java b/src/main/java/org/runimo/runimo/exceptions/GlobalExceptionHandler.java index 1ecc767f..d568cc2e 100644 --- a/src/main/java/org/runimo/runimo/exceptions/GlobalExceptionHandler.java +++ b/src/main/java/org/runimo/runimo/exceptions/GlobalExceptionHandler.java @@ -1,8 +1,9 @@ package org.runimo.runimo.exceptions; import lombok.extern.slf4j.Slf4j; +import org.runimo.runimo.common.response.ErrorResponse; +import org.runimo.runimo.user.exceptions.SignUpException; import org.springframework.http.ResponseEntity; -import org.springframework.web.ErrorResponse; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; @@ -12,6 +13,12 @@ @RestControllerAdvice public class GlobalExceptionHandler { + @ExceptionHandler(SignUpException.class) + public ResponseEntity handleSignUpException(SignUpException e) { + log.debug("ERROR: {}}", e.getMessage(), e); + return ResponseEntity.badRequest().body(ErrorResponse.of(e.getErrorCode())); + } + @ExceptionHandler(NoSuchElementException.class) public ResponseEntity handleNoSuchElementException(NoSuchElementException e) { log.debug("ERROR: {}}", e.getMessage(), e); diff --git a/src/main/java/org/runimo/runimo/user/enums/UserHttpResponseCode.java b/src/main/java/org/runimo/runimo/user/enums/UserHttpResponseCode.java index c66f25f4..56792272 100644 --- a/src/main/java/org/runimo/runimo/user/enums/UserHttpResponseCode.java +++ b/src/main/java/org/runimo/runimo/user/enums/UserHttpResponseCode.java @@ -11,7 +11,10 @@ public enum UserHttpResponseCode implements CustomResponseCode { USE_ITEM_SUCCESS("USH2005", "아이템 사용 성공", "아이템 사용 성공"), REGISTER_EGG_SUCCESS("USH2006", "부화기 등록 성공", "부화기 등록 성공"), - USE_LOVE_POINT_SUCCESS("USH2007","애정 사용 성공" , "애정 사용 성공"); + USE_LOVE_POINT_SUCCESS("USH2007","애정 사용 성공" , "애정 사용 성공"), + + LOGIN_FAIL_NOT_SIGN_IN("UEH4041", "로그인 실패 - 회원가입하지 않은 사용자", "로그인 실패 - 회원가입하지 않은 사용자"), + SIGNIN_FAIL_ALREADY_EXIST("UEH4042", "로그인 실패 - 이미 존재하는 사용자", "로그인 실패 - 이미 존재하는 사용자"),; private final String code; private final String clientMessage; diff --git a/src/main/java/org/runimo/runimo/user/exceptions/SignUpException.java b/src/main/java/org/runimo/runimo/user/exceptions/SignUpException.java new file mode 100644 index 00000000..3eaa01f9 --- /dev/null +++ b/src/main/java/org/runimo/runimo/user/exceptions/SignUpException.java @@ -0,0 +1,15 @@ +package org.runimo.runimo.user.exceptions; + +import org.runimo.runimo.exceptions.BusinessException; +import org.runimo.runimo.exceptions.code.CustomResponseCode; + +public class SignUpException extends BusinessException { + + public SignUpException(CustomResponseCode errorCode) { + super(errorCode); + } + + protected SignUpException(CustomResponseCode errorCode, String logMessage) { + super(errorCode, logMessage); + } +} diff --git a/src/main/java/org/runimo/runimo/user/service/usecases/auth/UserOAuthUsecaseImpl.java b/src/main/java/org/runimo/runimo/user/service/usecases/auth/UserOAuthUsecaseImpl.java index 99e7b842..003cc15e 100644 --- a/src/main/java/org/runimo/runimo/user/service/usecases/auth/UserOAuthUsecaseImpl.java +++ b/src/main/java/org/runimo/runimo/user/service/usecases/auth/UserOAuthUsecaseImpl.java @@ -10,6 +10,8 @@ import org.runimo.runimo.user.domain.OAuthInfo; import org.runimo.runimo.user.domain.SocialProvider; import org.runimo.runimo.user.domain.User; +import org.runimo.runimo.user.enums.UserHttpResponseCode; +import org.runimo.runimo.user.exceptions.SignUpException; import org.runimo.runimo.user.repository.OAuthInfoRepository; import org.runimo.runimo.user.service.dtos.AuthResponse; import org.runimo.runimo.user.service.dtos.SignupUserResponse; @@ -34,7 +36,7 @@ public AuthResponse validateAndLogin(final String rawToken, final SocialProvider DecodedJWT token = JWT.decode(rawToken); String pid = oidcService.validateOidcTokenAndGetProviderId(token, provider); OAuthInfo oAuthInfo = oAuthInfoRepository.findByProviderAndProviderId(provider, pid) - .orElseThrow(() -> new NoSuchElementException("가입된 유저 없음.")); + .orElseThrow(() -> new SignUpException(UserHttpResponseCode.LOGIN_FAIL_NOT_SIGN_IN)); oidcNonceService.useNonce(token, provider); TokenPair tokenPair = jwtfactory.generateTokenPair(oAuthInfo.getUser()); return new AuthResponse(oAuthInfo.getUser(), tokenPair); @@ -47,7 +49,7 @@ public SignupUserResponse validateAndSignup(final UserSignupCommand command, fin String pid = oidcService.validateOidcTokenAndGetProviderId(token, provider); oAuthInfoRepository.findByProviderAndProviderId(provider, pid) .ifPresent(oAuthInfo -> { - throw new IllegalArgumentException("이미 존재하는 회원입니다."); + throw new SignUpException(UserHttpResponseCode.SIGNIN_FAIL_ALREADY_EXIST); }); User savedUser = userRegisterService.register(command, pid); TokenPair tokenPair = jwtfactory.generateTokenPair(savedUser);