Skip to content

Commit 8290982

Browse files
authored
Merge pull request #26 from Block-Guard/docs/#25/swagger-response-fix
[Docs] Swagger Error 예시 응답 수정 &
2 parents 8f83d69 + d2c20e6 commit 8290982

File tree

5 files changed

+74
-12
lines changed

5 files changed

+74
-12
lines changed

src/main/java/com/blockguard/server/domain/guardian/dto/request/CreateGuardianRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public class CreateGuardianRequest {
1616
private String name;
1717

1818
@NotBlank
19-
@Pattern(regexp = "^010-\\d{4}-\\d{4}$", message = "010-1234-5678 형식이어야 합니다.")
19+
@Pattern(regexp = "^\\d{3}-\\d{4}-\\d{4}$", message = "phoneNumber must match 010-1234-5678 format")
2020
private String phoneNumber;
2121

2222
@Schema(requiredMode = Schema.RequiredMode.NOT_REQUIRED)

src/main/java/com/blockguard/server/domain/user/api/UserApi.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.blockguard.server.global.config.swagger.SwaggerResponseDescription;
1313
import io.swagger.v3.oas.annotations.Operation;
1414
import io.swagger.v3.oas.annotations.Parameter;
15+
import jakarta.validation.Valid;
1516
import lombok.AllArgsConstructor;
1617
import org.springframework.http.MediaType;
1718
import org.springframework.web.bind.annotation.*;
@@ -23,6 +24,7 @@ public class UserApi {
2324
private final UserService userService;
2425

2526
@GetMapping("/me")
27+
@CustomExceptionDescription(SwaggerResponseDescription.INVALID_TOKEN)
2628
@Operation(summary = "마이페이지 조회")
2729
public BaseResponse<MyPageResponse> getMyPageInfo(@Parameter(hidden = true) @CurrentUser User user){
2830
MyPageResponse myPageResponse = userService.getMyPageInfo(user);
@@ -33,14 +35,14 @@ public BaseResponse<MyPageResponse> getMyPageInfo(@Parameter(hidden = true) @Cur
3335
@CustomExceptionDescription(SwaggerResponseDescription.UPDATE_MY_PAGE_INFO_FAIL)
3436
@Operation(summary = "회원 정보 수정", description = "아이디를 제외하고 수정가능합니다. 생년월일 형식은 'yyyyMMDD'로 입력해야합니다.")
3537
public BaseResponse<Void> updateUserInfo(@Parameter(hidden = true) @CurrentUser User user,
36-
@ModelAttribute UpdateUserInfo updateUserInfo){
38+
@Valid @ModelAttribute UpdateUserInfo updateUserInfo){
3739
userService.updateUserInfo(user.getId(), updateUserInfo);
3840
return BaseResponse.of(SuccessCode.UPDATE_USER_INFO_SUCCESS);
3941

4042
}
4143

4244
@PutMapping(value = "/me/password")
43-
@CustomExceptionDescription(SwaggerResponseDescription.UPDATE_MY_PAGE_INFO_FAIL)
45+
@CustomExceptionDescription(SwaggerResponseDescription.UPDATE_PASSWORD_FAIL)
4446
@Operation(summary = "비밀번호 변경", description = "현재 비밀번호를 확인하고, 새 비밀번호로 변경합니다.")
4547
public BaseResponse<Void> updatePassword(@Parameter(hidden = true) @CurrentUser User user,
4648
@RequestBody UpdatePasswordRequest updatePasswordRequest){
@@ -50,12 +52,11 @@ public BaseResponse<Void> updatePassword(@Parameter(hidden = true) @CurrentUser
5052
}
5153

5254
@DeleteMapping("/withdraw")
55+
@CustomExceptionDescription(SwaggerResponseDescription.INVALID_TOKEN)
5356
@Operation(summary = "회원 탈퇴")
5457
public BaseResponse<Void> withdraw(@Parameter(hidden = true) @CurrentUser User user){
5558
userService.withdraw(user.getId());
5659
return BaseResponse.of(SuccessCode.WITHDRAW_SUCCESS);
5760
}
5861

59-
60-
6162
}

src/main/java/com/blockguard/server/domain/user/dto/request/UpdateUserInfo.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package com.blockguard.server.domain.user.dto.request;
22

3+
import com.fasterxml.jackson.annotation.JsonFormat;
4+
import io.swagger.v3.oas.annotations.media.Schema;
5+
import jakarta.validation.constraints.NotBlank;
6+
import jakarta.validation.constraints.Pattern;
37
import lombok.AllArgsConstructor;
48
import lombok.Builder;
59
import lombok.Getter;
@@ -9,9 +13,19 @@
913
@AllArgsConstructor
1014
@Builder
1115
public class UpdateUserInfo {
16+
@NotBlank
1217
private String name;
18+
19+
@NotBlank
20+
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyyMMdd")
21+
@Schema(description = "생년월일 yyyyMMdd", example = "20000101")
1322
private String birthDate; //yyyyMMDD
23+
24+
@NotBlank
25+
@Pattern(regexp = "^\\d{3}-\\d{4}-\\d{4}$",
26+
message = "phoneNumber must match 010-1234-5678 format")
1427
private String phoneNumber;
28+
1529
private MultipartFile profileImage;
1630

1731
}

src/main/java/com/blockguard/server/global/config/swagger/SwaggerResponseDescription.java

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99
@Getter
1010
public enum SwaggerResponseDescription {
1111
REGISTER_FAIL(new LinkedHashSet<>(Set.of(
12-
ErrorCode.DUPLICATED_EMAIL
12+
ErrorCode.DUPLICATED_EMAIL,
13+
ErrorCode.INVALID_EMAIL_TYPE,
14+
ErrorCode.INVALID_PHONE_NUMBER_FORMAT,
15+
ErrorCode.INVALID_DATE_FORMAT
1316
))),
1417

1518
LOGIN_FAIL(new LinkedHashSet<>(Set.of(
@@ -18,26 +21,38 @@ public enum SwaggerResponseDescription {
1821
))),
1922

2023
FIND_EMAIL_FAIL(new LinkedHashSet<>(Set.of(
21-
ErrorCode.USER_INFO_NOT_FOUND
24+
ErrorCode.USER_INFO_NOT_FOUND,
25+
ErrorCode.INVALID_PHONE_NUMBER_FORMAT,
26+
ErrorCode.INVALID_DATE_FORMAT
2227
))),
2328

2429
UPDATE_MY_PAGE_INFO_FAIL(new LinkedHashSet<>(Set.of(
2530
ErrorCode.INVALID_PHONE_NUMBER_FORMAT,
31+
ErrorCode.INVALID_DATE_FORMAT,
2632
ErrorCode.INVALID_PROFILE_IMAGE,
33+
ErrorCode.INVALID_TOKEN,
2734
ErrorCode.FILE_NAME_NOT_FOUND,
2835
ErrorCode.INVALID_DIRECTORY_ROUTE,
2936
ErrorCode.FILE_SIZE_EXCEEDED
3037
))),
3138

39+
UPDATE_PASSWORD_FAIL(new LinkedHashSet<>(Set.of(
40+
ErrorCode.INVALID_TOKEN,
41+
ErrorCode.PASSWORD_MISMATCH
42+
))),
43+
3244
FIND_PASSWORD_FAIL(new LinkedHashSet<>(Set.of(
33-
ErrorCode.EMAIL_NOT_FOUND
45+
ErrorCode.EMAIL_NOT_FOUND,
46+
ErrorCode.INVALID_EMAIL_TYPE
3447
))),
3548

3649
FIND_GUARDIANS_FAIL(new LinkedHashSet<>(Set.of(
50+
ErrorCode.INVALID_TOKEN,
3751
ErrorCode.USER_INFO_NOT_FOUND
3852
))),
3953

4054
CREATE_GUARDIAN_FAIL(new LinkedHashSet<>(Set.of(
55+
ErrorCode.INVALID_TOKEN,
4156
ErrorCode.INVALID_PHONE_NUMBER_FORMAT,
4257
ErrorCode.INVALID_PROFILE_IMAGE,
4358
ErrorCode.FILE_NAME_NOT_FOUND,
@@ -47,6 +62,7 @@ public enum SwaggerResponseDescription {
4762
))),
4863

4964
UPDATE_GUARDIAN_FAIL(new LinkedHashSet<>(Set.of(
65+
ErrorCode.INVALID_TOKEN,
5066
ErrorCode.INVALID_PHONE_NUMBER_FORMAT,
5167
ErrorCode.INVALID_PROFILE_IMAGE,
5268
ErrorCode.GUARDIAN_NOT_FOUND,
@@ -57,21 +73,25 @@ public enum SwaggerResponseDescription {
5773
))),
5874

5975
UPDATE_GUARDIAN_PRIMARY_FAIL(new LinkedHashSet<>(Set.of(
76+
ErrorCode.INVALID_TOKEN,
6077
ErrorCode.GUARDIAN_NOT_FOUND
6178
))),
6279

6380
CHECK_EMAIL_DUPLICATED_FAIL(new LinkedHashSet<>(Set.of(
6481
ErrorCode.INVALID_EMAIL_TYPE
82+
))),
83+
84+
INVALID_TOKEN(new LinkedHashSet<>(Set.of(
85+
ErrorCode.INVALID_TOKEN
6586
)));
6687

6788
private final Set<ErrorCode> errorCodeList;
6889

6990
SwaggerResponseDescription(Set<ErrorCode> errorCodes) {
7091
// 공통 에러 추가
71-
errorCodes.addAll(Set.of(
72-
ErrorCode.INVALID_TOKEN,
92+
errorCodes.add(
7393
ErrorCode.INTERNAL_SERVER_ERROR
74-
));
94+
);
7595

7696
this.errorCodeList = errorCodes;
7797
}

src/main/java/com/blockguard/server/global/exception/GlobalExceptionHandler.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
import com.blockguard.server.global.common.codes.ErrorCode;
44
import com.blockguard.server.global.common.response.ErrorResponse;
5+
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
56
import lombok.extern.slf4j.Slf4j;
67
import org.springframework.context.support.DefaultMessageSourceResolvable;
78
import org.springframework.http.ResponseEntity;
9+
import org.springframework.http.converter.HttpMessageNotReadableException;
810
import org.springframework.web.bind.MethodArgumentNotValidException;
911
import org.springframework.web.bind.annotation.ExceptionHandler;
1012
import org.springframework.web.bind.annotation.RestControllerAdvice;
@@ -32,17 +34,42 @@ protected ResponseEntity<ErrorResponse> handleValidationException(MethodArgument
3234

3335
log.warn("[ValidationException] message: {}", message);
3436

35-
if (message.contains("이메일 형식")) {
37+
if (message.contains("이메일")) {
3638
return ResponseEntity
3739
.status(ErrorCode.INVALID_EMAIL_TYPE.getStatus())
3840
.body(ErrorResponse.of(ErrorCode.INVALID_EMAIL_TYPE));
3941
}
4042

43+
if (message.contains("phoneNumber")) {
44+
return ResponseEntity
45+
.status(ErrorCode.INVALID_PHONE_NUMBER_FORMAT.getStatus())
46+
.body(ErrorResponse.of(ErrorCode.INVALID_PHONE_NUMBER_FORMAT));
47+
}
48+
4149
return ResponseEntity
4250
.status(ErrorCode.INVALID_REQUEST.getStatus())
4351
.body(ErrorResponse.of(ErrorCode.INVALID_REQUEST, message));
4452
}
4553

54+
@ExceptionHandler(HttpMessageNotReadableException.class)
55+
protected ResponseEntity<ErrorResponse> handleHttpMessageNotReadable(HttpMessageNotReadableException ex) {
56+
log.warn("[HttpMessageNotReadable] message: {}", ex.getMessage());
57+
58+
Throwable cause = ex.getCause();
59+
if (cause instanceof InvalidFormatException invalidEx) {
60+
// LocalDate 파싱 실패인지 확인
61+
if (invalidEx.getTargetType().equals(java.time.LocalDate.class)) {
62+
return ResponseEntity
63+
.status(ErrorCode.INVALID_DATE_FORMAT.getStatus())
64+
.body(ErrorResponse.of(ErrorCode.INVALID_DATE_FORMAT));
65+
}
66+
}
67+
68+
return ResponseEntity
69+
.status(ErrorCode.INVALID_REQUEST.getStatus())
70+
.body(ErrorResponse.of(ErrorCode.INVALID_REQUEST, ex.getMessage()));
71+
}
72+
4673
@ExceptionHandler(MaxUploadSizeExceededException.class)
4774
protected ResponseEntity<ErrorResponse> handleMaxUploadSize(MaxUploadSizeExceededException maxUploadSizeExceededException) {
4875
log.error("[MaxUploadSizeExceeded] message: {}", maxUploadSizeExceededException.getMessage());

0 commit comments

Comments
 (0)