핸들러 메서드인 @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을 붙여주면 에러가 바인딩되지 않아 주황색 박스는 통과될 것이다.
'스프링 > 스프링 MVC' 카테고리의 다른 글
핸들러 메서드: RedirectAttributes, FlashAttributes (0) | 2019.12.26 |
---|---|
핸들러 메서드: @SessionAttributes, @SessionAttribute (0) | 2019.12.25 |
Spring MVC @PathVariable, @MatrixVariable, @RequestParam (0) | 2019.12.24 |
Spring MVC HEAD, OPTIONS HTTP Method (0) | 2019.12.22 |
Spring MVC 미디어타입, 헤더, 매개변수 매핑 (0) | 2019.12.22 |