728x90

개요

스프링 어노테이션에 대해서 정리할려고 한다.

 

@ModelAttribute

  • 개발을 하면 요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣어주어야 한다.
  • 스프링에서는 위 과정을 자동화해주는 @ModelAttribute 기능을 제공한다.
  • 먼저, 요청 파라미터를 바인딩받을 객체를 만든다.

Item 객체

package hello.itemservice.domain.item;
import lombok.Data;
@Data
public class Item {
    private Long Id;
    private String itemName;
    private Integer price;
    private Integer quantity;

    public Item() {
    }

    public Item(String itemName, Integer price, Integer quantity) {
        this.itemName = itemName;
        this.price = price;
        this.quantity = quantity;
    }
} 
  • @Data : @Getter , @Setter , @ToString , @EqualsAndHashCode , @RequiredArgsConstructor를 자동으로 적용해준다.
  • 하지만 개인 프로젝트에서만 사용하고 실제 협업에서는 사용하지 말자.

 

View 의 일부분

  • th:action="@{/basic/items/add}":
    - 버튼 sumbit 이 발생하면 해당 컨트롤러를 호출해준다.
  • input 의 이름들은 각각 itemName, price, quantity 로 위에 작성한 Item 객체의 필드 네임과 일치한다.
    <form action="item.html" th:action="@{/basic/items/add}" 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>
    </form>

 

@RequestParam 과 @ModelAttribute

  • Request 에서 ModelAttribute 로 적용해보는 과정을 정리해본다.

 

 

@RequestParam 으로 요청 파라미터 가져오기

  • form 에 input으로 정의된 데이터들을 가져온다
    @PostMapping("/add")
    public String addItemV1(@RequestParam String itemName ,
                      		@RequestParam int price,
                       		@RequestParam int 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";
    }
  • ModelAttribute를 사용하지 않는 경우 다음과 같은 과정을 통해 코드를 작성해야 한다.
  • @RequestParam을 통해 요청 파라미터를 받는다.
  • 만약 가져와야 하는 데이터가 많다면 코드가 너무 길어질 것이다.

 

 @ModelAttribute 적용1

  • 각각 RequestParam 으로 받았던 데이터를 객체로 받을수 있다.
  • 객체의 필드이름과 form 의 input 타입의 이름만 같으면 된다.
    @PostMapping("/add")
    public String addItemV2(@ModelAttribute("item") Item item) {
        itemRepository.save(item);
        return "basic/item";
    }

 

 @ModelAttribute 적용2

  • ModelAttribute 의 name을 생략할수있다.
    @PostMapping("/add")
    public String addItemV3(@ModelAttribute Item item) {
        itemRepository.save(item);
        return "basic/item";
    }

 

 @ModelAttribute 적용3

  • 아예 ModelAttribute  자체도 생략이 가능하다.
   @PostMapping("/add")
    // 아예 생략도 가능하다.
    public String addItemV4(Item item) {
        itemRepository.save(item);
        return "basic/item";
    }
 

 

 

주의할 점

  • @RequestParam도 생략할 수 있어 혼란이 발생할 수 있다.
  • 스프링에서는 이러한 혼란을 방지하기 위해 다음과 같은 규칙을 적용하고 있다.
  • String, int, Integer와 같은 단순 타입의 경우 : @RequestParam
  • argument resolver로 지정해둔 타입 외의 나머지 : @ModelAttribute
728x90

+ Recent posts