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
'Spring > Spring Boot' 카테고리의 다른 글
Spring : N+1 문제 해결 1편 - 즉시 로딩(Eager Loading)과 지연 로딩(Lazy Loading) (1) | 2024.09.09 |
---|---|
Spring : @Builder 사용 하여 객체의 정보를 수정할 때 값이..?? (0) | 2024.08.30 |
Spring : @Transactional 이란? (사용원리) (0) | 2024.08.29 |
Spring : 알림 기능 구현 (5) | 2024.08.28 |
Spring : 알림 기능 구현 종류 (0) | 2024.08.28 |