Web

Ch12. MVC 2 : Bean Validation을 이용한 검증

tose33 2022. 7. 22. 17:22

@Valid 애노테이션은 Bean Validation 스펙에 정의되어 있다.

Bean Validation 스펙이란 특정한 구현체가 아닌 Bean Validation 2.0 이라는 기술 표준을 말한다. (애노테이션과 인터페이스의 모음)

 

해당 스펙에는 @NotNull, @NotEmpty, @Size 등 다양한 애노테이션이 정의되어 있는데 이런 애노테이션들을 이용하면 직접 Validator를 구현하지 않고 커맨드 객체의 검증이 가능하다. 

 

 

 

우선 Bean Validation 관련 의존을 추가한다.

여기서는 프로바이더로는 Hibernate Validator를 사용한다.

 

pom.xml

		<dependency>
			<groupId>javax.validation</groupId>
			<artifactId>validation-api</artifactId>
			<version>1.1.0.Final</version>
		</dependency>
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>5.4.2.Final</version>
		</dependency>

 

 

이제 아래와 같이 Bean Validation과 프로바이더가 제공하는 애노테이션을 커맨드 클래스의 프로퍼티에 설정한다. 

 

RegisterRequest.java

package spring;

import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.NotEmpty;

public class RegisterRequest
{
	@NotBlank
	@Email
    private String email;
	@Size(min=6)
    private String password;
	@NotEmpty
    private String confirmPassword;
	@NotEmpty
    private String name;
    

	// .. 
}

 

 

- Bean Validation 애노테이션을 적용한 커맨드 객체를 검증할수 있는 OptionalValidatorFactoryBean 클래스를 빈으로 등록 한다.

그런데 스프링 설정 파일에 @EnableWebMvc 애노테이션을 설정했다면 해당 애노테이션이 등록하기 때문에 추가로 설정하지 않아도 된다.

 

- 스프링 MVC는 별도로 설정한 글로벌 범위 Validator()가 없을 때에만 OptionalValidatorFactoryBean를 글로벌 범위 Validator로 사용한다.

 

- 책에는 별도로 설정한 글로벌 범위 Validator()가 없을 때만이라고 되있는데 @InitBinder로 개별적으로 설정한 컨트롤러 범위의 Validator도 없어야 하는듯 하다. (생각해보면 당연하다) 

 

- 즉 별도로 설정한 글로벌 범위 Validator가 없는 상태에서, @EnableWebMvc로 OptionalValidatorFactoryBean이 빈으로 등록된 상태라면, 커맨드 객체에 @NotBlank, @NotEmpty 등 의 Bean Validation 스펙에 정의된 애노테이션들로 커맨드 객체 검사가 가능한다는 것이다. 

 

- @Valid 애노테이션이 붙은 커맨드 객체를 검사한다.

 

 

register/step3

위의 오류 메시지들은 Bean Validation의 프로바이더 (hibernate-validator)가 기본 제공하는 에러 메시지들이다. 

 


에러 메시지 변경

메시지 프로퍼티 파일(label.properties) 에 다음 규칙을 따르는 메시지 코드를 추가하면 된다.

 

  • 애노테이션이름.커맨드객체모델명.프로퍼티명
  • 애노테이션이름.프로퍼티명
  • 애노테이션이름

따라서 다음과 같이 애노테이션들을 적용했을때

public class RegisterRequest
{
	@NotBlank
	@Email
    private String email;
	@Size(min=6)
    private String password;
	@NotEmpty
    private String confirmPassword;
	@NotEmpty
    private String name;

// ... 
}

 

다음과 같이 메시지 코드를 메시지 프로퍼티 파일에 추가하면

label.properties

 

나타나는 에러 메시지들은 다음과 같다 

 

 

 

 

 

 

출처 : 스프링5 프로그래밍 입문 (최범균 저)