본문 바로가기

스프링

@ModelAttribute

@ModelAttribute 사용

@ModelAttribute는 사용자가 전달하는 값을 오브젝트 형태(객체 형태)로 매핑해주는 어노테이션이다.

보통 폼을 통해 값을 전달할 때 자주 사용한다.

설명하기에 앞서, 오브젝트 형태(객체 형태)로 매핑해주어야 하기 때문에 임의의 객체인 Person을 다음과 같이 구성하였다.

@Getter
@Setter
@RequiredArgsConstructor
public class Person {
    private String name;
    private Integer age;
}


(1) @ModelAttribute 애노테이션 사용

@Slf4j
@Controller
public class request_mapping {

    @RequestMapping("/request_mapping")
    public String visit(@ModelAttribute Person person, Model model) {

        model.addAttribute("person", person);

        return "home";
    }
}

  • Form 객체를 통해 얻어진 name과 age 파라미터를 Person 객체의 name과 age에 매핑시켜 값을 리턴한다.

(2) @ModelAttribute 애노테이션 생략

@Slf4j
@Controller
public class request_mapping {

    @RequestMapping("/request_mapping")
    public String visit(Person person, Model model) {

        model.addAttribute("person", person);

        return "home";
    }
}

  • Form 객체를 통해 얻어진 name과 age 파라미터를 Person 객체의 name과 age에 매핑시켜 값을 리턴한다.

생략 시, @RequestParam vs @ModelAttribute

@RequestParam을 알아보기 위해 RequestParamMethodArgumentResolver를 살펴보고 @ModelAttribute를 알아보기 위해 ModelAttributeMethodProcessor을 살펴보자.

(1) @RequestParam

  • @RequestParam의 경우에는 심플 타입일 경우에 사용이 된다.
  • 심플 타입이란 우리가 흔히 사용하는 원시타입(Integer, String 등)등을 말한다.

(2) @ModelAttribute

  • 심플 타입이 아닌경우 즉, 복합 타입(클래스)일 경우 추가적으로 Argument Resolver에 등록되어 있지 않은 경우에 @ModelAttribute가 사용된다.

@ModelAttribute 파라미터

(1) name

@Slf4j
@Controller
public class request_mapping {

    @RequestMapping("/request_mapping")
    public String visit(@ModelAttribute(name="person") Person person) {

        return "home";
    }
}
<div th:object="${person}">
    <p th:text="|이름은 *{name}입니다.|"></p>
    <p th:text="|나이는 *{age}입니다.|"></p>
</div>
  • @ModelAttribute의 경우, Model에 자동으로 저장이 된다.
  • 이 때, ModelattributeName을 설정하는데 name을 사용한다.

(2) value

@Slf4j
@Controller
public class request_mapping {

    @RequestMapping("/request_mapping")
    public String visit(@ModelAttribute(name = "person", value = "person") Person person) {

        return "home";
    }
}
  • 이름을 부여한다.

(3) binding

@Slf4j
@Controller
public class request_mapping {

    @RequestMapping("/request_mapping")
    public String visit(@ModelAttribute(name = "person", binding = false) Person person) {

        return "home";
    }
}
  • 바인딩의 여부를 정한다.
  • defaulttrue이다.

name 속성 이외에는 크게 사용할 일이 없다.

'스프링' 카테고리의 다른 글

[Thymeleaf] 텍스트, spring EL, 객체, URL 링크, 리터럴  (0) 2021.09.22
@RequestBody, @ResponseBody  (0) 2021.09.21
@RequestParam  (0) 2021.09.20
RequestMapping  (0) 2021.09.20
MVC, Spring MVC  (0) 2021.09.18