1 분 소요


상품 등록(java)

BasicItemController

@GetMapping("/add")
public String addForm() {
    return "basic/addForm";
}


상품 등록(html)

/resources/templates/basic/addForm.html

<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8">
    <link href="../css/bootstrap.min.css"
        th:href="@{/css/bootstrap.min.css}" rel="stylesheet">
</head>

body

<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>

<!-- 생략 -->
<button class="w-100 btn btn-primary btn-lg" type="submit">상품 등록</button>

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

속성 변경 - th:action

  • <form action="item.html" th:action method="post">
  • HTML form에서 th:action에 값이 없으면 현재 URL에 데이터를 전송한다.
  • 상품 등록 폼의 URL과 실제 상품 등록을 처리하는 URL을 똑같이 설정하고 HTTP 메서드로 기능을 구분한다.
    • 상품 등록 폼: GET /basic/items/add
    • 상품 등록 처리: POST /basic/items/add
  • 이렇게 하면 하나의 URL로 등록 폼과, 등록 처리를 깔끔하게 처리할 수 있다.


상품 등록 처리

@ModelAttribute
상품 등록 폼에서 전달된 데이터로 등록 처리.

등록 방식

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

addItemV1

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

addItemV2

ModelAttribute

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

@ModelAttribute의 기능

  • 요청 파라미터 처리
    • Item객체를 생성하고, 요청 파라미터의 값을 프로퍼티 접근법(setXxx)로 입력.
  • Model 추가
    • Model에 @ModelAttribute로 지정한 객체를 자동으로 넣어준다.
  • @ModelAttribute("hello") Item item -> 이름을 hello 로 지정
  • model.addAttribute("hello", item); -> 모델에 hello 이름으로 저장

addItemV3

ModelAttribute 이름 생략

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

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

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


<출처 : 인프런 - 스프링 MVC 1편 : 백엔드 웹 개발 핵심 기술(김영한)>

댓글남기기