[Spring] Bean Validation 사용하여 간편하게 검증 로직 추가하기 !

728x90

 

Bean Validation

검증 로직을 모든 프로젝트에 적용할 수 있게 공통화하고 표준화한 것이다.

 

우선 Bean Validation 을 사용하려면 다음 의존관계를 추가해야 한다.

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

 

해당 라이브러리를 넣으면, 자동으로 Bean Validator 를 인지하고, 스프링에 통합한다.

그리고 LocalValidatorFactoryBean 을 자동으로 글로벌 Validator 로 등록한다.

 

`@Valid`, `@Validated` 만 적용하면 되고,

검증 오류가 발생하면 FieldError, ObjectError 를 생성하여 BindingReslut 에 담아준다.

(이때 직접 글로벌 Validator 를 등록하면 Bean Validator 를 글로벌 Validator 로 등록하지 않으니

직접 등록한 Validator를 제거해야 한다.)

 

> 참고 <

- @Validated vs @Valid

둘 다 사용 가능하지만, @Valid 는 bulid.gradle 에 의존관계를 추가해야 한다.

@Validated 는 스프링 전용 검증 애노테이션이고, @Valid 는 자바 표준 검증 애노테이션이다.

@Validated 는 내부에 groups 기능을 포함하고 있다.

 

@Data
public class Item {

  private Long id;
  
  @NotBlank
  private String itemName;
  
  @NotNull
  @Range(min = 1000, max = 1000000)
  private Integer price;
  
  @NotNull
  @Max(9999)
  private Integer quantity;
  
  ...
}

애노테이션을 활용하여 필드 오류를 처리할 수 있다.

글로벌 오류는 따로 처리해아 한다.

 

`@NotBlank` : 빈값 + 공백만 있는 경우 허용 X

`@NotNull` : null 허용 X

`@Range(min = 1000, max = 1000000)` : 범위 안의 값만 허용

`@Man(9999)` : 최대 9999 까지만 허용

 

검증 순서

 

1. @ModelAttribute 각각의 필드에 타입 변화를 시도한다.

2. 실패하면 typeMismatch 로 FieldError 를 추가한다.

3. 성공한 필드만 Bean Validation 을 적용한다.

 

에러 코드

오류 코드가 애노테이션 이름으로 BindingResult 에 등록된다.

 

`@NotBlank` 인 경우

1. `NotBlank.item.itemName`

2. `NotBlank.itemName`

3. `NotBlank.java.lang.String`

4. `NotBlank`

 

우선순위를 만들어 생성한다.

 

메시지 우선순위

1. 생성된 에러 코드 순서대로 `messageSource` 에서 메시지 찾기

2. 애노테이션의 `message` 속성 사용 (@NotBlank(message = "공백 X")

3. 라이브러리가 제공하는 기본 값 사용

 

문제점

- 동일한 모델 객체를 등록할 때와 수정할 때 적용하는 검증을 다르게 처리할 수가 없음

(Bean Validation 의 groups 기능을 사용하면 됨 @Validated 만 가능, @Valid 불가능)

(하지만 실무에서 잘 사용하지 않음)

 

==> 객체를 직접 사용하지 않고, 등록/수정 하는 별도의 모델 객체를 만들어 사용하면 된다.

 

> 참고 <

검증 애노테이션 모음

https://docs.jboss.org/hibernate/validator/6.2/reference/en-US/html_single/#validator-defineconstraints-spec

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

출처 | 스프링 MVC 2(김영한) - 인프런

728x90