Spring Validation 처리에 대해
지금까지 Validation이거나 연관된 주제에 대한 내용을 여러번 정리했었다.
@Valid를 이용한 Exception처리와 ThymeLeaf 처리
Validator 생성 시 주의해야 할 점, Invalid target 오류
ErrorSerializer에 대해
Custom Validator 적용하기
@NotNull, @NotEmpty, @NotBlank
그런데 읽다보니 ResponseEntityHandlerException
를 통해서 처리하는 방법, BindingResult
, Errors
로 처리하는 방법 등 여러 선택사항이 있어 대체 이것들이 뭐길레 방법이 이렇게 있지 헷갈렸다. 그래서 정리해본다.
먼저 다음과 같이 진행해보았다. @NotBlank
를 달아주었고 default message가 아닌 message 속성값을 줘서 내가 원하는 문구를 지정해놨다. 그리고 @Valid
를 걸어서 검증작업을 해주었다. 위의 결과는 400 bad_request 가 나왔다.
그렇다면 Errors errors
를 추가한 현재는 어떤 값이 나왔을까? 결과는 정상적으로 리턴이 되었다.BindingResult result
일 때에도 정상적으로 리턴이 되었다.
.hasErrors()
로 에러가 존재하는지 확인 후 return 하려는 값을 내가 원하는대로 처리해줄 수 있다.
왜 맨 처음 케이스는 400에러가 났을까?? 왜냐하면 @Valid
를 어기면 MethodArgumentNotValidException
이 발생하기 때문이다. 이것을 @ExceptionHandler
를 이용해서 처리해줄 수가 있다.
다음과 같은 방법으로 말이다. 위의 코드를 보면 @ExceptionHandler(MethodArgumentNotValidException.class)
로 잡은 것을 볼 수 있다. 그리고 밑에 오버라이딩된 메소드도 볼 수 있다.
둘 중 하나의 방법을 사용하면 되는데, 오버라이딩 메소드는 ResponseEntityExceptionHandler
를 상속받아 사용한 메소드이다. ResponseEntityExceptionHandler
는 Spring MVC가 제공하는 Exception들의 처리를 간단하게 등록하도록 도와주는 클래스다. 반환값이 ResponseEntity
인 것을 사용해보면 알 수 있다.
메소드들의 일부이다. 이 곳에 MethodArgumentNotValidException
맞춤 메소드인 handleMethodArgumentNotValid
메소드를 오버라이딩해서 사용한 것이다. 이곳에서 예외를 핸들링 해버리면 파라미터에 BindingResult
, Errors
를 추가하지 않아도 내가 원하는 행위를 처리할 수가 있다.(물론 자신이 어떤 식으로 수행할 것인지에 따라 다를 수 있다)
그렇다면 BindingResult
와 Errors
는 무슨 차이점이 있는걸까?Errors
는 유효성 검증 결과를 저장할 때 사용하는 인터페이스다.BindingResult
도 인터페이스다. Errors
의 하위 인터페이스다. 폼 값을 커맨드 객체에 바인딩한 결과를 저장하고 에러 코드로부터 에러 메세지를 가져온다.
(Spring 3.0 프로그래밍 - 최범균)
Reference
'Spring' 카테고리의 다른 글
[Spring] Mockito.mock() vs @Mock vs @MockBean (0) | 2021.05.19 |
---|---|
[Spring] CORS와 처리 방법에 대해 (0) | 2021.05.18 |
[Spring] @Transactional 에 대해 (0) | 2021.05.09 |
[Spring] @BeforeEach @BeforeAll @AfterEach @AfterAll 에 대해 (0) | 2020.12.02 |
[Spring] Validator 생성 시 주의해야 할 점, Invalid target 오류 (1) | 2020.12.02 |