코드 그라데이션

Bean Validation - 시작 및 프로젝트 세팅 V3 본문

Spring/Validation

Bean Validation - 시작 및 프로젝트 세팅 V3

완벽한 장면 2024. 3. 1. 00:12

Bean Validation - 시작

Bean Validation 기능을 어떻게 사용하는지 코드로 알아보자. 

먼저 스프링과 통합하지 않고, 순수한 Bean Validation 사용법 부터 테스트 코드로 알아보자.

 

Bean Validation 의존관계 추가 

build.gradle

dependencies 에다가

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

 

Jakarta Bean Validation

  • jakarta.validation-api : Bean Validation 인터페이스
  • hibernate-validator 구현체

테스트 코드 작성

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(value = 9999)
    private Integer quantity;

    public Item() {
    }

    public Item(String itemName, Integer price, Integer quantity) {
        this.itemName = itemName;
        this.price = price;
        this.quantity = quantity;
    }
}
  • 이 어노테이션들의 임포트를 유의깊게 보자.

 


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.message=" + violation.getMessage());
        }
    }
}

 

#1.

> 이게 빈 값이면(출력이) 문제가 없는 것이고, 값이 들어있으면 문제가 있는 것.

   현재는 틀린 값이 들어있으므로 당연히 값이 출력될 것이다.

 

#2. 검증기 생성

다음 코드와 같이 검증기를 생성한다. 이후 스프링과 통합하면 우리가 직접 이런 코드를 작성하지는 않으므로, 

이렇게 사용하는구나 정도만 참고하면 된다.

 

#3. 검증 실행

검증 대상( item )을 직접 검증기에 넣고 그 결과를 받는다. 

Set 에는 ConstraintViolation 이라는 검증 오류가 담긴다. 따라서 결과가 비어있으면 검증 오류가 없는 것이다.

 

테스트 실행 결과

violation=ConstraintViolationImpl{interpolatedMessage='1000에서 1000000 사이여야 합니다', 
			propertyPath=price, 
            rootBeanClass=class hello.itemservice.domain.item.Item, 
            messageTemplate='{org.hibernate.validator.constraints.Range.message}'}
violation.message=1000에서 1000000 사이여야 합니다

violation=ConstraintViolationImpl{interpolatedMessage='공백일 수 없습니다', 
			propertyPath=itemName, 
            rootBeanClass=class hello.itemservice.domain.item.Item, 
            messageTemplate='{javax.validation.constraints.NotBlank.message}'}
violation.message=공백일 수 없습니다

violation=ConstraintViolationImpl{interpolatedMessage='9999 이하여야 합니다', 
			propertyPath=quantity, 
            rootBeanClass=class hello.itemservice.domain.item.Item, 
            messageTemplate='{javax.validation.constraints.Max.message}'}
violation.message=9999 이하여야 합니다
  • ConstraintViolation 출력 결과를 보면, 검증 오류가 발생한 객체, 필드, 메시지 정보등 다양한 정보를 확인할 수 있다.

 


프로젝트 준비 V3

1) ValidationItemControllerV3 컨트롤러 생성

  • ValidationItemControllerV2 복사 -> ValidationItemControllerV3 생성
  • URL 경로 변경: validation/v2/ -> validation/v3/

경로 변경 단축키 Ctrl + V

 

2) 템플릿 파일 복사

  • /resources/templates/validation/v2/ ->  /resources/templates/validation/v3/
  • URL 경로 변경 : validation/v2/ -> validation/v3/

경로 변경 단축키 Ctrl + Shift + R 

 

실행해서 잘 유지되는지 확인하기

728x90

'Spring > Validation' 카테고리의 다른 글

Bean Validation - 에러 코드  (0) 2024.03.02
Bean Validation - 스프링 적용  (0) 2024.03.02
Bean Validation - 소개  (0) 2024.02.29
Validator 분리 (2)  (0) 2024.02.28
Validator 분리 (1)  (0) 2024.02.28
Comments