이제 상품 등록 폼에서 전달된 데이터로 실제 상품을 등록 처리해보았다.

 

POST - HTML Form

content-type : application/x-www-form-urlencoded

메시지 바디에 쿼리 파라미터 형식으로 전달 

- itemName=itemA&price=10000&quantity=10

예) 회원가입, 상품 주문, HTML Form사용

 

요청 파라미터 형식을 처리해야하므로 @RequestParam을 사용하였다.

@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";
    }

@RequestParam String itemName : itemName 요청 파라미터 데이터를 해당 변수에 받는다.

Item 객체를 생성하고 itemRepository를 통해서 저장한다.

저장된 item을 모델에 담아서 뷰에 전달한다.

 

이번에는 @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객체를 생성하고, 요청 파라미터의 값을 프로퍼티 접근법으로 입력해준다.

 

@ModelAttribute - Model 추가

@ModelAttribute는 중요한 한가지 기능이 더 있다. 바로 모델에 @ModelAttribute로 지정된 객체를 자동으로 넣어준다.

코드를 보면 mdoel.addAtrribute("item",item)가 주석처리 되어있다. 그래도 잘 동작한다.

 

모델에 데이터를 담을 때는 이름이 필요하다. 이름은 @ModelAttribute에 지정한 name(value) 속성을 사용한다

만약 다음과 같이 @ModelAttribute의 이름을 다르게 지정하면 다른 이름으로 모델에 포함된다.

 

@ModelAttribute("hello") Item item --->> 이름을 hello 로 지정
model.addAttribute("hello", item); --->> 모델에 hello 이름으로 저장

ModelAttribute 이름을 생략할 수 도 있다.

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

        itemRepository.save(item);
        return "basic/item";
    }

 

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

 

ModelAttribute 전체를 생략할 수 도 있다.

    @PostMapping("/add")
    public String addItemV4(Item item){
        itemRepository.save(item);
        return "basic/item";
    }

대상 객체는 모델에 자동 등록된다. 이 방법은 생략의 극단적인 모습을 보여주는 방법이라고 생각하는데 적당한 생략이 보기에 직관적일 수 있다고 생각한다. 이 방법은 아는 사람이 봐도 헷갈릴 수도 잇을 것 같다.

'웹프로그래밍 > 스프링 MVC' 카테고리의 다른 글

60. PRG Post/Redirect/Get  (0) 2022.04.20
59. 상품 수정  (0) 2022.04.19
57. 상품 등록 폼  (0) 2022.04.18
56. 상품 상세  (0) 2022.04.18
55. 상품 목록 - 타임 리프  (0) 2022.04.16

+ Recent posts