Spring/Annotation

[Spring][Annotation] @ModelAttribute에 대하여

소윤파크 2023. 6. 20. 01:36
반응형

@ModelAttribute


예시 코드)

/**
  * Form으로부터 받아온 item을 저장한 후, item 정보를 보여주는 뷰 반환
  */
@PostMapping("/add")
public String addItem(@ModelAttribute("item") Item item, Model model) {

    itemRepository.save(item);
    model.addAttribute("item", item); // @ModelAttribute -> 자동으로 Model에 추가, 생략 가능

    return "basic/item";
}

 

@ModelAttribute 어노테이션은 HTTP 요청 파라미터들을 1:1로 하나의 객체에 바인딩할 때 사용한다.

@RequestParam으로 바인딩하기에는 파라미터들이 너무 많을 때, @ModelAttribute를 사용하면 이를 하나의 객체로 압축시킬 수 있다.

  • String, int, Integer와 같은 단순한 타입 -> @RequestParam
  • 그 외 (단순한 타입들의 묶음) -> @ModelAttribute

 

단, 객체에 기본 생성자, 객체의 프로퍼티 각각에 대한 Setter가 있어야 바인딩이 가능하다. (혹은 매개변수가 있는 생성자)

그 이유는 @ModelAttribute를 처리하는 과정에서  알 수 있다.

  1. Item 객체를 생성한다. -> 기본 생성자 사용
  2. 요청 파라미터의 이름으로 Item 객체의 프로퍼티를 찾고, 해당 프로퍼티의 setter를 호출해 바인딩한다. -> setter 사용

타이핑하기 귀찮다면, Lombok의 어노테이션들을 활용하자.

 

추가적으로, 요청 파라미터의 타입과 해당 프로퍼티의 타입이 일치하지 않는다면, 예외(BindingException)를 발생시킨다. 

  • ex) int 타입의 age라는 프로퍼티 -> 요청 파라미터로 "abc"라는 String 타입이 들어오는 경우(age=abc)

 

이러한 자동화된 요청 파라미터 바인딩이 가능하도록 Spring에서는 ArgumentResolver 라는 인터페이스를 제공한다.

ArgumentResolver에 대해서는 더 알아보고 새로운 게시글에서 다뤄보도록 하겠다.

 

 

RequestMapping - GET

GET 요청의 경우, URL의 쿼리 파라미터로 들어온 파라미터들의 이름을 key로, 짝지어진 value를 객체에 바인딩해준다.

 

RequestMapping - POST

POST 요청의 경우, <input> 등의 입력 태그의 "name" 필드 값을 key로, 짝지어진 value를 객체에 바인딩해준다.

  • <input type="text" name="name">  <!-- 객체의 "name"이라는 이름의 프로퍼티에 value 바인딩 됨 -->

 

 

참고자료


https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com