3.7.2 by sh

3.7.2. Bean Validation Provider 구성

스프링은 Bean Validation API를 완벽하게 지원합니다. 여기에는 JSR-303 또는 JSR-349 Bean Validation Provider를 스프링 빈으로서 부트스트랩 하기 위한 편리한 지원이 포함됩니다. 이를 통해 응용 프로그램에서 유효성 검사가 필요한 어느 곳에서든지 javax.validation.ValidatorFactory또는 javax.validation.Validator를 주입할 수 있습니다.

다음 예제와 같이 LocalValidatorFactoryBean을 사용하여 기본 Validator를 스프링 빈으로 구성할 수 있습니다.

<bean id="validator"
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>

앞의 예제의 기본 구성은 기본 부트스트랩 메커니즘을 사용하여 초기화하기 위해 빈 유효성 검사를 트리거 합니다. Hibernate Validator와 같은 JSR-303 또는 JSR-349 Provider는 클래스 패스에 있을 것으로 예상되며 자동으로 감지됩니다.

Validator 주입

LocalValidatorFactoryBean은 스프링의 org.springframework.validation.Validator뿐만 아니라 javax.validation.ValidatorFactoryjavax.validation.Validator를 모두 구현합니다. 이러한 인터페이스 중 하나에 대한 참조를 Validation 로직을 호출해야하는 빈에 삽입할 수 있습니다.

LocalValidatorFactoryBean

 스프링에서 제공하는 검증 클래스. Javax.validatoin.Validator 인터페이스와 org.springframework.validation.Validator 인터페이스를 구현했으므로 필요한 곳에서 적당한 인터페이스 타입으로 참조해서 사용하면 된다.

다음 예제와 같이 Bean Validation API를 직접 사용하려는 경우 javax.validation.Validator에 대한 참조를 삽입할 수 있습니다.

import javax.validation.Validator;

@Service
public class MyService {

    @Autowired
    private Validator validator;

다음 예제와 같이 빈이 스프링 Validation API를 필요로 한다면 org.springframework.validation.Validator에 대한 참조를 삽입할 수 있습니다.

import org.springframework.validation.Validator;

@Service
public class MyService {

    @Autowired
    private Validator validator;
}

org.springframework.validation.Validator 인터페이스 (아래 메서드 구현해야 함)

 boolean supports(Class class) : 주어진 객체(class)에 대해 Validator가 지원 가능한가?

 void validate(Object target, Errors errors) : 주어진 객체(target)에 대해서 유효성 체크를 수행하고, 유효성 에러 발생 시 주어진 Errors 객체에 관련 정보가 저장된다.

사용자 정의 제약 조건 구성

각 빈 유효성 검증 제약 조건은 다음의 두 부분으로 구성됩니다. “제약 조건 및 구성 가능한 속성들을 선언하는 @Constraint 어노테이션”. “제약 조건의 동작을 구현하는 javax.validation.ConstraintValidator 인터페이스의 구현”.

선언과 구현을 연결하기 위해 각 @Constraint어노테이션은 해당하는 ConstraintValidator구현 클래스를 참조합니다. 런타임 시 ConstraintValidatorFactory는 도메인 모델에서 Constraint 어노테이션이 발생할 때 참조된 구현을 인스턴스 화합니다.

@Constraint

 만들고자 하는 Annotation이 어떤 검증 클래스를 이용해서 검증 작업을 하는 지 지정.

 Ex. @Constraint(validatedBy={ExcistCheckValidator.class})

 ExistCheckValidator 클래스가 ConstraintValidator 인터페이스를 구현한 클래스로, 검증 작업을 하게 될 클래스임.

ConstraintValidator 인터페이스  구현한 클래스의 기본 구조

 initialize() : 이 클래스가 객체로 만들어질 때의 초기화 작업 수행. 파라미터에 이 클래스가 이용되는 어노테이션을 설정. 즉, 어노테이션에서 관련 정보를 읽어 초기화 작업을 하는 것.

 valid() : T로 정의한 클래스 객체의 값을 읽어 검증 작업 수행. 이 함수가 true 리턴 시 검증 작업을 성공적으로 마친 것. false 리턴 시 검증에 문제가 생겼음을 의미.

ex. https://zgundam.tistory.com/27

기본적으로 LocalValidatorFactoryBean은 스프링을 사용하여 ConstraintValidator인스턴스를 생성하는 SpringConstraintValidatorFactory를 구성합니다. 이를 통해 사용자 정의 ConstraintValidators는 다른 스프링 빈처럼 의존성 주입의 이점을 얻을 수 있습니다.

다음 예제는 의존성 주입을 위해 스프링을 사용하는 관련 ConstraintValidator구현이 따르는 사용자 정의 @Constraint 선언을 보여줍니다.

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=MyConstraintValidator.class)
public @interface MyConstraint {
}
import javax.validation.ConstraintValidator;

public class MyConstraintValidator implements ConstraintValidator {

    @Autowired;
    private Foo aDependency;

    ...
}

앞의 예제에서 볼 수 있듯이, ConstraintValidator구현은 다른 스프링 빈과 마찬가지로 @Autowired를 가질 수 있습니다.

스프링 기반 메소드 유효성 검사

다음과 같이 Bean Validation 1.1에서 지원되는 메소드 유효성 검사 기능(그리고 사용자 정의 확장 기능, 또한 Hibernate Validator 4.3에 의해)을 MethodValidationPostProcessor빈 정의를 통해 스프링 컨텍스트에 통합할 수 있습니다.

<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>

스프링 기반 메소드 유효성 검사를 받기 위해서는 모든 대상 클래스에 스프링의 @Validated어노테이션을 추가해야 합니다. Hibernate Validator와 Bean Validation 1.1 Provider의 설치에 대한 자세한 정보는 MethodValidationPostProcessorjavadoc를 참고하십시오. (옵션으로, 사용할 Validation 그룹을 선언할 수도 있습니다)

 @Configuration 클래스에 MethodValidationPostProcessor 추가. (@Bean)

 @Validated를 컨트롤러 클래스에 추가.

 @RequestParam 바로 앞에 @Size를 사용

추가 구성 옵션

대부분의 경우에는 기본 LocalValidatorFactoryBean구성으로 충분합니다. 메시지 보간에서 순회 해석에 이르기까지 다양한 빈 유효성 검증 구조에 대한 여러 가지 구성 옵션이 있습니다. 이러한 옵션에 대한 자세한 내용은 LocalValidatorFactoryBeanjavadoc javadoc을 참조하십시오.

Last updated