Programing_Java

[Mid Project] Java Web Project에서 장바구니 기능 구현 및 개선 과정 본문

Projects

[Mid Project] Java Web Project에서 장바구니 기능 구현 및 개선 과정

Joyfullyever 2025. 3. 16. 22:42

➡️ Java/Servlet 기반의 웹 프로젝트에서 장바구니 기능을 구현하는 과정과 기능 개선을 위해 고민한 내용들 정리

➡️ Session을 활용한 장바구니 관리, 기존 상품 수량 증가 로직, 코드 최적화 과정의 내용

 

🔹 주요 기능

• 사용자가 선택한 상품을 장바구니에 추가

• 이미 담겨진 상품이면 수랑만 증가

• 새 상품이라면 장바구니에 상품 추가

• Session을 이용해 장바구니 데이터 유지

 

🔹 코드 구조 개요

• HttpSession에서 장바구니 리스트(ArrayList<Object>) 가져오기

• 상품 정보를 DAO에서 조회 한 후 DTO에 담기

• 장바구니에 동일한 상품이 담겨있는지 체크

• 있다면 수량만 증가, 없다면 장바구니에 추가

• request에 메세지를 전달 후 alert.jsp(알림창 출력 페이지)로 이동하여 결과 제공

 

1️⃣  중복 상품 처리 개선

: 기존 코드에서는 개별 상품과 조합 상품을 검사하는 코드가 중복되어 있었음

 

👉 공통 로직을 하나로 정리하고, 상품 타입에 따라 처리하도록 수정

boolean alreadyIn = false;
		
		for(Object cartProduct : shoppingCart) {
			if(cartProduct instanceof ProductSingleDTO && productSingleDTO != null) {
				ProductSingleDTO alreadyInProductSingle = (ProductSingleDTO) cartProduct;
				if(alreadyInProductSingle.getProduct_Single_Number() == productSingleDTO.getProduct_Single_Number()) {
					alreadyInProductSingle.setProduct_Single_Count(alreadyInProductSingle.getProduct_Single_Count() + 1);
					alreadyIn = true;
					
					request.setAttribute("msg", "장바구니에 이미 존재하는 상품으로 개수만 증가합니다!");  
		            request.setAttribute("flag", true);
		            request.setAttribute("url", "상품 상세정보 페이지.jsp?상품 번호=" + productSingleNumber);
					
					break;
				}
			}
			else if(cartProduct instanceof ProductComboDTO && productComboDTO != null) {
				ProductComboDTO alreadyInProductCombo = (ProductComboDTO) cartProduct;
				if(alreadyInProductCombo.getProduct_Combo_Number() == productComboDTO.getProduct_Combo_Number()) {
					alreadyInProductCombo.setProduct_Combo_Count(alreadyInProductCombo.getProduct_Combo_Count() + 1);
					alreadyIn = true;
					
					request.setAttribute("msg", "장바구니에 이미 존재하는 상품으로 개수만 증가합니다!");  
		            request.setAttribute("flag", true);
		            request.setAttribute("url", "상품 상세정보 페이지.jsp?상품 번호=" + productComboNumber);
					
					break;
				}
			}	
		}

✔️ 반복문 내에서 개별 상품과 조합 상품을 각각 비교

✔️ 중복된다면 수량만 증가시키고 반복문 탈출 → 불필요한 반복 최소화

 

2️⃣ Object와 instanceof를 활용하여 장바구니 상품 분류

: 장바구니에는 ProductSingleDTO와 ProductComboDTO가 함께 저장됨

: 다른 두 테이블에 있는 상품들을 한 장바구니에 담기 위해 ArrayList<Object>로 생성하여 상품을 꺼낼 때 어떤 타입인지 확인 후 처리를 해줘야 함

 

👉 instanceof 연산자를 활용하여 객체의 실제 타입을 검사하고 처리하는 로직을 구현

 

🔹 기존 코드

: 기존 코드에서는 Obejct 타입 리스트에서 상품을 꺼낸 뒤, instanceof 없이 캐스팅을 시도하여 ClassCastException 발생 위험이 있었음

for (Object cartProduct : shoppingCart) {
    ProductSingleDTO product = (ProductSingleDTO) cartProduct;
    if (product.getProduct_Single_Number() == productSingleDTO.getProduct_Single_Number()) {
        product.setProduct_Single_Count(product.getProduct_Single_Count() + 1);
    }
}

✔️ instanceof를 사용하여 올바른 타입인 경우에만 캐스팅을 수행

 

🔹 instanceof를 사용하여 수정한 코드

for(Object cartProduct : shoppingCart) {
			if(cartProduct instanceof ProductSingleDTO && productSingleDTO != null) {
				ProductSingleDTO alreadyInProductSingle = (ProductSingleDTO) cartProduct;
				if(alreadyInProductSingle.getProduct_Single_Number() == productSingleDTO.getProduct_Single_Number()) {
					alreadyInProductSingle.setProduct_Single_Count(alreadyInProductSingle.getProduct_Single_Count() + 1);
					alreadyIn = true;
					
					request.setAttribute("msg", "장바구니에 이미 존재하는 상품으로 개수만 증가합니다!");  
		            request.setAttribute("flag", true);
		            request.setAttribute("url", "상품 상세정보 페이지.jsp?상품 번호=" + productSingleNumber);
					
					break;
				}
			}
			else if(cartProduct instanceof ProductComboDTO && productComboDTO != null) {
				ProductComboDTO alreadyInProductCombo = (ProductComboDTO) cartProduct;
				if(alreadyInProductCombo.getProduct_Combo_Number() == productComboDTO.getProduct_Combo_Number()) {
					alreadyInProductCombo.setProduct_Combo_Count(alreadyInProductCombo.getProduct_Combo_Count() + 1);
					alreadyIn = true;
					
					request.setAttribute("msg", "장바구니에 이미 존재하는 상품으로 개수만 증가합니다!");  
		            request.setAttribute("flag", true);
		            request.setAttribute("url", "상품 상세정보 페이지.jsp?상품 번호=" + productComboNumber);
					
					break;
				}
			}	
		}

✔️ instanceof로 검사 후 ProductSingleDTO 또는 ProductComboDTO로 변환

✔️ 가독성 및 유지보수성 향상 → 각 타입에 맞게 유연한 처리가 가능