개발일지

스프링MVC_검증(Bean Validation 직접 사용) 본문

Spring/Spring MVC

스프링MVC_검증(Bean Validation 직접 사용)

딸기아사이레모네이드리프레셔 2023. 3. 20. 22:48
728x90

목차

    직접 검증 코드를 작성하는 것은 상당히 번거롭다. 

    특히, 특정 필드에 대한 검증 로직은 대부분 빈 값인지 아닌지, 특정 크기를 넘는지 아닌지와 같이 매우 일반적인 로직이다.

    다음 코드를 보자

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

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

    Bean Validation을 잘 활용하면, 애노테이션 하나로 검증 로직을 매우 편리하게 적용할 수 있다. 

     

    Bean Validation - 시작(스프링 통합X, 순수한 Bean Validation 사용법)

    Bean Validation 의존 관계 추가

    build.gradle에 의존관계 추가

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

    테스트 코드 작성

    Item - Bean Validation 애노테이션 적용

    package hello.itemservice.domain.item;
    
    import lombok.Data;
    import org.hibernate.validator.constraints.Range;
    
    import javax.validation.constraints.Max;
    import javax.validation.constraints.NotBlank;
    import javax.validation.constraints.NotNull;
    
    @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;
    
        public Item() {
        }
    
        public Item(String itemName, Integer price, Integer quantity) {
            this.itemName = itemName;
            this.price = price;
            this.quantity = quantity;
        }
    }
    • @NotBlank : 빈값 + 공백만 있는 경우를 허용하지 않는다.
    • @NotNull : null 을 허용하지 않는다.
    • @Range(min = 1000, max = 1000000) : 범위 안의 값이어야 한다.
    • @Max(9999) : 최대 9999까지만 허용한다

    BeanValidationTest - Bean Validation 테스트 코드 작성

    package hello.itemservice.validation;
    
    import hello.itemservice.domain.item.Item;
    import org.junit.jupiter.api.Test;
    
    import javax.validation.ConstraintViolation;
    import javax.validation.Validation;
    import javax.validation.Validator;
    import javax.validation.ValidatorFactory;
    import java.util.Set;
    
    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 factory = Validation.buildDefaultValidatorFactory();
    Validator validator = factory.getValidator();

    실행결과(일부생략)

    violation={interpolatedMessage='공백일 수 없습니다', propertyPath=itemName, 
    rootBeanClass=class hello.itemservice.domain.item.Item, 
    messageTemplate='{javax.validation.constraints.NotBlank.message}'}
    violation.message=공백일 수 없습니다
    
    
    violation={interpolatedMessage='9999 이하여야 합니다', propertyPath=quantity, 
    rootBeanClass=class hello.itemservice.domain.item.Item, 
    messageTemplate='{javax.validation.constraints.Max.message}'}
    violation.message=9999 이하여야 합니다
    
    
    violation={interpolatedMessage='1000에서 1000000 사이여야 합니다', 
    propertyPath=price, rootBeanClass=class hello.itemservice.domain.item.Item, 
    messageTemplate='{org.hibernate.validator.constraints.Range.message}'}
    violation.message=1000에서 1000000 사이여야 합니다
    728x90
    Comments