IT/디버깅

스프링 @ModelAttribute 데이터 매핑안됨

happy_life 2022. 7. 29. 21:52

스프링 @ModelAttribute 데이터 매핑안됨

 

문제상황

 

데이터에 값을 넣었는데, 품목, 가격 수량의 데이터는 들어가지 않는다는 문제가 발생하였다.

 

코드

@PostMapping("/add")
public String addItem(@ModelAttribute Book book, RedirectAttributes redirectAttributes) {
    Book savedItem = (Book) itemRepository.save(book);
    redirectAttributes.addAttribute("itemId", savedItem.getId());
    redirectAttributes.addAttribute("status", true);
    log.info("savedItem.quantity={}",savedItem.getQuantity());
    log.info("savedItem.price={}",savedItem.getPrice());
    return "redirect:/basic/items/{itemId}";
}

 

의문점

@PostMapping("/add")
public String addItem(@RequestParam("itemName") String itemName,
                      @RequestParam("itemPrice") Integer itemPrice,
                      @RequestParam("itemQuantity") Integer itemQuantity,
                      RedirectAttributes redirectAttributes) {

    Book book = new Book(itemName, itemPrice, itemQuantity, ItemName.BOOK);
    Item savedItem = itemRepository.save(book);

    redirectAttributes.addAttribute("itemId", savedItem.getId());
    redirectAttributes.addAttribute("status", true);

    return "redirect:/basic/items/{itemId}";
}

위와 같은 @RequestParam을 사용하는 것은 잘 동작하는데.. 왜 @ModelAttribute는 동작하지 않는가?

 

해결

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8">
    <link th:href="@{/css/bootstrap.css}"
          href="../css/bootstrap.css" rel="stylesheet">
</head>
<body>
<!--상부 컨테이너-->
<div class="container" style="max-width: 600px">
    <div class="py-3 bg-primary text-center text-white">
        <h2>Steady Kim Shop</h2>
    </div>

    <div class="py-2 text-center">
        <h3>상품 등록 </h3>
    </div>

    <!-- 상품 상세 내용-->
    <div class="text-center">
        <h5 class="mb-3">상품 입력</h5>
        <form th:action method="post">
            <div class="my-3">
                <label form="itemName">상품명</label>
                <input type="text" id="itemName" name="itemName" placeholder="이름을 입력하세요">
            </div>
            <div class="my-3">
                <label form="price">가격</label>
                <input type="text" id="price" name="price" placeholder="가격을 입력하세요">
            </div>
            <div class="my-3">
                <label form="quantity">수량</label>
                <input type="text" id="quantity" name="quantity" placeholder="수량을 입력하세요">
            </div>

            <hr class="my-4">
            <div class="row">
                <div class="col text-center">
                    <button class="w-50 btn btn-primary btn-lg"
                            th:onclick="|location.href='@{/basic/items/add)}'|"
                            type="submit">상품 등록</button>
                </div>
                <div class="col text-center">
                    <button class="w-50 btn btn-secondary btn-lg"
                            th:onclick="|location.href='@{/basic/items}'|"
                            type="button">취소</button>
                </div>
            </div>
        </form>
    </div>
</div> <!--/container -->
</body>
</html>

 

label이름과  도메인의 필드가 같아야한다. ItemPrice라고 써놨었음 처음엔