> For the complete documentation index, see [llms.txt](https://wannaqueen.gitbook.io/spring5/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wannaqueen.gitbook.io/spring5/spring-5.0/3.-by-ys-sh/3.7-by-sh/3.7.2-by-sh.md).

# 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를 스프링 빈으로 구성할 수 있습니다.**&#x20;

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

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

**Validator 주입**

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

{% hint style="info" %}
LocalValidatorFactoryBean&#x20;

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

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

```java
import javax.validation.Validator;

@Service
public class MyService {

    @Autowired
    private Validator validator;
```

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

```java
import org.springframework.validation.Validator;

@Service
public class MyService {

    @Autowired
    private Validator validator;
}
```

{% hint style="info" %}
org.springframework.validation.Validator 인터페이스 (아래 메서드 구현해야 함)&#x20;

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

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

**사용자 정의 제약 조건 구성**&#x20;

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

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

{% hint style="info" %}
@Constraint&#x20;

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

 Ex. @Constraint(validatedBy={ExcistCheckValidator.class})&#x20;

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

{% hint style="info" %}
ConstraintValidator 인터페이스  구현한 클래스의 기본 구조

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

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

ex. <https://zgundam.tistory.com/27>
{% endhint %}

![](https://3140643518-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LWdhssr0w9IqAHmA-ke%2F-LZxbegD53_VNILriT-r%2F-LZxdJkzt9xILbq6vL-F%2Fimage.png?alt=media\&token=e4757623-0138-49bb-80ee-cbc875c78d91)

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

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

```
@Target({ElementType.METHOD, ElementType.FIELD})
```

```java
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=MyConstraintValidator.class)
public @interface MyConstraint {
}
```

```java
import javax.validation.ConstraintValidator;

public class MyConstraintValidator implements ConstraintValidator {

    @Autowired;
    private Foo aDependency;

    ...
}
```

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

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

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

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

**스프링 기반 메소드 유효성 검사를 받기 위해서는 모든 대상 클래스에 스프링의 `@Validated`어노테이션을 추가해야 합니다.** Hibernate Validator와 Bean Validation 1.1 Provider의 설치에 대한 자세한 정보는 [`MethodValidationPostProcessor`](https://docs.spring.io/spring-framework/docs/5.1.5.RELEASE/javadoc-api/org/springframework/validation/beanvalidation/MethodValidationPostProcessor.html)javadoc를 참고하십시오. (옵션으로, 사용할 Validation 그룹을 선언할 수도 있습니다)

{% hint style="info" %}
 @Configuration 클래스에 MethodValidationPostProcessor 추가. (@Bean)&#x20;

 @Validated를 컨트롤러 클래스에 추가.&#x20;

 @RequestParam 바로 앞에 @Size를 사용
{% endhint %}

![](https://3140643518-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LWdhssr0w9IqAHmA-ke%2F-LZxbegD53_VNILriT-r%2F-LZxeAP5rkmZsQ0B4mNv%2Fimage.png?alt=media\&token=49b9f20d-13c2-468d-abc0-84519e3fdc02)

**추가 구성 옵션**&#x20;

대부분의 경우에는 기본 `LocalValidatorFactoryBean`구성으로 충분합니다. 메시지 보간에서 순회 해석에 이르기까지 다양한 빈 유효성 검증 구조에 대한 여러 가지 구성 옵션이 있습니다. 이러한 옵션에 대한 자세한 내용은 [`LocalValidatorFactoryBean`](https://docs.spring.io/spring-framework/docs/5.1.5.RELEASE/javadoc-api/org/springframework/validation/beanvalidation/LocalValidatorFactoryBean.html)javadoc javadoc을 참조하십시오.&#x20;
