Spring MVC 핸들러 메소드 @ModelAttribute

Spring Web MVC

백기선님의 강의인 Spring Web MVC 강의를 듣고 공부한 내용을 정리한 글

@ModelAttribute

@ModelAttribute는 여러 곳에 있는 단순 데이터 타입을 복합 타입 객체로 받아오거나 해당 객체를 새로 만들 때 사용할 수 있다.

여러곳이라 함은 URI 패스, 요청 매개변수, 세션 등을 의미한다.

복합 객체에 데이터를 바인딩하는 방법은 반드시 Request Parameter로만 전달되어야하는 것은 아니다.

유연하게 여러 데이터를 하나의 복합 타입 객체로 받아올 수 있다.

만약 값을 바인딩 할 수 없는 경우라면 BindException이 발생하고 400에러가 발생한다.

만약 바인딩 에러를 직접 다루고 싶은 경우라면 @ModelAttribute가 붙은 메소드 아규먼트 옆에 BindingResult를 추가하면 된다.

@Controller
public class SampleController {
    @PostMapping("/events/name/{name}")
    @ResponseBody
    public Event getEvent(@ModelAttribute Event event, BidingResult bidingResult) {
        if(bindingResult.hasErrors()){
            bindingResult.getAllErrors().forEach( c-> {
                System.out.println(c.toString());
            });
        }
        return event;
    }
}

바인딩 이후 검증 작업을 추가로 검증하고 싶다면 @Valid 또는 @Validated 애노테이션을 사용할 수 있다.

public class Event {
    private Integer id;
    private String name;

    @Min(0)
    private Integer limit;

    // getter & setter
    ...
}

```java
@Controller
public class SampleController {
    @PostMapping("/events/name/{name}")
    @ResponseBody
    public Event getEvent(@Valid @ModelAttribute Event event, BidingResult bidingResult) {
        if(bindingResult.hasErrors()){
            bindingResult.getAllErrors().forEach( c-> {
                System.out.println(c.toString());
            });
        }
        return event;
    }
}

@Validated

스프링 MVC 핸들러 메소드 아규먼트에 사용할 수 있으며 validation group이라는 힌트를 사용할 수 있다.

@Valid 애노테이션에는 그룹을 지정할 방법이 없다.

@Validated는 스프링이 제공하는 애노테이션으로 그룹 클래스를 설정할 수 있다.

Reference

인프런 백기선님의 스프링 Web MVC



© 2022. by minkuk

Powered by minkuk