From 9bf744f8dd86ed3ed3ff563aa92a2384862d6341 Mon Sep 17 00:00:00 2001 From: persi Date: Sun, 15 Jun 2025 02:50:33 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EC=86=8C=EC=85=9C=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=EA=B3=BC=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/api_payload/ErrorCode.java | 6 +- .../global/api_payload/SuccessCode.java | 5 +- .../user/controller/TokenController.java | 82 ------------------- .../user/controller/UserController.java | 60 +++++++++++++- .../user/converter/UserConverter.java | 2 +- .../user/dto/UserRequestDto.java | 17 +++- .../user/service/UserService.java | 21 ++++- 7 files changed, 101 insertions(+), 92 deletions(-) delete mode 100644 src/main/java/com/example/silverbridgeX_user/user/controller/TokenController.java diff --git a/src/main/java/com/example/silverbridgeX_user/global/api_payload/ErrorCode.java b/src/main/java/com/example/silverbridgeX_user/global/api_payload/ErrorCode.java index 5bfd28c..7ebad10 100644 --- a/src/main/java/com/example/silverbridgeX_user/global/api_payload/ErrorCode.java +++ b/src/main/java/com/example/silverbridgeX_user/global/api_payload/ErrorCode.java @@ -14,10 +14,12 @@ public enum ErrorCode implements BaseCode { // User USER_NOT_FOUND(HttpStatus.NOT_FOUND, "USER_4041", "존재하지 않는 회원입니다."), - USER_NOT_FOUND_BY_EMAIL(HttpStatus.NOT_FOUND, "USER_4042", "존재하지 않는 회원입니다.-EMAIL"), - USER_NOT_FOUND_BY_USERNAME(HttpStatus.NOT_FOUND, "USER_4043", "존재하지 않는 회원입니다.-USERNAME & KEY"), + USER_NOT_FOUND_BY_EMAIL(HttpStatus.NOT_FOUND, "USER_4042", "해당 email을 가진 회원이 없습니다."), + USER_NOT_FOUND_BY_USERNAME(HttpStatus.NOT_FOUND, "USER_4043", "해당 key를 가진 회원이 없습니다."), USER_NOT_OLDER(HttpStatus.FORBIDDEN, "USER_4031", "해당 유저가 노인이 아니랍니다."), USER_NOT_GUARDIAN(HttpStatus.FORBIDDEN, "USER_4032", "해당 유저가 보호자가 아닙니다."), + USER_ROLE_DIFFERENT(HttpStatus.FORBIDDEN, "USER_4033", "해당 유저의 role이 틀립니다."), + USER_ALREADY_MEMBER(HttpStatus.CONFLICT, "USER_4091", "이미 회원가입된 유저입니다."), // Jwt WRONG_REFRESH_TOKEN(HttpStatus.NOT_FOUND, "JWT_4041", "일치하는 리프레시 토큰이 없습니다."), diff --git a/src/main/java/com/example/silverbridgeX_user/global/api_payload/SuccessCode.java b/src/main/java/com/example/silverbridgeX_user/global/api_payload/SuccessCode.java index f589d88..b563640 100644 --- a/src/main/java/com/example/silverbridgeX_user/global/api_payload/SuccessCode.java +++ b/src/main/java/com/example/silverbridgeX_user/global/api_payload/SuccessCode.java @@ -13,8 +13,9 @@ public enum SuccessCode implements BaseCode { CREATED(HttpStatus.CREATED, "COMMON_201", "Created"), // User - USER_SOCIAL_LOGIN_SUCCESS(HttpStatus.CREATED, "USER_2011", "소셜 회원가입 혹은 로그인이 완료되었습니다."), - USER_KEY_LOGIN_SUCCESS(HttpStatus.CREATED, "USER_2012", "KEY 로그인이 완료되었습니다."), + USER_SOCIAL_SIGNIN_SUCCESS(HttpStatus.CREATED, "USER_2011", "소셜 회원가입이 완료되었습니다."), + USER_SOCIAL_LOGIN_SUCCESS(HttpStatus.CREATED, "USER_2012", "소셜 로그인이 완료되었습니다."), + USER_KEY_LOGIN_SUCCESS(HttpStatus.CREATED, "USER_2013", "KEY 로그인이 완료되었습니다."), USER_LOGOUT_SUCCESS(HttpStatus.OK, "USER_2001", "로그아웃 되었습니다."), USER_REISSUE_SUCCESS(HttpStatus.OK, "USER_2002", "토큰 재발급이 완료되었습니다."), USER_DELETE_SUCCESS(HttpStatus.OK, "USER_2003", "회원탈퇴가 완료되었습니다."), diff --git a/src/main/java/com/example/silverbridgeX_user/user/controller/TokenController.java b/src/main/java/com/example/silverbridgeX_user/user/controller/TokenController.java deleted file mode 100644 index b0da1e3..0000000 --- a/src/main/java/com/example/silverbridgeX_user/user/controller/TokenController.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.example.silverbridgeX_user.user.controller; - -import com.example.silverbridgeX_user.global.api_payload.ApiResponse; -import com.example.silverbridgeX_user.global.api_payload.SuccessCode; -import com.example.silverbridgeX_user.user.converter.UserConverter; -import com.example.silverbridgeX_user.user.domain.User; -import com.example.silverbridgeX_user.user.dto.JwtDto; -import com.example.silverbridgeX_user.user.dto.UserRequestDto; -import com.example.silverbridgeX_user.user.service.UserService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - - -@Tag(name = "토큰", description = "access token 관련 api 입니다.") -@RestController -@RequiredArgsConstructor -@RequestMapping("/token") -public class TokenController { - - private final UserService userService; - - @Operation(summary = "토큰 반환", description = "노인/보호자 소셜 로그인 후, 프론트에게 유저 정보 받아 토큰 반환하는 메서드입니다.") - @ApiResponses({ - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "USER_2011", description = "회원가입 & 로그인 성공"), - }) - @PostMapping("/generate/social") - public ApiResponse tokenToFront( - @RequestBody UserRequestDto.UserReqDto userReqDto - ) throws Exception { - Boolean isMember = userService.checkMemberByEmail(userReqDto.getEmail()); - - String accessToken = ""; - String refreshToken = ""; - - String signIn = "wasUser"; - - if (isMember) { - User user = userService.findByEmail(userReqDto.getEmail()); - - JwtDto jwt = userService.jwtMakeSave(user.getUsername()); - accessToken = jwt.getAccessToken(); - refreshToken = jwt.getRefreshToken(); - - } else { - User user = userService.createUser(userReqDto); - - JwtDto jwt = userService.jwtMakeSave(user.getUsername()); - accessToken = jwt.getAccessToken(); - refreshToken = jwt.getRefreshToken(); - - signIn = "newUser"; - } - - return ApiResponse.onSuccess(SuccessCode.USER_SOCIAL_LOGIN_SUCCESS, - UserConverter.jwtDto(accessToken, refreshToken, signIn)); - } - - @Operation(summary = "토큰 반환", description = "노인의 key 로그인 후, 프론트에게 유저 정보 받아 토큰 반환하는 메서드입니다.") - @ApiResponses({ - @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "USER_2012", description = "회원가입 & 로그인 성공"), - }) - @PostMapping("/generate/key") - public ApiResponse tokenToFront( - @RequestParam String key - ) { - User user = userService.findByUserName(key); - - JwtDto jwt = userService.jwtMakeSave(user.getUsername()); - String accessToken = jwt.getAccessToken(); - String refreshToken = jwt.getRefreshToken(); - - return ApiResponse.onSuccess(SuccessCode.USER_KEY_LOGIN_SUCCESS, - UserConverter.jwtDto(accessToken, refreshToken, "wasUser")); - } -} diff --git a/src/main/java/com/example/silverbridgeX_user/user/controller/UserController.java b/src/main/java/com/example/silverbridgeX_user/user/controller/UserController.java index ae548bc..cd6b8ad 100644 --- a/src/main/java/com/example/silverbridgeX_user/user/controller/UserController.java +++ b/src/main/java/com/example/silverbridgeX_user/user/controller/UserController.java @@ -35,6 +35,64 @@ public class UserController { private final UserService userService; + @Operation(summary = "소셜 회원가입", description = "프론트에게 유저 정보 받아 소셜 회원가입 후, 토큰 반환하는 메서드입니다.") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "USER_2011", description = "소셜 회원가입 성공"), + }) + @PostMapping("/social/sign-in") + public ApiResponse socialSignIn( + @RequestBody UserRequestDto.UserSigInReqDto userReqDto + ) throws Exception { + userService.validateNewUser(userReqDto.getEmail()); + + User user = userService.createUser(userReqDto); + + JwtDto jwt = userService.jwtMakeSave(user.getUsername()); + String accessToken = jwt.getAccessToken(); + String refreshToken = jwt.getRefreshToken(); + + return ApiResponse.onSuccess(SuccessCode.USER_SOCIAL_SIGNIN_SUCCESS, + UserConverter.jwtDto(accessToken, refreshToken, user.getUsername())); + } + + @Operation(summary = "소셜 로그인", description = "프론트에게 유저 정보 받아 소셜 회원가입 후, 토큰 반환하는 메서드입니다.") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "USER_2012", description = "소셜 로그인 성공"), + }) + @PostMapping("/social/login") + public ApiResponse socialLogin( + @RequestBody UserRequestDto.UserLoginReqDto userReqDto + ) { + userService.validateOldUser(userReqDto); + + User user = userService.findByEmail(userReqDto.getEmail()); + + JwtDto jwt = userService.jwtMakeSave(user.getUsername()); + String accessToken = jwt.getAccessToken(); + String refreshToken = jwt.getRefreshToken(); + + return ApiResponse.onSuccess(SuccessCode.USER_SOCIAL_LOGIN_SUCCESS, + UserConverter.jwtDto(accessToken, refreshToken, user.getUsername())); + } + + @Operation(summary = "key 로그인", description = "노인의 key 로그인 후, 프론트에게 유저 정보 받아 토큰 반환하는 메서드입니다.") + @ApiResponses({ + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "USER_2013", description = "회원가입 & 로그인 성공"), + }) + @PostMapping("/key/login") + public ApiResponse keyLogin( + @RequestParam String key + ) { + User user = userService.findByUserName(key); + + JwtDto jwt = userService.jwtMakeSave(user.getUsername()); + String accessToken = jwt.getAccessToken(); + String refreshToken = jwt.getRefreshToken(); + + return ApiResponse.onSuccess(SuccessCode.USER_KEY_LOGIN_SUCCESS, + UserConverter.jwtDto(accessToken, refreshToken, "wasUser")); + } + @Operation(summary = "로그아웃", description = "로그아웃하는 메서드입니다.") @ApiResponses({ @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "USER_2001", description = "로그아웃 되었습니다."), @@ -146,7 +204,7 @@ public ApiResponse assignOlder( @PostMapping(value = "/guardians/olders") public ApiResponse registerOlder( @AuthenticationPrincipal CustomUserDetails customUserDetails, - @RequestBody UserRequestDto.UserReqDto userReqDto + @RequestBody UserRequestDto.UserSigInReqDto userReqDto ) throws Exception { User guardian = userService.findByUserName(customUserDetails.getUsername()); diff --git a/src/main/java/com/example/silverbridgeX_user/user/converter/UserConverter.java b/src/main/java/com/example/silverbridgeX_user/user/converter/UserConverter.java index c162804..5a49469 100644 --- a/src/main/java/com/example/silverbridgeX_user/user/converter/UserConverter.java +++ b/src/main/java/com/example/silverbridgeX_user/user/converter/UserConverter.java @@ -9,7 +9,7 @@ import java.util.List; public class UserConverter { - public static User saveUser(UserRequestDto.UserReqDto userReqDto, String key) { + public static User saveUser(UserRequestDto.UserSigInReqDto userReqDto, String key) { return User.builder() .role(userReqDto.getRole()) diff --git a/src/main/java/com/example/silverbridgeX_user/user/dto/UserRequestDto.java b/src/main/java/com/example/silverbridgeX_user/user/dto/UserRequestDto.java index 0918ceb..48ebcc4 100644 --- a/src/main/java/com/example/silverbridgeX_user/user/dto/UserRequestDto.java +++ b/src/main/java/com/example/silverbridgeX_user/user/dto/UserRequestDto.java @@ -11,12 +11,12 @@ @NoArgsConstructor public class UserRequestDto { - @Schema(description = "UserReqDto") + @Schema(description = "UserSigInReqDto") @Getter @Builder @AllArgsConstructor @NoArgsConstructor - public static class UserReqDto { + public static class UserSigInReqDto { @Schema(description = "역할(OLDER/GUARDIAN)") private UserRole role; @@ -31,6 +31,19 @@ public static class UserReqDto { } + @Schema(description = "UserLoginReqDto") + @Getter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class UserLoginReqDto { + @Schema(description = "역할(OLDER/GUARDIAN)") + private UserRole role; + + @Schema(description = "이메일") + private String email; + } + @Schema(description = "UserNicknameReqDto") @Getter @Builder diff --git a/src/main/java/com/example/silverbridgeX_user/user/service/UserService.java b/src/main/java/com/example/silverbridgeX_user/user/service/UserService.java index e6b2125..6b1b78c 100644 --- a/src/main/java/com/example/silverbridgeX_user/user/service/UserService.java +++ b/src/main/java/com/example/silverbridgeX_user/user/service/UserService.java @@ -12,7 +12,7 @@ import com.example.silverbridgeX_user.user.dto.JwtDto; import com.example.silverbridgeX_user.user.dto.UserRequestDto; import com.example.silverbridgeX_user.user.dto.UserRequestDto.UserPreferenceDto; -import com.example.silverbridgeX_user.user.dto.UserRequestDto.UserReqDto; +import com.example.silverbridgeX_user.user.dto.UserRequestDto.UserSigInReqDto; import com.example.silverbridgeX_user.user.jwt.JwtTokenUtils; import com.example.silverbridgeX_user.user.repository.RefreshTokenRepository; import com.example.silverbridgeX_user.user.repository.UserRepository; @@ -72,7 +72,24 @@ public Boolean checkMemberByEmail(String email) { } @Transactional - public User createUser(UserReqDto userReqDto) throws Exception { + public void validateNewUser(String email) { + if (userRepository.existsByEmail(email)) { + throw new GeneralException(ErrorCode.USER_ALREADY_MEMBER); + } + } + + @Transactional + public void validateOldUser(UserRequestDto.UserLoginReqDto userReqDto) { + User older = userRepository.findByEmail(userReqDto.getEmail()) + .orElseThrow(() -> new GeneralException(ErrorCode.USER_NOT_FOUND_BY_EMAIL)); + + if (userReqDto.getRole() != older.getRole()) { + throw new GeneralException(ErrorCode.USER_ROLE_DIFFERENT); + } + } + + @Transactional + public User createUser(UserSigInReqDto userReqDto) throws Exception { String uniqueKey; do {