ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [김영한 스프링] 33. 스프링 MVC 웹 페이지 만들기 - 상품 등록 처리 & 상품 수정
    Spring/스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 2023. 7. 24. 03:02

    상품 등록 처리 - @ModelAttribut

     

    상품 등록 폼은 다음 방식으로 서버에 데이터를 전달한다.

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

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

     

     

    상품 등록 처리 - @RequestParam

    addItemV1 - BasicItemController에 추가

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

    • 먼저 @RequestParam String itemName : itemName 요청 파라미터 데이터를 해당 변수에 받는다.
    • Item 객체를 생성하고 itemRepository를 통해서 저장한다.
    • 저장된 item을 모델에 담아서 뷰에 전달한다.

     

    중요 : 여기서는 상품 상세에서 사용한 item.html 뷰 템플릿을 그대로 재활용한다

     

     

     

     

    상품 등록 처리 - @ModelAttribute

    addItemV2 - 상품 등록 처리 - ModelAttribute

    //    @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";
        }
    
        @PostMapping("/add")
        public String addItemV2(@ModelAttribute("item") Item item) {
    
            itemRepository.save(item);
    
    //        model.addAttribute("item", item); // 자동 추가, 생략 가능
    
            return "basic/item";
        }

    기존 save를 addItemV1으로 변경, @PostMapping 주석처리

     

    @ModelAttribute가 set을 알아서 해줌

     

    @ModelAttribute - 요청 파라미터 처리

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

     

    @ModelAttribute - Model 추가

    @ModelAttribute는 중요한 한가지 기능이 더 있는데, 바로 모델(Model)에 @ModelAttribute로 지정한 객체를 자동으로 넣어준다. 지금 코드를 보면 model.addAttribute("item", item)가 주석처리 되어 있어도 잘 동작하는 것을 확인할 수 있다.

     

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

     

    @ModelAttribute("hello") Item item -> 이름을 hello로 지정

    model.addAttribute("hello", item); -> 모델에 hello 이름으로 저장

     

    주의

    실행전에 이전 버전인 addItemV1에 @PostMapping("/add")를 꼭 주석처리 해주어야 한다. 그렇지 않으면 중복 매핑으로 오류가 발생한다.

     

     

     

     

    addItemV3 - 상품 등록 처리 - ModelAttribute 이름 생략

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

    @ModelAttribute의 이름을 생략할 수 있다.

     

    주의

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

    • 예) @ModelAttribute 클래스명 모델에 자동 추가되는 이름
    • Item -> item
    • HelloWorld -> helloWorld

     

     

     

     

    addItemV4 - 상품 등록 처리 - ModelAttribute 전체 생략

    @ModelAttribute 자체도 생략가능하다. 대상 객체는 모델에 자동 등록된다. 나머지 사항은 기존과 동일하다.

     

    주의

    클래스의 첫글자만 소문자로 변경해서 등록한다.

    • Item -> item
    • HelloWorld -> helloWorld

     

     

     

     

    상품 수정

     

    상품 수정 폼 컨트롤러

    BasicItemController에 추가

     

        @GetMapping("/{itemId}/edit")
        public String editForm(@PathVariable Long itemId, Model model) {
            Item item = itemRepository.findById(itemId);
            model.addAttribute("item", item);
    
            return "basic/editForm";
        }

     

     

    상품 수정 폼 뷰

    resources/static/html/editForm.html을 resources/templates/basic로 복붙

     

     

    </html xmlns:th="http://www.thymeleaf.org">

     

    th:href="@{/css/bootstrap.min.css}"

     

     

     

     

    th:action

    th:value="${item.id}"

    th:value="${item.itemName}"

    th:value="${item.price}"

    th:value="${item.quantity}"

     

     

    get과 post로 구분

     

     

    th:onclick="|location.href='@{/basic/items/{itemId}(itemId=${item.id})}'|"

     

     

    상품 수정 개발

    상품 수정은 상품 등록과 전체 프로세스가 유사하다.

    • GET /items/{itemId}/edit : 상품 수정 폼
    • POST /items/{itemId}/edit : 상품 수정 처리

     

    리다이렉트

    상품 수정은 마지막에 뷰 템플릿을 호출하는 대신에 상품 상세 화면으로 이동하도록 리다이렉트를 호출한다.

    • 스프링은 redirect:/...으로 편리하게 리다이렉트를 지원한다.
    • redirect:/basic/items/{itemId}
      • 컨트롤러에 매핑된 @PathVariable의 값은 redirect에도 사용 할 수 있다.
      • redirect:/basic/items/{itemId} {itemId}는 @PathVariable Long itemId의 값을 그대로 사용한다.

     

    참고
    HTML Form 전송은 PUT, PATCH를 지원하지 않는다. GET, POST만 사용할 수 있다.
    PUT, PATCH는 HTTP API 전송시에 사용
    스프링에서 HTTP POST로 Form 요청할 때 히든 필드를 통해서 PUT, PATCH 매핑을 사용하는 방법이 있지만, HTTP 요청상 POST 요청이다.

     

     

     

     

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

     

    스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

    웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원

    www.inflearn.com

Designed by Tistory.