implementation 'org.springframework.boot:spring-boot-starter-validation'
@Getter
@NoArgsConstructor
public class RequestSimpleHospitalDto {
@NotBlank(message = "null 또는 공백이 입력되었습니다.")
private String address1;
@NotBlank(message = "null 또는 공백이 입력되었습니다.")
private String address2;
@DecimalMin(value = "1", message ="0보다 큰 값을 입력해주세요.")
private int pageNum;
}
null
인 경우를 허용하지 않음null
과 ""
둘 다 허용하지 않음null
과 ""
과 " "
모두 허용하지 않음@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class MessageUtil {
// 유효성 검사 관련
public static final String NOT_BLANK = "null 또는 공백이 입력되었습니다.";
public static final String ONE_TO_FIVE = "1~5 사이의 값을 입력해주세요.";
public static final String LARGER_THAN_ZERO = "0보다 큰 값을 입력해주세요.";
public static final String INVALID_EMAIL_FORMAT = "이메일 형식이 올바르지 않습니다.";
}
반복되는 유효성 검사 메시지를 통합적으로 관리하기 위해 MessageUtil이라는 클래스를 생성하였다. 이제 클래스에 추가된 문자열 필드를 사용함으로써 간단하게 메시지를 작성할 수 있다.
유효성 검사를 위한 규칙에 어긋날 경우 message가 포함된 에러 메시지 코드가 클라이언트에게 전달되나, 클라이언트 입장에서 대응하기 좀 곤란한 상황이 나타난다.
{
"timestamp": "2023-11-14T14:33:07.267+00:00",
"status": 400,
"error": "Bad Request",
"path": "/api/hospital/list"
}
@RestControllerAdvice
public class GlobalExceptionHandler {
....
@ExceptionHandler(MethodArgumentNotValidException.class) // 요청의 유효성 검사 실패 시
@ResponseStatus(HttpStatus.BAD_REQUEST) // 400 Bad Request로 응답 반환
public ApiResponse<Map<String, String>> handleInValidRequestException(MethodArgumentNotValidException e) {
// 에러가 발생한 객체 내 필드와 대응하는 에러 메시지를 map에 저장하여 반환
Map<String, String> errors = new HashMap<>();
e.getBindingResult().getFieldErrors().forEach(error -> {
String fieldName = error.getField();
String errorMessage = error.getDefaultMessage();
errors.put(fieldName, errorMessage);
});
return ApiResponse.fail(ResponseCode.BAD_REQUEST, errors);
}
}