POST http://localhost:8080/users with Validation Errors
아래와 같이 null 값인 name을 request를 보낼 때, Validation Failed 라고 알려주는 것을 추가해주고 싶다!
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
현재 POST /users과 mapping된 createUser 함수에서 유효성 검사를 할 거니까, 해당 함수를 수정할 것
@PostMapping("/users")
public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
//NO_CHANGE
}
이때, @Valid 어노테이션을 붙이면, 메서드 파라미터에서 바인딩이 수행될 때, 객체에 정의된 유효성 검증이 자동으로 수행되는 것!
하지만 아직, 매개변수인 User클래스에 대한 유효성 검증 규칙을 정의하지 않았다 !
import jakarta.validation.constraints.Past;
import jakarta.validation.constraints.Size;
@Size(min=2, message = "Name should have atleast 2 characters")
private String name;
@Past(message = "Birth Date should be in the past")
private LocalDate birthDate;
즉, @Size나 @Past 검증 규칙에 어긋나는 것을 POST method에 추가한다면, HTTP response status를 400 (Bad request)를 반환할 것이다!!
그렇다면, 이제 추가로, 컨트롤러에서 입력 검증 실패 시 예외를 처리하는 부분을 추가해줘야 한다!
@Nullable
protected ResponseEntity<Object> handleMethodArgumentNotValid(
MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request) {
return handleExceptionInternal(ex, null, headers, status, request);
}
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
HttpHeaders headers, HttpStatusCode status, WebRequest request) {
ErrorDetails errorDetails = new ErrorDetails(LocalDateTime.now(),
"Total Errors : " + ex.getErrorCount() + " First Error : " + ex.getFieldError().getDefaultMessage(),
request.getDescription(false));
return new ResponseEntity(errorDetails, HttpStatus.BAD_REQUEST);
}
HttpStatus.BAD_REQUEST
getErrorCount()
로 총 에러의 개수를 반환했고, getFieldError().getDefaultMessage()
로 첫번째로 발생한 에러를 반환시켰다.빈 문자열과 미래 시점의 user를 post시키면, response status 400과 함께 다음 형태의 response body가 리턴된다.
// response body BODY
{
"timestamp": "2024-03-05T15:57:59.109858",
"message": "Total Errors : 2 First Error : Birth Date should be in the past",
"details": "uri=/users"
}
이처럼 MethodArgumentNotValidException ex
의 클래스 원형을 들어가보면, 에러를 다루는 다양한 함수가 있음. REST API를 만들 때 소비자가 에러 메세지를 이해하기 쉽게 만들면 된다.
참고 및 출처
이 시리즈는 Udemy 강의의 내용을 정리한 것입니다.
https://www.udemy.com/course/spring-boot-and-spring-framework-korean/