diff --git a/src/main/java/com/example/solidconnection/auth/controller/AuthController.java b/src/main/java/com/example/solidconnection/auth/controller/AuthController.java index 9308a6872..1f68be171 100644 --- a/src/main/java/com/example/solidconnection/auth/controller/AuthController.java +++ b/src/main/java/com/example/solidconnection/auth/controller/AuthController.java @@ -5,10 +5,11 @@ import com.example.solidconnection.auth.dto.EmailSignUpTokenResponse; import com.example.solidconnection.auth.dto.ReissueResponse; import com.example.solidconnection.auth.dto.SignInResponse; +import com.example.solidconnection.auth.dto.SignInResult; import com.example.solidconnection.auth.dto.SignUpRequest; import com.example.solidconnection.auth.dto.oauth.OAuthCodeRequest; import com.example.solidconnection.auth.dto.oauth.OAuthResponse; -import com.example.solidconnection.auth.dto.oauth.OAuthSignInResponse; +import com.example.solidconnection.auth.dto.oauth.OAuthResult; import com.example.solidconnection.auth.service.AuthService; import com.example.solidconnection.auth.service.oauth.OAuthService; import com.example.solidconnection.auth.service.signin.EmailSignInService; @@ -47,11 +48,9 @@ public ResponseEntity processAppleOAuth( @Valid @RequestBody OAuthCodeRequest oAuthCodeRequest, HttpServletResponse httpServletResponse ) { - OAuthResponse oAuthResponse = oAuthService.processOAuth(AuthType.APPLE, oAuthCodeRequest); - if (oAuthResponse instanceof OAuthSignInResponse signInResponse) { - refreshTokenCookieManager.setCookie(httpServletResponse, signInResponse.refreshToken()); - } - return ResponseEntity.ok(oAuthResponse); + OAuthResult oAuthResult = oAuthService.processOAuth(AuthType.APPLE, oAuthCodeRequest); + setRefreshTokenCookie(httpServletResponse, oAuthResult.refreshToken()); + return ResponseEntity.ok(oAuthResult.response()); } @PostMapping("/kakao") @@ -59,11 +58,9 @@ public ResponseEntity processKakaoOAuth( @Valid @RequestBody OAuthCodeRequest oAuthCodeRequest, HttpServletResponse httpServletResponse ) { - OAuthResponse oAuthResponse = oAuthService.processOAuth(AuthType.KAKAO, oAuthCodeRequest); - if (oAuthResponse instanceof OAuthSignInResponse signInResponse) { - refreshTokenCookieManager.setCookie(httpServletResponse, signInResponse.refreshToken()); - } - return ResponseEntity.ok(oAuthResponse); + OAuthResult oAuthResult = oAuthService.processOAuth(AuthType.KAKAO, oAuthCodeRequest); + setRefreshTokenCookie(httpServletResponse, oAuthResult.refreshToken()); + return ResponseEntity.ok(oAuthResult.response()); } @PostMapping("/email/sign-in") @@ -71,9 +68,9 @@ public ResponseEntity signInWithEmail( @Valid @RequestBody EmailSignInRequest signInRequest, HttpServletResponse httpServletResponse ) { - SignInResponse signInResponse = emailSignInService.signIn(signInRequest); - refreshTokenCookieManager.setCookie(httpServletResponse, signInResponse.refreshToken()); - return ResponseEntity.ok(signInResponse); + SignInResult signInResult = emailSignInService.signIn(signInRequest); + refreshTokenCookieManager.setCookie(httpServletResponse, signInResult.refreshToken()); + return ResponseEntity.ok(SignInResponse.from(signInResult)); } /* 이메일 회원가입 시 signUpToken 을 발급받기 위한 api */ @@ -87,10 +84,12 @@ public ResponseEntity signUpWithEmail( @PostMapping("/sign-up") public ResponseEntity signUp( - @Valid @RequestBody SignUpRequest signUpRequest + @Valid @RequestBody SignUpRequest signUpRequest, + HttpServletResponse httpServletResponse ) { - SignInResponse signInResponse = signUpService.signUp(signUpRequest); - return ResponseEntity.ok(signInResponse); + SignInResult signInResult = signUpService.signUp(signUpRequest); + refreshTokenCookieManager.setCookie(httpServletResponse, signInResult.refreshToken()); + return ResponseEntity.ok(SignInResponse.from(signInResult)); } @PostMapping("/sign-out") @@ -123,6 +122,12 @@ public ResponseEntity reissueToken(HttpServletRequest request) return ResponseEntity.ok(reissueResponse); } + private void setRefreshTokenCookie(HttpServletResponse httpServletResponse, String refreshToken) { + if (refreshToken != null) { + refreshTokenCookieManager.setCookie(httpServletResponse, refreshToken); + } + } + private String getAccessToken(Authentication authentication) { if (authentication == null || !(authentication.getCredentials() instanceof String accessToken)) { throw new CustomException(ErrorCode.AUTHENTICATION_FAILED, "엑세스 토큰이 없습니다."); diff --git a/src/main/java/com/example/solidconnection/auth/dto/SignInResponse.java b/src/main/java/com/example/solidconnection/auth/dto/SignInResponse.java index ac9d39290..05c8563a5 100644 --- a/src/main/java/com/example/solidconnection/auth/dto/SignInResponse.java +++ b/src/main/java/com/example/solidconnection/auth/dto/SignInResponse.java @@ -1,14 +1,10 @@ package com.example.solidconnection.auth.dto; -import com.example.solidconnection.auth.domain.AccessToken; -import com.example.solidconnection.auth.domain.RefreshToken; - public record SignInResponse( - String accessToken, - String refreshToken + String accessToken ) { - public static SignInResponse of(AccessToken accessToken, RefreshToken refreshToken) { - return new SignInResponse(accessToken.token(), refreshToken.token()); + public static SignInResponse from(SignInResult signInResult) { + return new SignInResponse(signInResult.accessToken()); } } diff --git a/src/main/java/com/example/solidconnection/auth/dto/SignInResult.java b/src/main/java/com/example/solidconnection/auth/dto/SignInResult.java new file mode 100644 index 000000000..78f0f002a --- /dev/null +++ b/src/main/java/com/example/solidconnection/auth/dto/SignInResult.java @@ -0,0 +1,14 @@ +package com.example.solidconnection.auth.dto; + +import com.example.solidconnection.auth.domain.AccessToken; +import com.example.solidconnection.auth.domain.RefreshToken; + +public record SignInResult( + String accessToken, + String refreshToken +) { + + public static SignInResult of(AccessToken accessToken, RefreshToken refreshToken) { + return new SignInResult(accessToken.token(), refreshToken.token()); + } +} diff --git a/src/main/java/com/example/solidconnection/auth/dto/oauth/OAuthResult.java b/src/main/java/com/example/solidconnection/auth/dto/oauth/OAuthResult.java new file mode 100644 index 000000000..ee152f9f3 --- /dev/null +++ b/src/main/java/com/example/solidconnection/auth/dto/oauth/OAuthResult.java @@ -0,0 +1,8 @@ +package com.example.solidconnection.auth.dto.oauth; + +public record OAuthResult( + OAuthResponse response, + String refreshToken +) { + +} diff --git a/src/main/java/com/example/solidconnection/auth/dto/oauth/OAuthSignInResponse.java b/src/main/java/com/example/solidconnection/auth/dto/oauth/OAuthSignInResponse.java index 6ac121c46..9e9f75851 100644 --- a/src/main/java/com/example/solidconnection/auth/dto/oauth/OAuthSignInResponse.java +++ b/src/main/java/com/example/solidconnection/auth/dto/oauth/OAuthSignInResponse.java @@ -1,8 +1,11 @@ package com.example.solidconnection.auth.dto.oauth; +import com.example.solidconnection.auth.dto.SignInResult; + public record OAuthSignInResponse( - boolean isRegistered, - String accessToken, - String refreshToken) implements OAuthResponse { + String accessToken) implements OAuthResponse { + public static OAuthSignInResponse from(SignInResult signInResult) { + return new OAuthSignInResponse(signInResult.accessToken()); + } } diff --git a/src/main/java/com/example/solidconnection/auth/dto/oauth/SignUpPrepareResponse.java b/src/main/java/com/example/solidconnection/auth/dto/oauth/SignUpPrepareResponse.java index 5a6c60c57..663b8906a 100644 --- a/src/main/java/com/example/solidconnection/auth/dto/oauth/SignUpPrepareResponse.java +++ b/src/main/java/com/example/solidconnection/auth/dto/oauth/SignUpPrepareResponse.java @@ -1,7 +1,6 @@ package com.example.solidconnection.auth.dto.oauth; public record SignUpPrepareResponse( - boolean isRegistered, String nickname, String email, String profileImageUrl, @@ -9,7 +8,6 @@ public record SignUpPrepareResponse( public static SignUpPrepareResponse of(OAuthUserInfoDto oAuthUserInfoDto, String signUpToken) { return new SignUpPrepareResponse( - false, oAuthUserInfoDto.getNickname(), oAuthUserInfoDto.getEmail(), oAuthUserInfoDto.getProfileImageUrl(), diff --git a/src/main/java/com/example/solidconnection/auth/service/oauth/OAuthService.java b/src/main/java/com/example/solidconnection/auth/service/oauth/OAuthService.java index 08ab0c0b7..6f8e65d3b 100644 --- a/src/main/java/com/example/solidconnection/auth/service/oauth/OAuthService.java +++ b/src/main/java/com/example/solidconnection/auth/service/oauth/OAuthService.java @@ -1,9 +1,9 @@ package com.example.solidconnection.auth.service.oauth; import com.example.solidconnection.auth.domain.SignUpToken; -import com.example.solidconnection.auth.dto.SignInResponse; +import com.example.solidconnection.auth.dto.SignInResult; import com.example.solidconnection.auth.dto.oauth.OAuthCodeRequest; -import com.example.solidconnection.auth.dto.oauth.OAuthResponse; +import com.example.solidconnection.auth.dto.oauth.OAuthResult; import com.example.solidconnection.auth.dto.oauth.OAuthSignInResponse; import com.example.solidconnection.auth.dto.oauth.OAuthUserInfoDto; import com.example.solidconnection.auth.dto.oauth.SignUpPrepareResponse; @@ -32,26 +32,26 @@ public class OAuthService { private final OAuthClientMap oauthClientMap; @Transactional - public OAuthResponse processOAuth(AuthType authType, OAuthCodeRequest codeRequest) { + public OAuthResult processOAuth(AuthType authType, OAuthCodeRequest codeRequest) { OAuthClient oauthClient = oauthClientMap.getOAuthClient(authType); OAuthUserInfoDto userInfo = oauthClient.getUserInfo(codeRequest.code()); Optional optionalSiteUser = siteUserRepository.findByEmailAndAuthType(userInfo.getEmail(), authType); if (optionalSiteUser.isPresent()) { SiteUser siteUser = optionalSiteUser.get(); - return getSignInResponse(siteUser); + return getSignInResult(siteUser); } - return getSignUpPrepareResponse(userInfo, authType); + return getSignUpPrepareResult(userInfo, authType); } - private OAuthSignInResponse getSignInResponse(SiteUser siteUser) { - SignInResponse signInResponse = signInService.signIn(siteUser); - return new OAuthSignInResponse(true, signInResponse.accessToken(), signInResponse.refreshToken()); + private OAuthResult getSignInResult(SiteUser siteUser) { + SignInResult signInResult = signInService.signIn(siteUser); + return new OAuthResult(OAuthSignInResponse.from(signInResult), signInResult.refreshToken()); } - private SignUpPrepareResponse getSignUpPrepareResponse(OAuthUserInfoDto userInfoDto, AuthType authType) { + private OAuthResult getSignUpPrepareResult(OAuthUserInfoDto userInfoDto, AuthType authType) { SignUpToken signUpToken = signUpTokenProvider.generateAndSaveSignUpToken(userInfoDto.getEmail(), authType); - return SignUpPrepareResponse.of(userInfoDto, signUpToken.token()); + return new OAuthResult(SignUpPrepareResponse.of(userInfoDto, signUpToken.token()), null); } } diff --git a/src/main/java/com/example/solidconnection/auth/service/signin/EmailSignInService.java b/src/main/java/com/example/solidconnection/auth/service/signin/EmailSignInService.java index 29f379a22..0eda2e5b2 100644 --- a/src/main/java/com/example/solidconnection/auth/service/signin/EmailSignInService.java +++ b/src/main/java/com/example/solidconnection/auth/service/signin/EmailSignInService.java @@ -3,7 +3,7 @@ import static com.example.solidconnection.common.exception.ErrorCode.SIGN_IN_FAILED; import com.example.solidconnection.auth.dto.EmailSignInRequest; -import com.example.solidconnection.auth.dto.SignInResponse; +import com.example.solidconnection.auth.dto.SignInResult; import com.example.solidconnection.common.exception.CustomException; import com.example.solidconnection.siteuser.domain.AuthType; import com.example.solidconnection.siteuser.domain.SiteUser; @@ -22,7 +22,7 @@ public class EmailSignInService { private final PasswordEncoder passwordEncoder; @Transactional(readOnly = true) - public SignInResponse signIn(EmailSignInRequest signInRequest) { + public SignInResult signIn(EmailSignInRequest signInRequest) { SiteUser siteUser = getEmailMatchingUserOrThrow(signInRequest.email()); validatePassword(signInRequest.password(), siteUser.getPassword()); return signInService.signIn(siteUser); diff --git a/src/main/java/com/example/solidconnection/auth/service/signin/SignInService.java b/src/main/java/com/example/solidconnection/auth/service/signin/SignInService.java index ee63a02c3..e4be77a3c 100644 --- a/src/main/java/com/example/solidconnection/auth/service/signin/SignInService.java +++ b/src/main/java/com/example/solidconnection/auth/service/signin/SignInService.java @@ -2,7 +2,7 @@ import com.example.solidconnection.auth.domain.AccessToken; import com.example.solidconnection.auth.domain.RefreshToken; -import com.example.solidconnection.auth.dto.SignInResponse; +import com.example.solidconnection.auth.dto.SignInResult; import com.example.solidconnection.auth.service.AuthTokenProvider; import com.example.solidconnection.siteuser.domain.SiteUser; import lombok.RequiredArgsConstructor; @@ -16,11 +16,11 @@ public class SignInService { private final AuthTokenProvider authTokenProvider; @Transactional - public SignInResponse signIn(SiteUser siteUser) { + public SignInResult signIn(SiteUser siteUser) { resetQuitedAt(siteUser); AccessToken accessToken = authTokenProvider.generateAccessToken(siteUser); RefreshToken refreshToken = authTokenProvider.generateAndSaveRefreshToken(siteUser); - return SignInResponse.of(accessToken, refreshToken); + return SignInResult.of(accessToken, refreshToken); } private void resetQuitedAt(SiteUser siteUser) { diff --git a/src/main/java/com/example/solidconnection/auth/service/signup/SignUpService.java b/src/main/java/com/example/solidconnection/auth/service/signup/SignUpService.java index 8f814be4a..72a419beb 100644 --- a/src/main/java/com/example/solidconnection/auth/service/signup/SignUpService.java +++ b/src/main/java/com/example/solidconnection/auth/service/signup/SignUpService.java @@ -4,7 +4,7 @@ import static com.example.solidconnection.common.exception.ErrorCode.SIGN_UP_TOKEN_INVALID; import static com.example.solidconnection.common.exception.ErrorCode.USER_ALREADY_EXISTED; -import com.example.solidconnection.auth.dto.SignInResponse; +import com.example.solidconnection.auth.dto.SignInResult; import com.example.solidconnection.auth.dto.SignUpRequest; import com.example.solidconnection.auth.service.signin.SignInService; import com.example.solidconnection.common.exception.CustomException; @@ -38,7 +38,7 @@ public class SignUpService { private final PasswordTemporaryStorage passwordTemporaryStorage; @Transactional - public SignInResponse signUp(SignUpRequest signUpRequest) { + public SignInResult signUp(SignUpRequest signUpRequest) { // 검증 signUpTokenProvider.validateSignUpToken(signUpRequest.signUpToken()); String email = signUpTokenProvider.parseEmail(signUpRequest.signUpToken()); @@ -66,7 +66,7 @@ public SignInResponse signUp(SignUpRequest signUpRequest) { interestedCountryService.saveInterestedCountry(siteUser, signUpRequest.interestedCountries()); // 로그인 - SignInResponse response = signInService.signIn(siteUser); + SignInResult response = signInService.signIn(siteUser); // 회원가입을 위해 저장한 데이터(SignUpToken, 비밀번호) 삭제 clearSignUpData(email, authType); diff --git a/src/test/java/com/example/solidconnection/auth/service/oauth/OAuthServiceTest.java b/src/test/java/com/example/solidconnection/auth/service/oauth/OAuthServiceTest.java index 427701399..49d11a340 100644 --- a/src/test/java/com/example/solidconnection/auth/service/oauth/OAuthServiceTest.java +++ b/src/test/java/com/example/solidconnection/auth/service/oauth/OAuthServiceTest.java @@ -7,6 +7,7 @@ import com.example.solidconnection.auth.dto.oauth.OAuthCodeRequest; import com.example.solidconnection.auth.dto.oauth.OAuthResponse; +import com.example.solidconnection.auth.dto.oauth.OAuthResult; import com.example.solidconnection.auth.dto.oauth.OAuthSignInResponse; import com.example.solidconnection.auth.dto.oauth.OAuthUserInfoDto; import com.example.solidconnection.auth.dto.oauth.SignUpPrepareResponse; @@ -57,32 +58,33 @@ void setUp() { // 실제 client 호출하지 않도록 mocking siteUserFixture.사용자(email, authType); // when - OAuthResponse response = oAuthService.processOAuth(authType, new OAuthCodeRequest(oauthCode)); + OAuthResult oAuthResult = oAuthService.processOAuth(authType, new OAuthCodeRequest(oauthCode)); // then + OAuthResponse response = oAuthResult.response(); assertThat(response).isInstanceOf(OAuthSignInResponse.class); OAuthSignInResponse signInResponse = (OAuthSignInResponse) response; assertAll( - () -> assertThat(signInResponse.isRegistered()).isTrue(), () -> assertThat(signInResponse.accessToken()).isNotBlank(), - () -> assertThat(signInResponse.refreshToken()).isNotBlank() + () -> assertThat(oAuthResult.refreshToken()).isNotBlank() ); } @Test void 신규_회원이라면_회원가입에_필요한_정보를_응답한다() { // when - OAuthResponse response = oAuthService.processOAuth(authType, new OAuthCodeRequest(oauthCode)); + OAuthResult oAuthResult = oAuthService.processOAuth(authType, new OAuthCodeRequest(oauthCode)); // then + OAuthResponse response = oAuthResult.response(); assertThat(response).isInstanceOf(SignUpPrepareResponse.class); SignUpPrepareResponse signUpPrepareResponse = (SignUpPrepareResponse) response; assertAll( - () -> assertThat(signUpPrepareResponse.isRegistered()).isFalse(), () -> assertThat(signUpPrepareResponse.signUpToken()).isNotBlank(), () -> assertThat(signUpPrepareResponse.email()).isEqualTo(email), () -> assertThat(signUpPrepareResponse.profileImageUrl()).isEqualTo(profileImageUrl), - () -> assertThat(signUpPrepareResponse.nickname()).isEqualTo(nickname) + () -> assertThat(signUpPrepareResponse.nickname()).isEqualTo(nickname), + () -> assertThat(oAuthResult.refreshToken()).isNull() ); } } diff --git a/src/test/java/com/example/solidconnection/auth/service/signin/EmailSignInServiceTest.java b/src/test/java/com/example/solidconnection/auth/service/signin/EmailSignInServiceTest.java index 46c6d565a..f52cb9e3f 100644 --- a/src/test/java/com/example/solidconnection/auth/service/signin/EmailSignInServiceTest.java +++ b/src/test/java/com/example/solidconnection/auth/service/signin/EmailSignInServiceTest.java @@ -4,7 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertAll; import com.example.solidconnection.auth.dto.EmailSignInRequest; -import com.example.solidconnection.auth.dto.SignInResponse; +import com.example.solidconnection.auth.dto.SignInResult; import com.example.solidconnection.common.exception.CustomException; import com.example.solidconnection.common.exception.ErrorCode; import com.example.solidconnection.siteuser.domain.SiteUser; @@ -35,12 +35,12 @@ class EmailSignInServiceTest { EmailSignInRequest signInRequest = new EmailSignInRequest(user.getEmail(), rawPassword); // when - SignInResponse signInResponse = emailSignInService.signIn(signInRequest); + SignInResult signInResult = emailSignInService.signIn(signInRequest); // then assertAll( - () -> Assertions.assertThat(signInResponse.accessToken()).isNotNull(), - () -> Assertions.assertThat(signInResponse.refreshToken()).isNotNull() + () -> Assertions.assertThat(signInResult.accessToken()).isNotNull(), + () -> Assertions.assertThat(signInResult.refreshToken()).isNotNull() ); } diff --git a/src/test/java/com/example/solidconnection/auth/service/signin/SignInServiceTest.java b/src/test/java/com/example/solidconnection/auth/service/signin/SignInServiceTest.java index 957c5c3a1..7e90de257 100644 --- a/src/test/java/com/example/solidconnection/auth/service/signin/SignInServiceTest.java +++ b/src/test/java/com/example/solidconnection/auth/service/signin/SignInServiceTest.java @@ -5,7 +5,7 @@ import com.example.solidconnection.auth.domain.RefreshToken; import com.example.solidconnection.auth.domain.Subject; -import com.example.solidconnection.auth.dto.SignInResponse; +import com.example.solidconnection.auth.dto.SignInResult; import com.example.solidconnection.auth.service.TokenProvider; import com.example.solidconnection.auth.service.TokenStorage; import com.example.solidconnection.siteuser.domain.SiteUser; @@ -46,16 +46,16 @@ void setUp() { @Test void 성공적으로_로그인한다() { // when - SignInResponse signInResponse = signInService.signIn(user); + SignInResult signInResult = signInService.signIn(user); // then - Subject accessTokenSubject = tokenProvider.parseSubject(signInResponse.accessToken()); - Subject refreshTokenSubject = tokenProvider.parseSubject(signInResponse.refreshToken()); + Subject accessTokenSubject = tokenProvider.parseSubject(signInResult.accessToken()); + Subject refreshTokenSubject = tokenProvider.parseSubject(signInResult.refreshToken()); Optional savedRefreshToken = tokenStorage.findToken(subject, RefreshToken.class); assertAll( () -> assertThat(accessTokenSubject).isEqualTo(subject), () -> assertThat(refreshTokenSubject).isEqualTo(subject), - () -> assertThat(savedRefreshToken).hasValue(signInResponse.refreshToken())); + () -> assertThat(savedRefreshToken).hasValue(signInResult.refreshToken())); } @Test