Java/Spring Boot

Bean Validation

요술공주밍키 2024. 2. 26. 14:34

Spring boot에서 검증 기능을 매번 작성하는 것은 번거롭다.

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

이런 로직을 모든 프로젝트에 적용하도록 공통화하고, 표준화한 것이 Bean Validation이다.


의존성 주입

Bean Validation을 사용하기 위해서는 gradle에 의존성을 추가해야 한다.

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

 DTO

@Data
public class ItemSaveForm {

    @NotBlank(message = "상품명을 입력해주세요.")
    private String itemName;

    @NotNull(message = "가격을 입력해주세요.")
    @Range(min = 1000, max = 1000000)
    private Integer price;

    @NotNull(message = "수량을 입력해주세요.")
    @Max(9999)
    private Integer quantity;
}

 

위와 같이 각 Field에 검증 어노테이션을 붙인다.

참고로 검증 어노테이션 모음에서 더 많은 어노테이션을 확인 할 수 있다.

 

 Controller

@PostMapping("/add")
    public String addItem(@Validated @ModelAttribute("item") ItemSaveForm form, BindingResult bindingResult) {
        // ....
    }

 

DTO를 전달 받고, @Validated로 검증을 수행하고, BindingResult로 검증 결과를 받는다.

참고로 BindingResult는 반드시 DTO, 즉, 객체 뒤에 선언해야 한다.


 결과

validation 결과 출력

 

이전 포스팅에서 작성했던 Thymeleaf 폼의 th:errors를 이용하면 특별한 로직 없이 자동으로 검증 결과를 출력한다.

 

2024.02.15 - [Java/spring] - Thymeleaf 스프링 통합과 폼

 

Thymeleaf 스프링 통합과 폼

Spring boot에 관련해서 조금 더 공부를 하다가 Thymeleaf에서 Form을 작성할 때 훨씬 수월하고 깔끔하게 작성할 수 있는 방식에 대해서 알게 되었는데 그냥 그렇구나 하고 넘어갈 뻔하다가 블로그에

magicmk.tistory.com


 마무리

Bean Validation과 Thymeleaf 폼 등을 더 다채롭게 활용하기 위해서 message 기능을 활용하는 것이 좋은데

개인적으로 message 기능을 활용하는 것이 내키지 않아서 정리하지는 않았다.

 

위와 같이 Form에서 데이터를 전송받을 때 클라이언트 부분에서 데이터 검증을 할 수도 있지만,

클라이언트 검증은 충분히 조작이 가능하고 보안적으로 취약하기 때문에 Bean Validation을 이용한

서버 측의 데이터 검증이 반드시 필요하다는 것을 확실히 알았고 메인 비즈니스 로직 구현보다

데이터 검증 로직이 더 중요할 수도 있다는 것을 느낀 것 같다.