컨트롤러 - 상품 등록 [BasicItemController] 에 추가 

 

  • 상품 등록 페이지를 열때는 GET (실제 등록 X)
//상품 등록 
@GetMapping("/add")
public String addForm(){
    return "basic/addForm";
}

 

  • 상품을 실제로 등록할 때는 POST
@PostMapping("/add")
public String save(){
    return "basic/addForm";
}

 

 

같은 URL인데 HTTP 메서드로 기능을 구별해준다. 

 

 

 

 

뷰 템플릿 [addForm.html]

/resources/templates/basic/addForm.html

 

  • 타임리프 설정
<html xmlns:th="http://www.thymeleaf.org">
<link th:href="@{/css/bootstrap.min.css}"
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8">
    <link th:href="@{/css/bootstrap.min.css}"
            href="../css/bootstrap.min.css" rel="stylesheet">
    <style>
        .container {
        max-width: 560px;
        }
    </style>
</head>
<body>
<div class="container">
    <div class="py-5 text-center">
        <h2>상품 등록 폼</h2>
    </div>
    <h4 class="mb-3">상품 입력</h4>
    <form action="item.html" th:action method="post">
        <div>
            <label for="itemName">상품명</label>
            <input type="text" id="itemName" name="itemName" class="form-control" placeholder="이름을 입력하세요">
        </div>
        <div>
            <label for="price">가격</label>
            <input type="text" id="price" name="price" class="form-control"
                   placeholder="가격을 입력하세요">
        </div>
        <div>
            <label for="quantity">수량</label>
            <input type="text" id="quantity" name="quantity" class="form-control" placeholder="수량을 입력하세요">
        </div>
        <hr class="my-4">
        <div class="row">
            <div class="col">
                <button class="w-100 btn btn-primary btn-lg" type="submit">상품 등
                    록</button>
            </div>
            <div class="col">
                <button class="w-100 btn btn-secondary btn-lg"
                        onclick="location.href='items.html'"
                        th:onclick="|location.href='@{/basic/items}'|"
                        type="button">취소</button>
            </div>
        </div>
    </form>
</div> <!-- /container -->
</body>
</html>

 

 

 

 

타임리프 속성

th:action

 

상품 등록 버튼을 눌렀을때 동적으로 URL이 변경되도록 하는 액션속성

 

  • 사실상 GET, POST 같은 URL (basic/items/add) 이기 때문에 안 써도 된다.
    • th:action="/basic/items/add"  ▶ <form action="item.html" th:action method="post">
  • 등록 페이지에 갔을때 '페이지 소스보기' 를 하면 action="" 비어있는 것을 확인할 수 있다. 

 

 

 

 

 

취소 버튼 눌렀을때 url 수정하기 

취소했을때는 목록으로 돌아가기 

th:onclick="|location.href='@{/basic/items}'|"
<button class="w-100 btn btn-secondary btn-lg"
        onclick="location.href='items.html'"
        th:onclick="|location.href='@{/basic/items}'|"
        type="button">취소
</button>

 

 

 


 

이제 실제로 상품을 등록해보자 

 

 

상품 등록 POST - @ModelAttribute

 

우선 @ModelAttribute 와 @RequestParam 차이점을 알아보자

 

 

@RequestParam

@RequestParam - 상품 등록 처리

 

클라이언트의 HTTP POST 요청파라미터를 처리하기 위해 @RequestParam 을 사용한다 

 

[addItemV1 - BasicItemController에 추가]

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

 

 

@RequestParam String itemName 은 addForm.html 의 name="" 값이다. 

  • <input type="text" id="itemName" name="itemName" ~ >

 

 

 

실제 상품을 등록한 뷰 화면

 

 

 

@ModelAttribute 

@ModelAttribute - 상품 등록 처리

 

[addItemV2 - BasicItemController에 추가]

@PostMapping("/add")
public String addItemV2(@ModelAttribute("item") Item item ) {
	
	itemRepository.save(item);
	//model.addAttribute("item",item);
    
	return "basic/item";
}
  • @ModelAttribute - 요청 파라미터 처리를 해준다. 
    • Item 객체를 생성하고 요청 파라미터 값을 setXxxx 으로 Item 객체의 필드에 값을 설정해준다.
    •  Spring이 자동으로 처리해줌 개발자가 직접 setXxxx 메서드를 호출할 필요가 없어진다. 
    • Item item = new Item();
      item.setItemName(itemName);
      item.setPrice(price);
      item.setQuantity(quantity);
  • @ModelAttribute 은 자동으로 model에 뷰를 넣어준다.
    • @ModelAttribute("item") 이름이 ▶ model.addAttribute("item", item) 이다. 
    • model.addAttribute("item", item) 가 주석처리를 해도 잘 동작한다. 

 

 

 

ModelAttribute 이름 생략

 

[addItemV3 - BasicItemController에 추가]

@PostMapping("/add")
public String addItemV3(@ModelAttribute Item item) {
	
	itemRepository.save(item);
	//model.addAttribute("item",item);
    
	return "basic/item";
}
  • @ModelAttribute("item") Item item 이름을 생략하면 클래스의 첫글자만 소문자로 변경해서 등록한다. 
  • 클래스명 Item item

 

 

 

ModelAttribute 전체 생략

 

[addItemV4 - BasicItemController에 추가]

@PostMapping("/add")
public String addItemV4(Item item) {
	
	itemRepository.save(item);
    
	return "basic/item";
}
  •  addItemV1 처럼 단순타입인 String이라면 @RequestParam 이 자동적용되고 
  • 객체 타입인 경우 @ ModelAttribute가 자동적용이 된다. 
  • 이것 또한 클래스명 Item  item 소문자로 변경해서 모델에 담긴다. 

 

 

 

반응형
LIST

+ Recent posts