본문 바로가기
공부/Spring

[chap12] MVC 2: 메시지, 커맨드 객체 검증

by JERO__ 2022. 6. 2.

좀 치는 스프링 스터디

 https://github.com/woowacourse-study/2022-gugu-spring-study

 

GitHub - woowacourse-study/2022-gugu-spring-study: 레벨1 구구조의 제로가 이끄는 스프링 스터디

레벨1 구구조의 제로가 이끄는 스프링 스터디. Contribute to woowacourse-study/2022-gugu-spring-study development by creating an account on GitHub.

github.com

 

글로벌 범위 Validator와 컨트롤러 범위 Validator

Validator의 공통된 사용 방법

  • @Valid 를 사용하여 커맨드 객체에 검증 기능을 적용
    • 커맨드 객체? : HttpServletRequest 를 통해 들어온 요청 파라미터

1. 글로벌 범위 Validator

설정방법

설정클래스에서 WebMvcConfigurer의 getValidator()가 검증객체를 리턴하도록 구현

@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
	
    @Override
    public Validator getValidator() {
        return new 검증객체();
    }
}

적용

@PostMapping("/register/step3")
public String handleStep(@Valid RegisterRequest request, Errors errors) {
		if (errors.hasErrors()){
				return "register/step2"
		}
		...
}
  1. handleStep을 실행하기전, @Valid 붙은 파라미터를 글로벌 Validator로 검증
  2. 검증 수행 결과는 Errors 타입 파라미터로 받음
    • Errors가 없으면 에러 발생함

글로벌 Validator의 범용성

  • 모든 컨트롤러에 적용할 validator가 있을까? 적절치 않은 것 같다.

2. 컨트롤러 범위 Validator

설정방법 : @InitBinder

@InitBinder
protected void initBinder(WebDataBinder binder) {
    binder.setValidator(new 검증객체());
}
  • 적용방법은 위 글로벌 Validator와 같다.

WebDataBinder

  • 내부적으로 Validator 목록을 갖는다.
    • 글로벌 Validator가 포함된다.
  • setValidator : 사용시 기존 Validator를 삭제하고, 파라미터로 받은 Validator를 목록에 추가한다.
  • addValidator : 사용시 기존 Validator 목록에 파라미터로 받은 Validator를 목록에 추가한다.

3. Bean Validation

Validator 작성 없이 애노테이션 만으로 커맨드 객체의 값 검증을 처리

설정방법

public class RegisterRequest {

		@NotBlank
		@Email
		private String email;
		@Size(min = 6)
		private String password;
}
  • 커맨드클래스에서 Bean Validation, 프로바이더에서 제공하는 애노테이션을 이용해 검증 규칙을 설정 → Component 처럼 설정 가능한 대상으로 지정
  • Bean Validation을 적용한 커맨드 객체를 검증할 OptionalValidatorFactoryBean등록
    • @EnableWebMvc를 사용하면 OptionalValidatorFactoryBean 을 글로벌 Validator로 등록한다
    • @SpringBootApplication@EnableAutoConfiguration 은 내부적으로 @EnableWebMvc과 동일한 기능

자주쓰는 Bean Validation

  • AssertTrue, AssertFalse : 값 true, false 검사
  • DecimalMax, DecimalMin : 지정 값보다 작거나 같은지 / 크거나 같은지 검사
  • Max, Min
  • Digits : 자릿수
  • Size
  • Null, NotNull
  • Pattern : 정규식
  • Positive, PositiveOrZero
  • Negative, NegativeOrZero
  • Email
  • Future, FutureOrPresent : 미래시간 검사
  • Past, PastOrPresent : 과거시간 검사

댓글