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를 사용해 원하는 속성만 만들어 사용하는것이 훨씬 편할것임