-
@ModelAttribute과 BindingResultSpring/Spring MVC 2020. 6. 11. 01:54
- @RequestParam은 제각각의 심플 타입 값들을 하나씩 받아왔었다면
- @ModelAttribute 사용 시 데이터가 여러 개 있는 복합 객체의 형태로 받아올 수 있다.
- @RequestParam과 마찬가지로 어노테이션을 생략 가능하다.
- 따라서 해당 Hello객체의 Integer id와 String name으로 하나하나 받아오는 게 아닌
- id와 name 데이터가 담긴 Hello 객체를 바인딩받아오는 것
따라서 다음의 테스트는 성공하게 된다.
- 만약 name값에 Integer 값을 준다면 바인딩 에러가 나게 된다.
- 이때 BindingResult 타입의 변수를 선언 시 해당 에러를 바로 던지는 게 아니라
- 이 변수에 바인딩과 관련된 에러를 담게 된다.
- BindingResults는 상위 타입인 Errors로 바꾸어 쓸 수도 있다.
- 따라서 Form에 데이터가 잘못 들어온 경우 처리가 가능하다.
- 어떤 데이터를 바인딩한 이후에는 Validation을 추가할 수도 있다.
-
스프링 5.3이후부터 Validation 어노테이션을 쓰려면 의존성을 따로 추가해주어야 한다. (JSR 303)
<dependency>
<groupId> org.springframework.boot </groupId>
<artifactId> spring-boot-starter-validation </artifactId>
</dependency>- 만약 id에 (-) 마이너스 값을 집어넣어
- 바인딩은 돼서 아규먼트에 담기지만 @Valid 이후 BindingResult에 에러가 담기게 된다.
@Valid와 @Validated의 차이?
@Validated는 그룹을 정할 수 있다.
- 다음과 같이 @Validated 그룹으로 ValidateName을 주게 되면
- 해당 이름이 붙은 조건만 검사하게 된다.
- 따라서 다음과 같은 핸들러는 id가 최소 0이어야 된다는 조건은 확인하지 않는다.
직접 form 데이터로 확인해 보기
- 만일 hello에 @Valid에 위배되는 조건이 온다면 "/hello/form"으로 가게 된다.
- 다음은 에러가 담기지 않고 정상적으로 /hello/list로 가는 경우이다.
- 이 때 새로고침 시 form 데이터가 다시 넘어가는 것을 방지하기 위해 redirect와 get 요청으로 바꾸어주자.
- DB에 저장하고 불러오는 것은 생략하였다.
'Spring > Spring MVC' 카테고리의 다른 글
RedirectAttributes (0) 2020.06.22 @SessionAttributes (0) 2020.06.16 요청 매개변수를 메소드 아규먼트로 받아오는 방법 (0) 2020.06.09 핸들러 메소드 URI 패턴 (0) 2020.06.09 스프링MVC 핸들러 아규먼트와 리턴타입 살펴보기 (0) 2020.06.08