Programing_Java
[Mid Project] Java Web Project에서 장바구니 기능 구현 및 개선 과정 본문
➡️ 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로 변환
✔️ 가독성 및 유지보수성 향상 → 각 타입에 맞게 유연한 처리가 가능
'Projects' 카테고리의 다른 글
[Mid Project] 회원 마이 페이지 구현: 개인 정보, 주문 내역, 게시판 활동 조회 기능 구현하기 (0) | 2025.03.18 |
---|---|
[Mid Project] 효율적인 상품 상세 페이지 구현: 코드 리팩토링을 통한 유지보수성과 성능 개선 (0) | 2025.03.17 |
Project#10 _ OTT Program (마무리 단계) (0) | 2025.02.06 |
Project#9 _ OTT Program (유효성 검사 / 예외 처리) (0) | 2025.02.04 |
Project#8 _ Client Menu에 광고 출력하기 (0) | 2025.02.04 |