Bepoz
파즈의 공부 일기
Bepoz
전체 방문자
오늘
어제
  • 분류 전체보기 (232)
    • 공부 기록들 (85)
      • 우테코 (17)
    • Spring (85)
    • Java (43)
    • Infra (17)
    • 책 정리 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Bepoz

파즈의 공부 일기

Spring

[Spring] Spring Validation 처리에 대해

2021. 5. 9. 20:07

Spring Validation 처리에 대해

지금까지 Validation이거나 연관된 주제에 대한 내용을 여러번 정리했었다.

@Valid를 이용한 Exception처리와 ThymeLeaf 처리
Validator 생성 시 주의해야 할 점, Invalid target 오류
ErrorSerializer에 대해
Custom Validator 적용하기
@NotNull, @NotEmpty, @NotBlank

그런데 읽다보니 ResponseEntityHandlerException를 통해서 처리하는 방법, BindingResult, Errors로 처리하는 방법 등 여러 선택사항이 있어 대체 이것들이 뭐길레 방법이 이렇게 있지 헷갈렸다. 그래서 정리해본다.


스크린샷 2021-05-09 오후 7 21 40 스크린샷 2021-05-09 오후 7 21 49

먼저 다음과 같이 진행해보았다. @NotBlank를 달아주었고 default message가 아닌 message 속성값을 줘서 내가 원하는 문구를 지정해놨다. 그리고 @Valid를 걸어서 검증작업을 해주었다. 위의 결과는 400 bad_request 가 나왔다.

스크린샷 2021-05-09 오후 7 34 54

그렇다면 Errors errors를 추가한 현재는 어떤 값이 나왔을까? 결과는 정상적으로 리턴이 되었다.
BindingResult result일 때에도 정상적으로 리턴이 되었다.

.hasErrors()로 에러가 존재하는지 확인 후 return 하려는 값을 내가 원하는대로 처리해줄 수 있다.

왜 맨 처음 케이스는 400에러가 났을까?? 왜냐하면 @Valid를 어기면 MethodArgumentNotValidException이 발생하기 때문이다. 이것을 @ExceptionHandler를 이용해서 처리해줄 수가 있다.

스크린샷 2021-05-09 오후 7 38 36

다음과 같은 방법으로 말이다. 위의 코드를 보면 @ExceptionHandler(MethodArgumentNotValidException.class)로 잡은 것을 볼 수 있다. 그리고 밑에 오버라이딩된 메소드도 볼 수 있다.

둘 중 하나의 방법을 사용하면 되는데, 오버라이딩 메소드는 ResponseEntityExceptionHandler를 상속받아 사용한 메소드이다. ResponseEntityExceptionHandler는 Spring MVC가 제공하는 Exception들의 처리를 간단하게 등록하도록 도와주는 클래스다. 반환값이 ResponseEntity인 것을 사용해보면 알 수 있다.

스크린샷 2021-05-09 오후 7 43 39

메소드들의 일부이다. 이 곳에 MethodArgumentNotValidException 맞춤 메소드인 handleMethodArgumentNotValid 메소드를 오버라이딩해서 사용한 것이다. 이곳에서 예외를 핸들링 해버리면 파라미터에 BindingResult, Errors를 추가하지 않아도 내가 원하는 행위를 처리할 수가 있다.(물론 자신이 어떤 식으로 수행할 것인지에 따라 다를 수 있다)


그렇다면 BindingResult와 Errors는 무슨 차이점이 있는걸까?
Errors는 유효성 검증 결과를 저장할 때 사용하는 인터페이스다.
BindingResult도 인터페이스다. Errors의 하위 인터페이스다. 폼 값을 커맨드 객체에 바인딩한 결과를 저장하고 에러 코드로부터 에러 메세지를 가져온다.

스크린샷 2021-05-09 오후 8 00 32

(Spring 3.0 프로그래밍 - 최범균)


Reference

https://docs.spring.io/spring-framework/docs/3.1.3.RELEASE_to_3.2.0.RC2/Spring%20Framework%203.2.0.RC2/index.html?org/springframework/web/servlet/mvc/method/annotation/ResponseEntityExceptionHandler.html

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/validation/BindingResult.html

'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
    'Spring' 카테고리의 다른 글
    • [Spring] Mockito.mock() vs @Mock vs @MockBean
    • [Spring] CORS와 처리 방법에 대해
    • [Spring] @Transactional 에 대해
    • [Spring] @BeforeEach @BeforeAll @AfterEach @AfterAll 에 대해
    Bepoz
    Bepoz
    https://github.com/Be-poz/TIL

    티스토리툴바