스프링 MVC 1편 (백엔드 웹 개발 핵심 기술)

Ch07. 스프링 MVC(웹 페이지 만들기) - 상품 등록 처리 (@ModelAttribute)

webmaster 2022. 3. 8. 14:02
728x90

서버로 데이터를 전송하는 방식

  • content-type: application/x-www-form-urlencoded
  • 메시지 바디에 쿼리 파리미터 형식으로 전달
  • itemName=itemA&price=10000&quantity=10 예) 회원 가입, 상품 주문, HTML Form 사용

상품 등록 처리 Controller

V1 : @RequestParam + Model 사용

@PostMapping("/add")
public String addItemV1(
    @RequestParam String itemName,
    @RequestParam int price,
    @RequestParam Integer quantity,
    Model model
) {
    Item item = new Item(itemName, price, quantity);
    itemRepository.save(item);
    model.addAttribute("item", item);
    return "basic/item";
}
  • 상품 상세에서 사용한 item.html 뷰 템플릿을 그대로 재활용한다

V2 : @ModelAttribute로 모델에 담아서 한번에 처리

//@PostMapping("/add")
public String addItemV2(
    @ModelAttribute("item") Item item
    //, Model model
) {
    //지정한 이름으로 모델에 담아 뷰에 반환한다.
    itemRepository.save(item);
    //model.addAttribute("item", item); //자동 추가, 생략 가능
    return "basic/item";
}
  • @ModelAttribute - 요청 파라미터 처리
    • @ModelAttribute 는 Item 객체를 생성하고, 요청 파라미터의 값을 프로퍼티 접근법(setXxx)으로 입력해준다
  • @ModelAttribute - Model 추가
    • 모델(Model)에 @ModelAttribute 로 지정한 객체를 자동으로 넣어준다
    • 모델에 데이터를 담을 때는 이름이 필요하다. 이름은 @ModelAttribute에 지정한 name(value) 속성을 사용한다.
    • 만약 다음과 같이 @ModelAttribute 의 이름을 다르게 지정하면 다른 이름으로 모델에 포함된다

V3 : @ModelAttribute name 속성 생략

@PostMapping("/add")
public String addItemV3(
    @ModelAttribute Item item 
) {
    //속성의 이름을 지우게 된다면 클래스 이름의 첫글자만 소문자로 바꾼 이름으로 넣어준다
    itemRepository.save(item);
    return "basic/item";
}
  • @ModelAttribute 의 이름을 생략하면 모델에 저장될 때 클래스명을 사용한다. 이때 클래스의 첫 글자만 소문자로 변경해서 등록한다

V4 : ModelAttribute 전체 생략

@PostMapping("/add")
public String addItemV4(
    Item item //@ModelAttribute 생략 가능
) {
    itemRepository.save(item);
    return "basic/item";
}
  • @ModelAttribute 자체도 생략가능하다.
728x90