- Spring MVC 마스터하기 Validation 82022년 05월 26일
- starryeye
- 작성자
- 2022.05.26.:58
반응형Validation 7번까지는 검증을 위해.. 아직도 코드를 쳐야할게 많아보인다.. 더 줄여보자..
그리고 검증하는 로직이 ... 개발자 대부분이 다 사용할 거 같은 검증 로직이다..
(min max 지정, null인지 체크하는 로직 등)
Bean Validator
하나의 기술표준이다. (JSR-380)
(단순히 하나의 인터페이스나 구현체가 아님, 검증 어노테이션과 여러 인터페이스의 모음)
스프링 부트가 spring-boot-starter-validation 라이브러리를 넣으면 자동으로 Bean Validator를 인지하고 스프링에 통합한다.
-> 스프링 부트는 LocalValidatorFactorBean을 글로벌 Validator(모든 컨트롤러에 적용되는 검증기)를 자동으로 등록한다.
-> 검증이 필요한 메서드 컨트롤러에는 검증 대상 객체 파라미터에 @Validated나 @Valid만 적용하면 된다.
(Validation 7번에서 했던 .. init 메서드나.. WebDataBinder는 필요가 없다)
-> 검증 대상 클래스에는 맴버 변수에 검증을 위한 어노테이션을 적용한다.(@NotNull 등)
검증이 필요한 메서드 컨트롤러에 @Validated가 적용된 모습을 볼 수 있다.
이전 포스팅에서 언급했지만 다시 정리 해보자면..
-> BindingResult는 타입 에러와 같이 컨트롤러가 호출 되기도 전에 예외가 터져서 컨트롤러가 호출이 되지않는 케이스를 방지하기 위함이다. (해당 파라미터가 있으면 위의 메서드 컨트롤러가 정상 호출 됨)
-> 하나의 필드 검증이 아닌.. 여러 필드가 복합적으로 섞인 검증오류를 처리하기 위한 로직은 위와 같이 따로 빼준다.
-> 검증에 실패하는 케이스 처리에 대한 로직도 구현 해줘야 한다.
검증 순서
검증 순서를 다시 한번 정리 해보자.
1. 쿼리파라미터(GET) 또는 HTML 폼(POST) 요청이 WAS로 들어왔다.
2. @ModelAttribute 어노테이션에 의해 Item 객체를 생성한다.
3. 각각의 필드에 타입 변환 시도 및 값 넣어 주기 시도.. (Binding)
-> 타입이 안 맞아서 binding이 실패
-> 메서드 컨트롤러에 BindingResult 파라미터가 존재한다.
(존재 하지 않으면 400 HttpStatus로 클라이언트에 응답)
-> BindingResult에 typeMismatch 로 FieldError 가 추가된다.
-> 컨트롤러 호출
(타입오류가 발생된 필드는 null이다.)
3번에서 바인딩 성공을 했다면...
-> 글로벌 Validator(LocalValidatorFactorBean)이 작동된다. (개발자가 의도한 검증)
-> 각 필드에 적용한 검증 어노테이션에 따라 검증이 된다.
참고로.. 메세지코드는 어떻게 적용할까...
타입 에러의 메세지 코드 처리와 같이.. 이미 정해져있다.
MessageCodeResolver가 아래와 같이 메세지코드를 만들어준다.
개발자는 아래를 활용하여 에러 프로퍼티를 만들어 주기만 하면된다.
Item객체의 itemName필드에 @NotBlank를 적용했을 때의 경우
@NotBlank
NotBlank.item.itemName
NotBlank.itemName
NotBlank.java.lang.String
NotBlank
Item객체의 price필드에 @Range를 적용했을 때의 경우
@Range
Range.item.price
Range.price
Range.java.lang.Integer
Range
반응형'Spring > MVC' 카테고리의 다른 글
Spring MVC 마스터하기 Validation 10 (0) 2022.05.28 Spring MVC 마스터하기 Validation 9 (0) 2022.05.26 Spring MVC 마스터하기 Validation 7 (0) 2022.05.26 Spring MVC 마스터하기 Validation 6 (0) 2022.05.26 Spring MVC 마스터하기 Validation 5 (0) 2022.05.17 다음글이전글이전 글이 없습니다.댓글