ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • @ModelAttribute과 BindingResult
    Spring/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>

     

     

    @Min은 JSR 303 어노테이션중 하나이다.

    • 만약 id에 (-) 마이너스 값을 집어넣어
    • 바인딩은 돼서 아규먼트에 담기지만 @Valid 이후 BindingResult에 에러가 담기게 된다.

     

    @Valid와 @Validated의 차이?

     

    @Validated는 그룹을 정할 수 있다.

     

     

    • 다음과 같이 @Validated 그룹으로 ValidateName을 주게 되면
    • 해당 이름이 붙은 조건만 검사하게 된다.
    • 따라서 다음과 같은 핸들러는 id가 최소 0이어야 된다는 조건은 확인하지 않는다.

     


     

    직접 form 데이터로 확인해 보기

     

    /hello/form

    • 만일 hello에 @Valid에 위배되는 조건이 온다면 "/hello/form"으로 가게 된다.

     

     

     


    • 다음은 에러가 담기지 않고 정상적으로 /hello/list로 가는 경우이다.

     

     

     

     

     

     

    • 이 때 새로고침 시 form 데이터가 다시 넘어가는 것을 방지하기 위해 redirect와 get 요청으로 바꾸어주자.

     

    • DB에 저장하고 불러오는 것은 생략하였다.
Designed by Tistory.