Spring

[Spring] Bean Validation 이란 ?

후뿡이 2024. 11. 17. 02:09

0. 표준화 된 Validation 이 필요한 이유


 

먼저 Validation 기능이 왜 필요한지 아래의 사진을 봅시다.

Hibernate Validation 에서 제공하는 사진

 

만약 공통화된 Validation 기능이 없다면 어떻게 될까요 ?

위의 그림 처럼 각각의 계층에서 반복적으로 Custom Validation 을 진행해야 할 겁니다.

 

하지만 개발자들이 누구입니까 ?

게으르기 위해 성실한 사람들 아니겠습니까?

이 반복적인 Custom Validation 을 제거하기 위해서 표준화된 Validation 기능이 필요했습니다.

 

그리고 표준화된 Validation 기능을 적용하면 아래의 그림처럼 되는 것이죠.

 

도메인 모델을 정의하고 도메인 모델에 Validation을 적용하게 되면 각각의 계층에서 불필요한 Validation 기능을 삭제할 수 있게 됩니다.

그렇다면 Bean Validation 은 무엇인지 살펴 봅시다.

 

 

1. Bean Validation 이란 ?


Bean Validation은 입력 데이터의 유효성을 검증하기 위한 기능을 제공합니다.

 

 

Spring 에서 Validation 을 더 잘 이해하기 위해서는 이 Bean Validation 의 용어 정리를 잘 하고 넘어가는게 중요합니다.

 

Bean Validation 은 "자바"가 정한 표준 "인터페이스" 입니다. 

Bean Validation 인터페이스를 만족하면 어떤 라이브러리든 사용 가능 하다는 것이죠.

그리고 인터페이스라는 말은 구현체가 필요하다는 것이구요.

 

이 Bean Validation 구현체 중 가장 널리 이용되는 것이 Hibernate Validator 입니다.

( 이름은 Hibernate 이지만 JPA 와는 아무 관계가 없습니다 ! )

 

Spring은 이 Bean Validation 표준 인터페이스를 채택하여 Validation 을 쉽게 사용할 수 있도록 통합했습니다.

그래서 표준 인터페이스가 제공하는 @Valid 어노테이션도 사용 가능하고 Spring 의 @Validated 어노테이션도 사용가능한 겁니다.

 

Spring은 Bean Validation 의 표준 인터페이스 외에도 다양한 기능을 구현했는데

그 중 유명한 것이 Groups 기능입니다.

groups 는 한개의 class 에 대해 group 별로 기능을 분리하는 것입니다.

groups 를 사용 방법은 간단하게 글로 설명하면 아래와 같습니다.

  1. 인터페이스 생성
    1. interface SaveCheck
    2. interface UpdateCheck
  2. NotNull(groups = {SaveCheck.class})
    => SaveCheck/UpdateCheck Class 에 모두 사용한다는 의미입니다.
  3. @Validated(UpdateCheck.calss)
    ⇒ 명시한 UpdateCheck Group 에 해당하는 Validation 만 적용하겠다는 의미입니다.
    이 경우 NotNull 어노테이션은 동작하지 않겠네요.
    @Valid 는 해당 기능 없습니다 ! ( Bean Validation 에서 제공하는 기능이 아닌 Spring 에서 제공하는 기능이기 때문 )

 

글만 봐도 약간 복잡하지요 ? 그래서 실무에서는 잘 사용하지 않습니다.

대신 요구사항이 복잡해지면 입력 DTO 를 분리합니다.

 

이렇듯 Bean Validation 의 구현체인 Hibernate Validator와 Spring 은 Bean Validation 인터에이스를 준수하면 추가적인 기능들을 구현해 개발자들의 개발 생산성을 증가시켜 왔습니다.

 

3. 후기


이전까지는 검증은 DTO 에 어노테이션 달아서 하는 거야 라고 생각만 했지

Bean Validation 이 뭔지 Validator 가 뭔지 잘 몰랐었다.

그렇기 때문에 @Valid / @Validated 가 뭐가 다른 건지 차이가 왜 발생하는 건지도 이해를 잘 못했었다.

 

뭐든지 공부하고 깊게 봐야 더 잘 쓸 수 있는 것처럼

이제는 Validation 도 조금은 알고 쓸 수 있지 않을까 ?