스프링/4. 스프링 MVC-2

37. 빈 검증

sdafdq 2023. 9. 2. 23:24

이거 쓸려면 새로 종속성에 

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

 

추가시켜 줘야 한다.

아마 스프링 부트에서 처음부터 추가해서 쓰는 게 좋을 듯 하다.

 

 

 

public class Item {

    private Long id;
    @NotBlank(message="공백X")
    private String itemName;

    @NotNull
    @Range(min=1000,max=100000)
    private Integer price;

    @NotNull
    @Max(9999)
    private Integer quantity;

    public Item() {
    }

    public Item(String itemName, Integer price, Integer quantity) {
        this.itemName = itemName;
        this.price = price;
        this.quantity = quantity;
    }
}

이렇게 애노테이션으로 관리할 수 있다.

정말 간단하다.

 

 

사실, 검증이란게 뭐 공백만있는지, 아니면 아예 데이터를 적지 않았는지, 특정 범위를 초과 하였는 지 등 비슷비슷한게 무수히 많다.

 

그래서 그걸 알고 저렇게 따로 정의 시켜 놓은거다.

 

아마 저 애노테이션도 우리가 나중에 정의할 수 있을 듯?

 

@NotBlank(message="공백X")

이렇게 우리가 메시지도 넣을 수 있고,

 

또 여기

 

public class BeanValidationTest {
    @Test
    void beanValidation(){
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();

        Item item = new Item();
        item.setItemName(" ");
        item.setPrice(0);
        item.setQuantity(10000);

        Set<ConstraintViolation<Item>> violations = validator.validate(item);
        for (ConstraintViolation<Item> violation : violations) {
            System.out.println("violation = " + violation);
            System.out.println("violation = " + violation.getMessage());
        }
    }
}

이게 테스트인데, 물론 스프링이 자동으로 해줘서 우리가 뭐 ValidatorFactory에서 팩토리 뽑고 거기서 검증기 가져오고 이걸 직접 해야 할 필요는 없다.

 

여튼 저렇게 해 봤더니,

검증에 대한 메시지들이 잘 나온다.


violation = 9999 이하여야 합니다
violation = 1000에서 100000 사이여야 합니다
violation = 공백X

 

getMessage() 내용들이다.

 

그리고 저거 내용이 조금 우리가 errors.properties에 정의한 내용들이랑 다르다.

스프링이 뭐 언어지원 같은 면에서 많이 지원되어 있다고 들은 적이 있던 거 같은데, 이것도 그런 것 인듯하다.

 

 

BeanValidation은 특정 구현체가 아니라 Bean Validation 2.0 이라는 기술 표준이라고 한다.

쉽게 이야기하면 검증 애노테이션과 여러 인터페이스의 모음이라고 한다.

 

그냥 즉 인터페이스고, 거기에 기본적인 검증 애노테이션 몇개 있고, 그 구현체가 하이버네이트인? 그런 거 같다.

 

그래서 보면 NotNull, NotBlank, Min, Max 이런 것들은 저 Bean Validation 껀데 (javax.validation) 

Range같이 뭔가 값 여러개를 비교하는 뭔가 함수같은? 그런 느낌은 하이버네이트이다.

 

인터페이스는 Bean Validation, 그 구현은 여러 것 중 하나인 하이버네이트를 자주 쓰는 모양이다.

공식 기술로 지원된 거기 때문에 사용할 수 있는 검증 애노테이션 몇개 있는거고.

 

 

참고로 얘네도 NotNull.item.itemName 이런 식으로 나오는데, 우리가 errors.properties에서 직접 정의해서 사용할 수 있다.

 

 

 

원리는

라이브러리에 검증 라이브러리를 추가 했다면

 

자동으로 LocalValidatorFactoryBean을 글로벌 Validator로 등록해주고,

얘가 @NotNull같은 애노테이션을 보고 검증을 수행한다.

 

이렇게 글로벌 Validator가 적용되어 있으므로 검증이 필요한 컨트롤러에 @Validated만 해주면 된다.

 

얘도 마찬가지로 BindingResult에 에러를 추가해 주는 것이다.

 

 

검증 애노테이션들은

https://docs.jboss.org/hibernate/validator/6.2/reference/en-US/html_single/#section-builtin-constraints

 

Hibernate Validator 6.2.5.Final - Jakarta Bean Validation Reference Implementation: Reference Guide

Validating data is a common task that occurs throughout all application layers, from the presentation to the persistence layer. Often the same validation logic is implemented in each layer which is time consuming and error-prone. To avoid duplication of th

docs.jboss.org

 

여기서 확인하면 된다.

'스프링 > 4. 스프링 MVC-2' 카테고리의 다른 글

39. 빈 검증 오브젝트 에러  (0) 2023.09.03
38. 빈 검증기 오류메시지 바꾸기  (0) 2023.09.03
36. 검증로직 분리 2  (0) 2023.09.02
35. 검증로직 분리  (0) 2023.09.02
34. 오류메시지 4  (0) 2023.09.02