쌓고 쌓다

[스프링 부트] BeanValidation 적용 - 29 본문

프로그래밍/spring

[스프링 부트] BeanValidation 적용 - 29

승민아 2023. 9. 11. 14:54

BeanValidation으로 검증 코드를 작성하지 않고

어노테이션 하나로 검증 로직을 편리하게 적용할 수 있다.

 

의존 관계 추가

implementation 'org.springframework.boot:spring-boot-starter-validation'

 

Poster 클래스

@Entity
@Getter
@Setter
@ToString
public class Poster {

    @NotBlank
    private String title;

    @NotBlank
    private String writer;

    @NotBlank
    private String content;
    private LocalDateTime regdate;

    @NotNull
    @Range(min = 100, max = 250)
    private Long height;

    @NotNull
    @Range(min=50, max = 200)
    private Long weight;
}

@NotNull, @Range 같은 어노테이션으로 검증할 수 있다.

 

PosterController

@Slf4j
@Controller
@RequiredArgsConstructor
public class PosterController {

    @PostMapping
    public String write(@Validated @ModelAttribute Poster poster, BindingResult bindingResult) throws IOException {

        if(bindingResult.hasErrors()) {
            return "posters/createPosterForm";
        }    
    }

}

자동으로 글로벌 Validator가 등록되어 있기 때문에 @Valid, @Validated만 적용하면 된다.

검증 오류가 발생하면 BindingResult에 FiledError, ObjectError를 담아준다.

 

스프링 부트는 자동으로 글로벌 Validator로 등록

"LocalValidatorFactoryBean"을 글로벌 Validator로 등록한다.

이 Validator는 @NotNull 같은 어노테이션을 보고 검증을 한다.

우린 @Valid, @Validated만 붙여주자.

 

검증 순서

  1. @ModelAttribute에 각 필드로 타입 변환하여 주입 시도
    1. 성공하면 2번 단계로.
    2. 실패시 typeMismatch로 FieldError 추가
  2. Validator 적용

여기서 보면 알겠지만. 바인딩에 성공한 필드에 대해서만 Bean Validation을 적용한다.

바인딩 성공하지 않은 필드에 대해서 typeMismatch 에러를 낸다.

 

BeanValidation 적용 결과

 

다음엔 에러 코드를 변경해보자!

Comments