Last updated
Last updated
스프링은 Bean Validation API를 완벽하게 지원합니다. 여기에는 JSR-303 또는 JSR-349 Bean Validation Provider를 스프링 빈으로서 부트스트랩 하기 위한 편리한 지원이 포함됩니다. 이를 통해 응용 프로그램에서 유효성 검사가 필요한 어느 곳에서든지 javax.validation.ValidatorFactory
또는 javax.validation.Validator
를 주입할 수 있습니다.
다음 예제와 같이 LocalValidatorFactoryBean
을 사용하여 기본 Validator를 스프링 빈으로 구성할 수 있습니다.
앞의 예제의 기본 구성은 기본 부트스트랩 메커니즘을 사용하여 초기화하기 위해 빈 유효성 검사를 트리거 합니다. Hibernate Validator와 같은 JSR-303 또는 JSR-349 Provider는 클래스 패스에 있을 것으로 예상되며 자동으로 감지됩니다.
Validator 주입
LocalValidatorFactoryBean
은 스프링의 org.springframework.validation.Validator
뿐만 아니라 javax.validation.ValidatorFactory
와 javax.validation.Validator
를 모두 구현합니다. 이러한 인터페이스 중 하나에 대한 참조를 Validation 로직을 호출해야하는 빈에 삽입할 수 있습니다.
LocalValidatorFactoryBean
스프링에서 제공하는 검증 클래스. Javax.validatoin.Validator 인터페이스와 org.springframework.validation.Validator 인터페이스를 구현했으므로 필요한 곳에서 적당한 인터페이스 타입으로 참조해서 사용하면 된다.
다음 예제와 같이 Bean Validation API를 직접 사용하려는 경우 javax.validation.Validator
에 대한 참조를 삽입할 수 있습니다.
다음 예제와 같이 빈이 스프링 Validation API를 필요로 한다면 org.springframework.validation.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 리턴 시 검증에 문제가 생겼음을 의미.
기본적으로 LocalValidatorFactoryBean
은 스프링을 사용하여 ConstraintValidator
인스턴스를 생성하는 SpringConstraintValidatorFactory
를 구성합니다. 이를 통해 사용자 정의 ConstraintValidators
는 다른 스프링 빈처럼 의존성 주입의 이점을 얻을 수 있습니다.
다음 예제는 의존성 주입을 위해 스프링을 사용하는 관련 ConstraintValidator
구현이 따르는 사용자 정의 @Constraint
선언을 보여줍니다.
앞의 예제에서 볼 수 있듯이, ConstraintValidator
구현은 다른 스프링 빈과 마찬가지로 @Autowired
를 가질 수 있습니다.
스프링 기반 메소드 유효성 검사
다음과 같이 Bean Validation 1.1에서 지원되는 메소드 유효성 검사 기능(그리고 사용자 정의 확장 기능, 또한 Hibernate Validator 4.3에 의해)을 MethodValidationPostProcessor
빈 정의를 통해 스프링 컨텍스트에 통합할 수 있습니다.
@Configuration 클래스에 MethodValidationPostProcessor 추가. (@Bean)
@Validated를 컨트롤러 클래스에 추가.
@RequestParam 바로 앞에 @Size를 사용
추가 구성 옵션
ex.
스프링 기반 메소드 유효성 검사를 받기 위해서는 모든 대상 클래스에 스프링의 @Validated
어노테이션을 추가해야 합니다. Hibernate Validator와 Bean Validation 1.1 Provider의 설치에 대한 자세한 정보는 javadoc를 참고하십시오. (옵션으로, 사용할 Validation 그룹을 선언할 수도 있습니다)
대부분의 경우에는 기본 LocalValidatorFactoryBean
구성으로 충분합니다. 메시지 보간에서 순회 해석에 이르기까지 다양한 빈 유효성 검증 구조에 대한 여러 가지 구성 옵션이 있습니다. 이러한 옵션에 대한 자세한 내용은 javadoc javadoc을 참조하십시오.