-
[김영한 스프링] 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
'Spring > 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술' 카테고리의 다른 글
[김영한 스프링] 34. 스프링 MVC 웹 페이지 만들기 - PRG Post/Redirect/Get (0) 2023.07.24 [김영한 스프링] 32. 스프링 MVC 웹 페이지 만들기 - 상품 상세 & 상품 등록 폼 (0) 2023.07.24 [김영한 스프링] 31. 스프링 MVC 웹 페이지 만들기 - 상품 목록 타임리프 (0) 2023.07.23 [김영한 스프링] 30. 스프링 MVC 웹 페이지 만들기 - 상품 서비스 HTML (0) 2023.07.20 [김영한 스프링] 29. 스프링 MVC 웹 페이지 만들기 - 상품 도메인 개발 (0) 2023.07.19 - POST - HTML Form