Back-End/Spring Boot
검증 처리 (Validation)
newny
2023. 8. 17. 00:11
반응형
Safe Navigation Operator
"Object?." 문법은 Object가 null일경우 nullPointerException이 발생하는 대신, null을 반환하는 SpringEL 문법
BindingResult
- 스프링이 제공하는 검증오류를 보관하는 객체
- 바인딩할 model attribute가 있어야 하기 때문에 파라미터 순서가 무조건 @ModelAttribute가 먼저 와야함
- @ModelAttribute에 데이터 바인딩 시 오류가 발생해도 컨트롤러가 호출됨
#fields
BindingResult가 제공하는 검증 오류에 접근할 수 있다.
FieldError
FieldError는 두가지 생성자를 제공하는데 그 중 한가지 생성자에는 오류 필드를 담을 수 있다.
FieldError 파라미터들
- objectName : 오류가 발생한 객체 이름
- field : 오류 필드
- rejectedvalue : 사용자가 입력한 값(거절된 값)
- bindingFailure : 타입 오류같은 바인딩 실패인지, 검증 실패인지 구분 값 (바인딩 실패인경우 true, 아닌경우 false)
- codes : 메세지 코드
- arguments : 메세지에서 사용하는 인자
- defaultMessage : 기본 오류 메세지
th:field
정상 상황에서는 모델객체의 값을 사용하지만, 오류가 발생하면 FieldError에서 보관한 값을 사용하여 출력함
rejectValue
- BindingResult는 어떤 객체를 대상으로 검증하는지 target을 이미 알고있기 때문에 target에 대한 정보를 넣지 않고 사용할 수 있는 메소드가 존재한다.
- addError 메소드를 사용할 때 보다 코드를 간략하게 줄일 수 있음
- bindingResult.addError(new FieldError()) → bindingResult.rejectValue()
- 내부에서 MessgaeCodesResolver를 사용함 → 여기에서 메세지 코드들을 생성함
- FieldError : 4가지 코드 오류를 자동으로 생성
- ObjectError : 2가지 코드 오류를 자동으로 생성
@Validated
검증기를 실행시키는 어노테이션
여러 검증기를 등록할 경우 검증기의 supports(Item.class) 메소드가 호출되고 결과에 따라서(boolean) 해당하는 검증기의 validate()메소드가 호출됨
@ModelAttribute vs @RequestBody
- @ModelAttribute 는 각각의 필드 단위로 세밀하게 적용되기 때문에 특정 필드에 타입이 맞지 않는 오류가 발생해도 나머지 필드는 정상 처리할 수 있음
- @RequestBody 는 객체 단위로 적용되기 때문에 메세지 컨버터의 작동이 성공하여 해당 객체를 만들어야 @Validated가 적용됨
반응형