스프링부트+jsp로 배달사이트 만들기-11 장바구니추가, 삭제

2021. 12. 7. 17:00스프링부트

장바구니에 저장할때 세션, 쿠키, db에 저장하는 방법들이 있지만 저는 세션에 저장하는 방법을 사용하겠습니다

 

Cart를 관리할 CartController와 dto를 생성합니다

@Controller
public class CartController {
	
	@ResponseBody
	@PostMapping("/addCart")
	public Cart addCart(Cart cart) {
		
		System.out.println(cart);

		return null;
	}

}

 

@Getter
@Setter
@ToString
public class Cart {
	private long foodId;
	private String foodName;
	private int foodPrice;
	private int amount;
	private int totalPrice;

	private String[] optionName;
	private int[] optionPrice;
	private long[] optionId;
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + Arrays.hashCode(optionId);
		result = prime * result + Arrays.hashCode(optionName);
		result = prime * result + Arrays.hashCode(optionPrice);
		result = prime * result + Objects.hash(foodId, foodName, foodPrice);
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Cart other = (Cart) obj;
		return foodId == other.foodId && Objects.equals(foodName, other.foodName) && foodPrice == other.foodPrice
				&& Arrays.equals(optionId, other.optionId) && Arrays.equals(optionName, other.optionName)
				&& Arrays.equals(optionPrice, other.optionPrice);
	}
}

장바구니에 이미 담겨 있는 상품과 추가로 담을 상품의 수량은 관계없이 이름, 옵션 등만 같아도 같은 음식으로 보기 위해  amount는 equlas와 hashcode를 오버라이딩하지 않았습니다

 

장바구니에 담기 버튼을 클릭하면 음식 정보와 추가옵션 정보를 받을 수 있습니다

 

이 넘어온 정보를 리스트로 담을 클래스를 추가합니다

CartList

@Getter
@Setter
@ToString
@AllArgsConstructor
public class CartList {
	private long storeId;
	private String storeName;
	int cartTotal;
	private int deleveryTip;
	
	List<Cart> cart;
}

장바구니 정보 이외에 주문 시에 필요한 가게id,이름, 장바구니 가격 총 합, 배달팁을 미리 추가했습니다

 

먼저 util패키지를 만들고 넘어온 음식 총합을 구할 FoodPriceCalc를 만듭니다

 

public class FoodPriceCalc {

	public static int foodPriceCalc(Cart cart) {
		int[] optionPrice = cart.getOptionPrice();
		
		int optionPriceTotal = 0;
		if(optionPrice != null) {
			for(int i=0;i<optionPrice.length;i++) {
				optionPriceTotal += optionPrice[i];
			}
		}
		
		int foodPrice = cart.getFoodPrice() * cart.getAmount();
		
		return foodPrice + (optionPriceTotal * cart.getAmount());
	}
}

(음식가격 + 음식가격) * 수량을 반환합니다

 

addCart를 수정합니다

@ResponseBody
	@PostMapping("/addCart")
	public CartList addCart(Cart cart, long storeId, String storeName, int deleveryTip, HttpSession session) {

		CartList cartList = (CartList) session.getAttribute("cartList");
		
		int totalPrice = FoodPriceCalc.foodPriceCalc(cart);
		
		System.out.println("카트 가격 계산 = " + totalPrice);
		
		if(cartList == null) {
			List<Cart> newCart = new ArrayList<>();
			cart.setTotalPrice(totalPrice);
			newCart.add(cart);
			cartList = new CartList(storeId, storeName, totalPrice, deleveryTip, newCart);
		} else {
			List<Cart> prevCart = cartList.getCart();
			int prevCartTotal = cartList.getCartTotal();
			cartList.setCartTotal(prevCartTotal + totalPrice);
		
			if(prevCart.contains(cart)) {
				int cartIndex = prevCart.indexOf(cart);
				int amount = cart.getAmount();
				
				Cart newCart = prevCart.get(cartIndex);
				int newAmount = newCart.getAmount() + amount;
				int newTotal = newCart.getTotalPrice() + totalPrice;
				
				newCart.setAmount(newAmount);
				newCart.setTotalPrice(newTotal);
				prevCart.set(cartIndex, newCart);
			} else {
				cart.setTotalPrice(totalPrice);
				prevCart.add(cart);
			}
		}
		
		session.setAttribute("cartList", cartList);
        
        System.out.println("cartList = " + cartList);

		return cartList;
	}

세션에 저장된 cartList를 불러오고

cartList가 null일 경우 새 cart를 만들어 세션에 저장합니다

 

null이 아닐경우 기존에 담긴 상품중 같은 상품이 있나 확인하고 있다면 수량만 증가시킵니다

장바구니담기 버튼을 누를때마다 상품이 담깁니다

 

 


가게에 처음 입장할 때 화면에 보여줄 cartList를 추가합니다

	@ResponseBody
	@GetMapping("/cartList")
	public CartList cartList(HttpSession session) {
		CartList cartList = (CartList) session.getAttribute("cartList");
		if (cartList != null) {
			return cartList;
		}
		return null;
	}

 

storeDetail.js의 다음부분을 주석해제 합니다

 

새로고침을 해도 장바구니가 유지됩니다

 

 

 


장바구니 메뉴 전체삭제와 1개 삭제 할 코드를 추가합니다

@ResponseBody
	@DeleteMapping("/cartAll")
	public void deleteAllCart(HttpSession session) {
		session.removeAttribute("cartList");
	}

	@ResponseBody
	@DeleteMapping("/cartOne")
	public CartList deleteOneCart(HttpSession session, int index) {
		CartList cartList = (CartList) session.getAttribute("cartList");
		if (cartList == null) {
			return null;
		}
		int cartTotal = cartList.getCartTotal();
		List<Cart> cart = cartList.getCart();
		int removeCartPrice = cart.get(index).getTotalPrice();
		
		cart.remove(index);
		
		if(cart.size() == 0) {
			session.removeAttribute("cartList");
			return null;
		}
		
		cartTotal -=  removeCartPrice;
		cartList.setCartTotal(cartTotal);
		return cartList;
	}