본문 바로가기

스프링/스프링 MVC

Spring MVC @ModelAttribute, @Valid, @Validated

핸들러 메서드인 @ModelAttribute, @Valid, @Validated에 대해 알아본다.

@ModelAttribute

  • URI 패스, 요청 , 세션 등 에 있는 단순 타입 데이터를 복합 타입 객체로 받아오거나 해당 객체를 새로 만들 때 사용할 수 있다.

  • @ModelAttribute를 이용하면 객체로 데이터를 받아올 수 있다.

 

  • param에 name, limit을 담아 전송한다.
  • @ModelAttribute는 그 값들을 Event 객체에 매핑해준다.

 

  • name과 limit이 정상적으로 전송되어 Event 객체로 변환된 것을 알 수 있다.
  • param으로만 데이터를 전송했지만 URI 패스, 세션 등에도 똑같이 적용된다.

@ModelAttribute 생략

  • @ModelAttribute는 생략하여도 알아서 변환해준다. 하지만 명시적으로 붙여주는 것이 좋다.

  • @ModelAttribute를 생략하여도 정상적으로 테스트가 수행하는 것을 알 수 있다.

바인딩 에러

  • Integer 타입인 limit에 String을 전송하면 바인딩 에러가 발생한다.

 

  • BindingResult나 Errors를 이용하여 에러 발생 시 필요한 작업을 수행할 수도 있다.

 

  • 위와 똑같은 테스트를 실행한다.
  • Integer타입에 String을 넣었으므로 에러가 발생한다.
  • 그 에러는 BindingResult에서 가지고 있다
  • 그러므로 위와 같이 출력이 나타나는 것을 알 수 있다.

@Valid

  • @Valid를 통해 검증작업을 할 수 있다.

  • Event의 인스턴스 변수에 Vaild와 관련된 Annotation을 통해 검증작업을 수행할 수 있다.
  • Integer에 @Min(0)을 붙여 0보다 크거나 같은 값만 허용하게 하였다.
  • 검증을 위해선 Controller에서 값을 받는 파라미터에 @Valid를 붙여줘야 한다.

 

  • 테스트에서 limit에 -10을 담고 요청을 보낸다.
  • @Valid를 통해 limit에 설정된 @Min(0)을 검증하여 에러를 발생시킨다.

@Validated

  • 스프링 프레임워크가 제공해주는 @Validated를 이용하면 그룹화를 할 수 있다.

  • name의 @NotBlank는 ValidatedName으로 그룹화하였다.
  • limit의 @Min은 ValidatedLimit으로 그룹화하였다.

 

  • 해당 컨트롤러 메서드에서 검증을 원하는 파라미터에 @Validated를 붙이고 그룹화한 클래스를 넣어준다.
  • ValidatedLimit을 넣었으므로 Min에 대한 검증만 이루어지게 될 것이다.
  • 그러므로 이전과 같은 테스트 실행 시 에러가 바인딩될 것이다.

 

  • name을 검증하는 ValidateName을 붙여주면 에러가 바인딩되지 않아 주황색 박스는 통과될 것이다.

참고 자료