본문 바로가기
SpringBoot

bindingResult 가 쌓이는 과정, @Valid

by 오렌지마끼야또 2024. 5. 16.
728x90
반응형

 

 

 

 

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;
    }
}

 

 

 

 

728x90
반응형

댓글