BindingResult 는 @ModelAttribute, @RequestBody, @RequestParam 뒤에 올 수 있다.
@PathVariable 만 BindingResult를 사용할 수 없다. 에러가 나면 바로 종료한다.
validation 체크(로직 있는 경우) ex) @NotNull, @Lenth(12, 15)
validation 미충족시 스프링이 new FiendError(...) 객체 생성
new FieldError(objectName:product, field:price, rejectedValue:"aaa", bindingFailure:true, codes:new String[]{"info.product.price"}, arguments:new Object[]{1000, 10000}, defaultMessage:"숫자만 입력할 수 있습니다.");
arguments는 errors.properties 파일에 " info.product.price=가격은 {0} ~ {1} 까지 허용합니다." 와 같이 쓸때 사용된다.
에러가 발생하면 codes에 있는 값을 먼저 읽는다. 없으면 defaultMessage를 출력한다.
MessageCodesResolver(구현체 DefaultMessageCodesResolver)가 errorCode:"info", objectName:"product", field:"price", fieldType:String.class 를 받으면 new String[]{"info.product.price", "info.price", "info.java.lang.String", "info"} 4가지를 만들어서 new FieldError() 의 codes에 넣어주는 것이다.
Bean Validation
- 검증 로직을 모든 프로젝트에 적용할 수 있게 공통화하고, 표준화 한 것. 기술 표준
- build.gradle 파일에 dependencies에 implementation 'org.springframework.boot:spring-boot-starter-validation' 을 추가하면 'LocalValidatorFactoryBean'을 글로벌 Validator로 등록한다.
- @Valid(@Validated) 어노테이션은 검증기를 실행하라는 뜻. 이 것이 있으면 등록된 글로벌 validator 를 실행한다. 이 validator는 @NotBlank, @NotNull 등과 같은 어노테이션을 보고 검증을 실행한다.
검증 순서
1. @ModelAttribute 가 있는 객체의 각각의 필드에 바인딩 시도
- 성공하면 다음으로
- 실패하면 typeMissmatch 와 같은 에러를 띄우고 FiendError 객체 생성하여 추가
2. Validator로 체크 (바인딩에 성공한, 파라미터가 정상적으로 들어온 필드만 체크함)
if (bindingResult.hasErrors()) {
System.out.println("bindingResult = " + bindingResult);
}
출력하면
bindingResult = org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'Report' on field 'itemNo': rejected value [111]; codes [Length.Report.itemNo,Length.itemNo,Length.java.lang.String,Length]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [Report.itemNo,itemNo]; arguments []; default message [itemNo],2,1]; default message [길이가 1에서 2 사이여야 합니다]
@Length 어노테이션으로 오류가 잡힘
Length 라는 오류코드를 기반으로 위에서 말한 MessageCodesResolver가 4가지 메시지 코드를 생성함.
@PathVariable 을 포함해서, 에러가 나도 커스텀하고 싶은 경우
@ControllerAdvice와 @ExceptionHandler 를 통해 ControllerAdvice를 만든다
@Slf4j
@RestControllerAdvice("/info")
public class ControllerAdvice {
@ExceptionHandler
public Object exceptionHandler(Exception ex, HttpServletRequest req) {
log.error("[{}][{}]", req.getRequestURI(), req.getQueryString(), ex);
return Object;
}
}
'SpringBoot' 카테고리의 다른 글
[SpringBoot] 필터, 인터셉터 호출 흐름, 적용 방법 (0) | 2024.05.20 |
---|---|
쿠키, 세션 구현, 동작 원리 (0) | 2024.05.17 |
Spring MVC 구조와 동작 원리 (0) | 2024.05.09 |
[SpringBoot] 웹서버, WAS, JSP, Servlet, MVC 패턴, MVC 프레임워크, Front Controller (0) | 2024.03.18 |
[SpringBoot] API 상태코드, HTTP 헤더, 콘텐츠 네고시에이션, 쿠키, 캐시 (0) | 2024.03.18 |
댓글