From cacdfe0596d7a5463076daefa49795af37adf3f3 Mon Sep 17 00:00:00 2001 From: Chae-Yu Date: Thu, 24 Jul 2025 16:53:29 +0900 Subject: [PATCH 1/5] feat: add error code and success code --- .../com/blockguard/server/global/common/codes/ErrorCode.java | 1 + .../blockguard/server/global/common/codes/SuccessCode.java | 3 ++- .../global/config/swagger/SwaggerResponseDescription.java | 4 ++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/blockguard/server/global/common/codes/ErrorCode.java b/src/main/java/com/blockguard/server/global/common/codes/ErrorCode.java index 04c6b4d..31708f6 100644 --- a/src/main/java/com/blockguard/server/global/common/codes/ErrorCode.java +++ b/src/main/java/com/blockguard/server/global/common/codes/ErrorCode.java @@ -24,6 +24,7 @@ public enum ErrorCode { INVALID_DIRECTORY_ROUTE(HttpStatus.NOT_FOUND, 4022, "잘못된 디렉토리 경로입니다."), FILE_SIZE_EXCEEDED(HttpStatus.PAYLOAD_TOO_LARGE, 4023, "프로필 파일 최대 허용 용량(5MB)을 초과했습니다."), DUPLICATE_GUARDIAN_NAME(HttpStatus.BAD_REQUEST, 4024, "이미 등록된 보호자 이름입니다."), + INVALID_EMAIL_TYPE(HttpStatus.BAD_REQUEST, 4025, "이메일 형식이 올바르지 않습니다."), // 5000~ : server error INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, 5000, "서버 오류가 발생했습니다."); diff --git a/src/main/java/com/blockguard/server/global/common/codes/SuccessCode.java b/src/main/java/com/blockguard/server/global/common/codes/SuccessCode.java index 718f2b0..c1b79ad 100644 --- a/src/main/java/com/blockguard/server/global/common/codes/SuccessCode.java +++ b/src/main/java/com/blockguard/server/global/common/codes/SuccessCode.java @@ -21,7 +21,8 @@ public enum SuccessCode { GUARDIAN_LIST_RETRIEVED(HttpStatus.OK, 2010, "보호자 목록 조회가 완료되었습니다."), GUARDIAN_UPDATED(HttpStatus.OK, 2011, "보호자 정보 수정이 완료되었습니다."), GUARDIAN_PRIMARY_UPDATED(HttpStatus.OK, 2012, "보호자 정보 수정이 완료되었습니다."), - GUARDIAN_DELETED(HttpStatus.NO_CONTENT, 2013, "보호자 삭제 처리되었습니다."); + GUARDIAN_DELETED(HttpStatus.NO_CONTENT, 2013, "보호자 삭제 처리되었습니다."), + CHECK_EMAIL_DUPLICATED(HttpStatus.OK, 2014, "이메일 중복 확인이 완료되었습니다."); private final HttpStatus status; private final int code; diff --git a/src/main/java/com/blockguard/server/global/config/swagger/SwaggerResponseDescription.java b/src/main/java/com/blockguard/server/global/config/swagger/SwaggerResponseDescription.java index 126664e..1ed0bd7 100644 --- a/src/main/java/com/blockguard/server/global/config/swagger/SwaggerResponseDescription.java +++ b/src/main/java/com/blockguard/server/global/config/swagger/SwaggerResponseDescription.java @@ -58,6 +58,10 @@ public enum SwaggerResponseDescription { UPDATE_GUARDIAN_PRIMARY_FAIL(new LinkedHashSet<>(Set.of( ErrorCode.GUARDIAN_NOT_FOUND + ))), + + CHECK_EMAIL_DUPLICATED_FAIL(new LinkedHashSet<>(Set.of( + ErrorCode.INVALID_EMAIL_TYPE ))); private final Set errorCodeList; From 2a25cca0a67e7fa4cbd224eb3c87c20a091d8900 Mon Sep 17 00:00:00 2001 From: Chae-Yu Date: Thu, 24 Jul 2025 16:54:08 +0900 Subject: [PATCH 2/5] feat: add check duplicated email api - if email already exists, return ture --- .../server/domain/auth/api/AuthApi.java | 19 +++++++++++++------ .../domain/auth/application/AuthService.java | 15 +++++++++++---- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/blockguard/server/domain/auth/api/AuthApi.java b/src/main/java/com/blockguard/server/domain/auth/api/AuthApi.java index e0206ad..4aab7a3 100644 --- a/src/main/java/com/blockguard/server/domain/auth/api/AuthApi.java +++ b/src/main/java/com/blockguard/server/domain/auth/api/AuthApi.java @@ -1,10 +1,8 @@ package com.blockguard.server.domain.auth.api; import com.blockguard.server.domain.auth.application.AuthService; -import com.blockguard.server.domain.user.dto.request.FindEmailRequest; -import com.blockguard.server.domain.user.dto.request.FindPasswordRequest; -import com.blockguard.server.domain.user.dto.request.LoginRequest; -import com.blockguard.server.domain.user.dto.request.RegisterRequest; +import com.blockguard.server.domain.user.dto.request.*; +import com.blockguard.server.domain.user.dto.response.CheckEmailDuplicatedResponse; import com.blockguard.server.domain.user.dto.response.FindEmailResponse; import com.blockguard.server.domain.user.dto.response.LoginResponse; import com.blockguard.server.domain.user.dto.response.RegisterResponse; @@ -36,6 +34,15 @@ public ResponseEntity> register(@Valid @RequestBo } + @Operation(summary = "이메일 중복 확인", description = "true 반환 시, 이메일 중복") + @CustomExceptionDescription(SwaggerResponseDescription.CHECK_EMAIL_DUPLICATED_FAIL) + @PostMapping("/register/check-email") + public ResponseEntity> checkEmailDuplicated(@Valid @RequestBody CheckEmailDuplicatedRequest CheckEmailDuplicatedRequest) { + CheckEmailDuplicatedResponse checkEmailResponse = authService.checkEmailDuplicated(CheckEmailDuplicatedRequest); + return ResponseEntity.ok(BaseResponse.of(SuccessCode.CHECK_EMAIL_DUPLICATED, checkEmailResponse)); + + } + @Operation(summary = "로그인") @CustomExceptionDescription(SwaggerResponseDescription.LOGIN_FAIL) @@ -48,7 +55,7 @@ public ResponseEntity> login(@RequestBody LoginReque @Operation(summary = "아이디 찾기") @CustomExceptionDescription(SwaggerResponseDescription.FIND_EMAIL_FAIL) @PostMapping("find-email") - public ResponseEntity> findEmail(@RequestBody @Valid FindEmailRequest findEmailRequest){ + public ResponseEntity> findEmail(@RequestBody @Valid FindEmailRequest findEmailRequest) { FindEmailResponse findEmailResponse = authService.findEmail(findEmailRequest); return ResponseEntity.ok(BaseResponse.of(SuccessCode.USER_EMAIL_FOUND, findEmailResponse)); } @@ -56,7 +63,7 @@ public ResponseEntity> findEmail(@RequestBody @V @Operation(summary = "비밀번호 찾기", description = "이메일이 유효하면 해당 이메일로 임시 비밀번호를 발송합니다.") @CustomExceptionDescription(SwaggerResponseDescription.FIND_PASSWORD_FAIL) @PostMapping("find-password") - public ResponseEntity> findPassword(@RequestBody @Valid FindPasswordRequest findPasswordRequest){ + public ResponseEntity> findPassword(@RequestBody @Valid FindPasswordRequest findPasswordRequest) { authService.sendTempPassword(findPasswordRequest); return ResponseEntity.ok(BaseResponse.of(SuccessCode.SEND_TEMP_PASSWORD_BY_EMAIL)); } diff --git a/src/main/java/com/blockguard/server/domain/auth/application/AuthService.java b/src/main/java/com/blockguard/server/domain/auth/application/AuthService.java index 75b7028..5bc4356 100644 --- a/src/main/java/com/blockguard/server/domain/auth/application/AuthService.java +++ b/src/main/java/com/blockguard/server/domain/auth/application/AuthService.java @@ -3,11 +3,9 @@ import com.blockguard.server.domain.auth.domain.JwtToken; import com.blockguard.server.domain.auth.infra.JwtTokenGenerator; import com.blockguard.server.domain.user.domain.User; -import com.blockguard.server.domain.user.dto.request.FindEmailRequest; -import com.blockguard.server.domain.user.dto.request.FindPasswordRequest; -import com.blockguard.server.domain.user.dto.request.LoginRequest; +import com.blockguard.server.domain.user.dto.request.*; import com.blockguard.server.domain.user.dao.UserRepository; -import com.blockguard.server.domain.user.dto.request.RegisterRequest; +import com.blockguard.server.domain.user.dto.response.CheckEmailDuplicatedResponse; import com.blockguard.server.domain.user.dto.response.FindEmailResponse; import com.blockguard.server.domain.user.dto.response.LoginResponse; import com.blockguard.server.domain.user.dto.response.RegisterResponse; @@ -53,6 +51,14 @@ public RegisterResponse register(RegisterRequest registerRequest) { .build(); } + + public CheckEmailDuplicatedResponse checkEmailDuplicated(CheckEmailDuplicatedRequest CheckEmailDuplicatedRequest) { + boolean isDuplicated = userRepository.findByEmail(CheckEmailDuplicatedRequest.getEmail()).isPresent(); + return CheckEmailDuplicatedResponse.builder() + .isDuplicated(isDuplicated) + .build(); + } + public LoginResponse login(LoginRequest loginRequest) { User user = userRepository.findByEmail(loginRequest.getEmail()) .orElseThrow(() -> new BusinessExceptionHandler(ErrorCode.INVALID_EMAIL)); @@ -135,4 +141,5 @@ private String generateTempPassword() { return finalPassword.toString(); } + } From 671070d862d34579e3f3b3d41fdf44504fe59c01 Mon Sep 17 00:00:00 2001 From: Chae-Yu Date: Thu, 24 Jul 2025 16:54:29 +0900 Subject: [PATCH 3/5] feat: add check duplicated email dto --- .../dto/request/CheckEmailDuplicatedRequest.java | 14 ++++++++++++++ .../dto/response/CheckEmailDuplicatedResponse.java | 14 ++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 src/main/java/com/blockguard/server/domain/user/dto/request/CheckEmailDuplicatedRequest.java create mode 100644 src/main/java/com/blockguard/server/domain/user/dto/response/CheckEmailDuplicatedResponse.java diff --git a/src/main/java/com/blockguard/server/domain/user/dto/request/CheckEmailDuplicatedRequest.java b/src/main/java/com/blockguard/server/domain/user/dto/request/CheckEmailDuplicatedRequest.java new file mode 100644 index 0000000..9a77bdf --- /dev/null +++ b/src/main/java/com/blockguard/server/domain/user/dto/request/CheckEmailDuplicatedRequest.java @@ -0,0 +1,14 @@ +package com.blockguard.server.domain.user.dto.request; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class CheckEmailDuplicatedRequest { + @Email + @NotBlank + private String email; +} diff --git a/src/main/java/com/blockguard/server/domain/user/dto/response/CheckEmailDuplicatedResponse.java b/src/main/java/com/blockguard/server/domain/user/dto/response/CheckEmailDuplicatedResponse.java new file mode 100644 index 0000000..6bfc578 --- /dev/null +++ b/src/main/java/com/blockguard/server/domain/user/dto/response/CheckEmailDuplicatedResponse.java @@ -0,0 +1,14 @@ +package com.blockguard.server.domain.user.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class CheckEmailDuplicatedResponse { + private boolean isDuplicated; +} From 14ff8d4d0d114f614f5ffb1587529fcc9666856b Mon Sep 17 00:00:00 2001 From: Chae-Yu Date: Thu, 24 Jul 2025 17:06:53 +0900 Subject: [PATCH 4/5] refactor: return check valid error --- .../server/global/common/codes/ErrorCode.java | 1 + .../exception/GlobalExceptionHandler.java | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/main/java/com/blockguard/server/global/common/codes/ErrorCode.java b/src/main/java/com/blockguard/server/global/common/codes/ErrorCode.java index 31708f6..f3120fe 100644 --- a/src/main/java/com/blockguard/server/global/common/codes/ErrorCode.java +++ b/src/main/java/com/blockguard/server/global/common/codes/ErrorCode.java @@ -8,6 +8,7 @@ @AllArgsConstructor public enum ErrorCode { /// 4000 ~ : client error + INVALID_REQUEST(HttpStatus.BAD_REQUEST, 4000, "잘못된 요청 형식입니다. 입력값을 확인해주세요."), DUPLICATED_EMAIL(HttpStatus.BAD_REQUEST, 4001, "이미 가입된 이메일입니다."), INVALID_EMAIL(HttpStatus.BAD_REQUEST, 4002, "존재하지 않는 이메일입니다."), INVALID_PASSWORD(HttpStatus.BAD_REQUEST, 4003, "비밀번호가 일치하지 않습니다."), diff --git a/src/main/java/com/blockguard/server/global/exception/GlobalExceptionHandler.java b/src/main/java/com/blockguard/server/global/exception/GlobalExceptionHandler.java index 6d23dfb..684f7f9 100644 --- a/src/main/java/com/blockguard/server/global/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/blockguard/server/global/exception/GlobalExceptionHandler.java @@ -3,7 +3,9 @@ import com.blockguard.server.global.common.codes.ErrorCode; import com.blockguard.server.global.common.response.ErrorResponse; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.support.DefaultMessageSourceResolvable; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.multipart.MaxUploadSizeExceededException; @@ -21,6 +23,26 @@ protected ResponseEntity handleCustomException(BusinessExceptionH .body(ErrorResponse.of(errorCode)); } + @ExceptionHandler(MethodArgumentNotValidException.class) + protected ResponseEntity handleValidationException(MethodArgumentNotValidException ex) { + String message = ex.getBindingResult().getFieldErrors().stream() + .findFirst() + .map(DefaultMessageSourceResolvable::getDefaultMessage) + .orElse("유효성 검사에 실패했습니다."); + + log.warn("[ValidationException] message: {}", message); + + if (message.contains("이메일 형식")) { + return ResponseEntity + .status(ErrorCode.INVALID_EMAIL_TYPE.getStatus()) + .body(ErrorResponse.of(ErrorCode.INVALID_EMAIL_TYPE)); + } + + return ResponseEntity + .status(ErrorCode.INVALID_REQUEST.getStatus()) + .body(ErrorResponse.of(ErrorCode.INVALID_REQUEST, message)); + } + @ExceptionHandler(MaxUploadSizeExceededException.class) protected ResponseEntity handleMaxUploadSize(MaxUploadSizeExceededException maxUploadSizeExceededException) { log.error("[MaxUploadSizeExceeded] message: {}", maxUploadSizeExceededException.getMessage()); From 3711f2ef1a7fb0788bbb44604b7aaabd99b1029f Mon Sep 17 00:00:00 2001 From: Chae-Yu Date: Thu, 24 Jul 2025 17:16:02 +0900 Subject: [PATCH 5/5] refactor: change parameter name --- .../server/domain/auth/application/AuthService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/blockguard/server/domain/auth/application/AuthService.java b/src/main/java/com/blockguard/server/domain/auth/application/AuthService.java index 5bc4356..bb7d9af 100644 --- a/src/main/java/com/blockguard/server/domain/auth/application/AuthService.java +++ b/src/main/java/com/blockguard/server/domain/auth/application/AuthService.java @@ -52,8 +52,8 @@ public RegisterResponse register(RegisterRequest registerRequest) { } - public CheckEmailDuplicatedResponse checkEmailDuplicated(CheckEmailDuplicatedRequest CheckEmailDuplicatedRequest) { - boolean isDuplicated = userRepository.findByEmail(CheckEmailDuplicatedRequest.getEmail()).isPresent(); + public CheckEmailDuplicatedResponse checkEmailDuplicated(CheckEmailDuplicatedRequest checkEmailDuplicatedRequest) { + boolean isDuplicated = userRepository.findByEmail(checkEmailDuplicatedRequest.getEmail()).isPresent(); return CheckEmailDuplicatedResponse.builder() .isDuplicated(isDuplicated) .build();