Spring
parameter값 or logic대신 Dto객체 사용
동곤일상
2025. 6. 22. 19:26
반응형
제목으로 제대로 감이 안 올수있다
코드를 조금씩 떼와서 설명을 하겠음
detail.jsp의 일부다
<form:form modelAttribute="ItemAddDto" action="/cart/cartAdd" class="mt-4">
<input type="hidden" name="id" value="${item.id}">
<div class="row g-2 align-items-center">
<div class="col-auto">
<label for="quantity" class="form-label">수량:</label>
<select name="quantity" id="quantity" class="form-select">
<c:forEach begin="1" end="10" var="i">
<option value="${i}">${i}</option>
</c:forEach>
</select>
</div>
<div class="col-auto">
<button type="submit" class="btn btn-cart text-white">장바구니</button>
</div>
<div class="col-auto">
<a href="list" class="btn btn-secondary">상품목록</a>
</div>
</div>
</form:form>
사실상 폼에 넘어가는 값은 id와 quantity밖에 존재하지않음
여기서 logic/Item객체에 속성은 6개가 넘는다
2개밖에필요없는데 굳이 item객체를 써야할까??
아니면 id와 quantity를 따로따로 파라미터로 받아야할까??
다 틀린건 아니지만 더 효율적이고 직관적인 표현은
필요한속성만 만들어 사용하는 dto를 쓰는거다
기존Item객체(quantity속성은 존재하지도않음)
package kr.gdu.logic;
@Data //getter,setter,toString, EqualsAndHash
public class Item {
private int id;
private String name;
private String description;
private String pictureUrl;
private MultipartFile picture;
}
ItemAddDto객체 (ItemAdd시에만 사용하는 객체)
package kr.gdu.dto.item;
@ToString
@Getter
@Setter
public class ItemAddDto {
private int id;
private int quantity;
}
다음과같이 필요한속성만 만들어서 사용해주는게 간편하고좋다
cartController의 cartAdd메서드 ( 파라미터갑을 받아와서 사용할떄의 모습 + modelAndView방식)
@PostMapping("cartAdd")
public ModelAndView add(Integer id, Integer quantity, HttpSession session) {
// new ModelAndView(뷰명) : /WEB-INF/view/cart/cart.jsp
ModelAndView mav = new ModelAndView("cart/cart");
Item item = service.getItem(id);
Cart cart = (Cart) session.getAttribute("CART");
if (cart == null) {
cart = new Cart();
session.setAttribute("CART", cart);
}
cart.push(new ItemSet(item, quantity));
mav.addObject("message", item.getName() + ":" + quantity + "개 장바구니 추가");
mav.addObject("cart", cart);
System.out.println(cart);
return mav;
}
변경된 모습(ItemAddDto사용 (add시에만사용)+String반환방식 + Model사용)
@PostMapping("cartAdd")
//id와 quantity파라미터를 따로 가져오기보다는 modelAttribute를 활용해 dto객체에 담아서가져오자
public String add(ItemAddDto dto, HttpSession session,Model model) {
int id = dto.getId();
int quantity = dto.getQuantity();
Item item = service.getItem(id);
Cart cart = (Cart) session.getAttribute("CART");
if (cart == null) {
cart = new Cart();
session.setAttribute("CART", cart);
}
cart.push(new ItemSet(item, quantity));
model.addAttribute("message", item.getName() + ":" + quantity + "개 장바구니 추가");
model.addAttribute("cart", cart);
System.out.println(cart);
return "cart/cart"; // /WEB-INF/views/cart/cart.jsp뷰로이동
}
String반환방식으로 뷰를 찾아갈수있다 (직관성 ↑ )
model에 객체를 넣어 넘겨준다면 cart에 request영역의 속성으로넘어갈것임
로직에맞게 dto명을 설정해 진행되므로 코드를 더쉽게알아볼수있음
지금은 id와quantity 2개의속성뿐이라서 와닿지않을 수 있다
실제 실무코드가 이렇게간단하게 속성2개로 로직을 만들꺼란 생각은 버리자
dto를 사용해 원하는 속성만 만들어 사용하는것이 훨씬 편할것임