오봉이와 함께하는 개발 블로그

스프링 MVC 1 - @ModelAttribute 본문

BE/Spring

스프링 MVC 1 - @ModelAttribute

오봉봉이 2022. 8. 15. 23:04
728x90

@ModelAttribute

@PostMapping("/add")
public String addItemV1(@RequestParam("itemName") String itemName,
                       @RequestParam("price") int price,
                       @RequestParam("quantity") Integer quantity,
                       Model model) {

    Item item = new Item();
    item.setItemName(itemName);
    item.setPrice(price);
    item.setQuantity(quantity);

    itemRepository.save(item);

    model.addAttribute("item", item);

    return "basic/item"; // model로 넣은 item을 basic/item 경로로 넣어줌
}

/**
* @ModelAttribute("item") Item item
* model.addAttribute("item", item); 자동 추가
* */
@PostMapping("/add")
public String addItemV2(@ModelAttribute("item") Item item) {

    itemRepository.save(item);
    // model.addAttribute("item", item); -> 자동 추가, 생략 가능

    return "basic/item"; // model로 넣은 item을 basic/item 경로로 넣어줌
}

addItemV1addItemV2는 똑같은 기능을 한다.

@ModelAttribute - 요청 파라미터 처리

@ModelAttributeItem 객체를 생성하고, 요청 파라미터의 값을 프로퍼티 접근법(setXxx)으로 입력해준다.

@ModelAttribute - Model 추가

@ModelAttribute는 중요한 한가지 기능이 더 있는데, 바로 모델(Model)에 @ModelAttribute로 지정한 객체를 자동으로 넣어준다.
model.addAttribute("item", item) 가 주석처리 되어 있어도 잘 동작한다.

모델에 데이터를 담을 때는 이름이 필요하다.
이름은 @ModelAttribute에 지정한 name(value) 속성을 사용한다.
만약 @ModelAttribute의 이름을 다르게 지정하면 다른 이름으로 모델에 포함된다.

@ModelAttribute("hello") Item item -> 이름을 hello 로 지정 -> model.addAttribute("hello", item);
결과적으로 모델에 hello 이름으로 저장하게 된다.

ModelAttribute 이름 생략

/**
* @ModelAttribute name 생략 가능
* model.addAttribute(item); 자동 추가, 생략 가능
* 생략시 model에 저장되는 name은 클래스명 첫글자만 소문자로 등록 Item -> item
* */
@PostMapping("/add")
public String addItemV3(@ModelAttribute Item item) {
    itemRepository.save(item);
    return "basic/item";
}

@ModelAttribute의 이름을 생략할 수 있다.
@ModelAttribute의 이름을 생략하면 모델에 저장될 때 클래스명을 사용한다.
이때 클래스의 첫글자만 소문자로 변경해서 등록한다.

@ModelAttribute Item item은 모델에 자동 추가되는 이름은 item이 된다.

ModelAttribute 전체 생략

/**
* @ModelAttribute 자체 생략 가능
* model.addAttribute(item) 자동 추가
* */
@PostMapping("/add")
public String addItemV4(Item item) {
    itemRepository.save(item);
    return "basic/item";
}

String, int, Integer 등 단순 타입이 오면 @RequestParam이 적용되고, 나머지 타입들이 파라미터로 들어오면 @ModelAttribute가 적용되어 대상 객체는 모델에 자동 등록된다.
나머지 사항은 V3과 동일하다.

출처 : 인프런 김영한 지식 공유자님 강의 - 스프링 MVC 1편 백엔드 웹 개발 핵심 기술
728x90
Comments