[SpringMVC] HTTP 요청 파라미터 - @ModelAttribute
[SpringMVC] HTTP 요청 파라미터 - @RequestParam [SpringMVC] 요청(Request)의 종류 ( GET, POST, JSON ) [SpringMVC] 웹서비스에서 Request(요청)가 처리되는 원리 ( + Servlet ) JAVA Runtime Enviroment(JRE)는 하나의 프로세스, 다
lordofkangs.tistory.com
지난 포스팅에서 @ModelAttribute에 대해서 알아보았다. @ModelAttribute는 Get이나 Post 방식으로 들어온 Request 데이터를 특정 객체에 담아 파라미터로 넘겨받는 어노테이션이다.
@ModelAttribute 파라미터 선언
@PostMapping("/add")
public String addItemV1(@ModelAttribute Item item, Model model){
itemRepository.save(item);
model.addAttribute("item", item);
return "basic/item";
}
@ModelAttribute에는 Model 객체에 addAttribute하는 과정을 자동화하는 기능이 있다. 그래서 위 코드처럼 model.addAttribute 메소드를 직접 호출 안해줘도 Spring이 자동으로 해준다.
@PostMapping("/add")
public String addItemV2(@ModelAttribute("item") Item item){
itemRepository.save(item);
return "basic/item";
}
@ModelAttribute에 value 값으로 "item"을 넣으면, Spring은 자동으로 Model 객체에 "item"을 key로 하여 item 객체를 등록한다. 다시 말하여, 자동으로 model.addAttribute("item", item); 을 실행한다. 그러므로 Controller에는 Model 관련 코드를 작성하지 않아도 된다.
@PostMapping("/add")
public String addItemV3(@ModelAttribute Item item){
itemRepository.save(item);
return "basic/item";
}
그런데 굳이 value값을 넣지 않아도 Spring이 Item(클래스 타입명)의 앞문자를 소문자로 바꾼 "item"을 key명으로 하여 Model에 추가한다.
@PostMapping("/add")
public String addItemV4(Item item){ //@ModelAttribute도 생략가능
itemRepository.save(item);
return "basic/item";
}
더 단순하게는 @ModelAttribute를 생략해도 된다. 원래 @ModelAttribute가 없는데 파라미터로 클래스 타입이 오면, Spring이 자동으로 GET이나 POST 방식으로 들어온 데이터를 담은 객체를 생성하여 넘긴다. 동시에 Model에도 추가를 하는 것이다.
@ModelAttribute의 메소드 선언
@ModelAtttibute는 파라미터 뿐만 아니라 메소드에도 선언이 가능하다.
@Controller
@RequestMapping("/form/items")
@RequiredArgsConstructor
public class FormItemController {
private final ItemRepository itemRepository;
@ModelAttribute("regions") // @ModelAttribute 메소드에 선언
public Map<String,String> regions(){
Map<String,String> regions = new LinkedHashMap<>();
regions.put("SEOUL","서울");
regions.put("BUSAN","부산");
regions.put("JEJU","제주");
return regions;
}
@ModelAttribute //@ModelAttribute 메소드에 선언
public void setAttributes(Model model) {
model.addAttribute("key", "value");
}
@GetMapping
public String items(Model model) {
List<Item> items = itemRepository.findAll();
model.addAttribute("items", items);
return "form/items";
}
}
@ModelAttribute에 설정된 value값을 key값으로, 메소드의 반환값을 value로 하여 Model 객체에 추가한다. 그럼 어떤 Model에 추가할까? Controller에 선언된 모든 메소드의 Model에 공통으로 추가된다. @ModelAttribute가 선언된 메소드는 Controller의 메소드가 실행되기 전에 먼저 실행되어 Model에 미리 추가해놓는다. @ModelAttribute는 여러 개 선언되어도 되고 반환타입 없이 Model을 파라미터로 받아 설정해도 된다.
참고자료
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의
웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원
www.inflearn.com
[Spring] @ModelAttribute 파라미터에서 사용 방법 및 원리
@ModelAttribute 는 클라이언트로부터 일반 HTTP 요청 파라미터나 multipart/form-data 형태의 파라미터를 받아 객체로 사용하고 싶을 때 이용된다. 사용 방법 @ModelAttribute 는 parameter, method 레벨로 두 가지의
blog.karsei.pe.kr
'SPRING > Spring MVC' 카테고리의 다른 글
[SpringMVC] 검증(Validation)(1) - HashMap (0) | 2023.08.22 |
---|---|
[SpringMVC] PRG ( Post/Redirect/Get ) (0) | 2023.08.18 |
[SpringMVC] HTTP 메시지 컨버터 동작원리 (0) | 2023.08.15 |
[SpringMVC] HTTP 응답 - Controller 반환타입 (0) | 2023.08.14 |
[SpringMVC] HTTP 요청 메시지 - TEXT, JSON (0) | 2023.08.12 |