Spring/SpringMVC

상품 등록 처리 - @ModelAttribute

느리지만 꾸준하게 2022. 5. 4. 19:47

상품 등록 폼을 만들어 보자.

서버에 데이터를 전달해야 하는데

 

 

POST - HTML Form

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

 

 

 

 

 

요청 파라미터 형식을 처리해야 해서 @RequestParam을 사용하자.

 

BasicItemController의 save 부분을 만들어 보자.

// BasicItemController Class

@PostMapping("/add")
public String save
// BasicItemController Class

@PostMapping("/add")

// 파라미터가 오면
public String save(@RequestParam String itemName,
                   @RequestParam int price,
                   @RequestParam 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";
}

 

 

 

 

 

상품을 등록한 대로 상품목록에 반영이 된다.

 

 

 

 

 

save 이름을 addItemV1으로 바꾸자.

addItemV2를 만들어 주기 위해 PostMapping도 주석처리를 해주자.

//    @PostMapping("/add")
// @PostMapping("/add")

// 파라미터가 오면
public String addItemV1(@RequestParam String itemName,
                   @RequestParam int price,
                   @RequestParam 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";
}

 

 

 

 

addItemV2를 만들어 주자. ModelAttribute를 통해서 간단하게 만들 수 있다.

@PostMapping("/add")
    public String addItemV2(@ModelAttribute("item") Item item, Model model) {

        
        // ModelAttribute가 자동으로 만들어 준다.
//        Item item = new Item();
//        item.setItemName(itemName);
//        item.setPrice(price);
//        item.setQuantity(quantity);

        itemRepository.save(item);

        model.addAttribute("item", item);

        return "basic/item";
    }
/**
     * @ModelAttribute("item") Item item
     * model.addAttribute("item", item); 자동 추가
     */
    @PostMapping("/add")
    public String addItemV2(@ModelAttribute("item") Item item, Model model) {
        itemRepository.save(item);
//model.addAttribute("item", item); //자동 추가, 생략 가능
        return "basic/item";
    }
  • @RequestParam으로 변수 하나하나 받아서 Item을 생성하는 과정대신 @ModelAttribute를 썼다.

 

  • 실행전에 이전 버전인 addItemV1 에 @PostMapping("/add") 를 꼭 주석처리 해주어야 한다.

 

  • 아니면 중복 매핑으로 오류가 발생한다.

 

 

addItemV2 또한 결과가 잘 나온다. 

 

 

 

 

 

 

 

addItemV3도 만들어 주자.

@ModelAttribute의 item을 생략 가능하다.

// BasicItemController Class

@PostMapping("/add")
public String addItemV3(@ModelAttribute Item item, Model model) {

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

    return "basic/item";
}
  • @ModelAttribute 의 이름을 생략하면 모델에 저장될 때 클래스명을 사용한다. 이때 클래스의 첫글자만 소문자로 변경해서 등록한다.

 

  • 예) @ModelAttribute 클래스명 모델에 자동 추가되는 이름

 

  • Item item

 

  • HelloWorld helloWorld

 

 

 

 

 

 

 

 

결과가 잘 나온다.

 

 

 

@ModelAttribute를 생략해서 addItemV4를 만들어 보자.

@PostMapping("/add")
public String addItemV4(Item item) {
    itemRepository.save(item);
    return "basic/item";
}
  • @ModelAttribute 자체도 생략가능하다. 대상 객체는 모델에 자동 등록된다. 나머지 사항은 기존과 동일하다

 

 

 

똑같이 결과가 잘 나오는 것을 확인할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

<출처 김영한: 스프링 MVC 1편 - 벡앤드 웹 개발 핵심 기술>

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