프로그래밍

[최종 프로젝트] 장바구니 모듈화 본문

프로젝트

[최종 프로젝트] 장바구니 모듈화

시케 2023. 9. 4. 22:05
728x90
반응형

장바구니 모듈화

프로젝트 구현 기능: 장바구니

  1. 장바구니 추가
  2. 장바구니 단건 삭제
  3. 장바구니 전체 비우기
  4. 장바구니 구매 수량 조절

직접 구현한 부분: 스프링 방식 이관 작업시 모듈화

 

 

기능 설명

4가지 기능에 겹치는 코드가 많아 모듈화를 진행
1. 장바구니에 해당 상품이 있는지 검사하고 있다면 해당 인덱스를 반환하는 메서드
2. 장바구니가 없다면(null이면) 바로 상품을 추가하고 없다면 1.의 모듈을 통해 검사 후
해당 상품이 이미 장바구니에 존재하면 재고를 더해주고 장바구니내에 같은 상품이 없다면 바로 추가하는 로직

이렇게 총 2가지를 모듈화

 

또한 장바구니에 상품을 추가할때 추가하고 싶은 만큼의 재고를 보유하고 있는지 검사를 해야하기 때문에
재고 검사 로직 또한 따로 클래스로 모듈화 진행

 

코드 구현

// 장바구니 같은 상품있는지 검사 ---> 단건 검사만
public static int cartCheck(TeaVO teaVO, ArrayList<TeaVO> cart) {
	int i = 0;
	for (TeaVO t : cart) {
		if (t.getTeaNum() == teaVO.getTeaNum()) {
			return i; // 같은 상품의 인덱스 번호 반환
		}
		i++;
	}
	System.out.println("Product cartCheck i: "+i);
	return -1; // 장바구니에 같은 상품 없을시 -1 반환
		
}

 

// 재고 검사
public static int checkCnt(TeaVO teaVO) {
	int cnt = teaVO.getTeaCnt(); // 변경할 것
	int checkCnt = teaVO.getTeaCheckCnt(); // 현재 보유하고 있는 재고
	
	// 보유 재고보다 많은 양을 요구할시
	if(cnt > checkCnt) {
		cnt = checkCnt;
	}
	
	// 음수로 변경 불가
	if(cnt < 0) {
		cnt = 0;
	}

	return cnt;
}

위의 모듈화 코드는 장바구니 상품 추가 로직에 사용

 

public static void cartInsert(TeaVO teaVO, HttpSession session) {

	ArrayList<TeaVO> cart = (ArrayList<TeaVO>) session.getAttribute("cart");

	System.out.println("로그 teaNum: [" + teaVO.getTeaNum() + "]");
	System.out.println("로그 teaCnt: [" + teaVO.getTeaCnt() + "]"); // 구매할 갯수

	int cnt = teaVO.getTeaCnt(); // 추가할 갯수

	int i = -2;
	if (cart != null) { // 카트에 이미 담긴 상품이 있을 경우
    
		i = cartCheck(teaVO, cart);
			
	} else { // 카트가 비어있을 경우
		System.out.println("로그 null cart" + teaVO.getImageUrl());
		cart = new ArrayList<TeaVO>();
		i = -1;
	}

		
	if (i == -1) { // 장바구니에 같은 상품 없음
		cnt = Product.checkCnt(teaVO);
		teaVO.setTeaCnt(cnt);
		cart.add(teaVO);
	}
	else { // 장바구니에 같은 상품 있음
		cnt = cart.get(i).getTeaCnt() + cnt;
		teaVO.setTeaCnt(cnt);
		cnt = Product.checkCnt(teaVO);
		cart.get(i).setTeaCnt(cnt);
	}

	session.setAttribute("cart", cart);

}

 

위의 모듈화 코드 활용하는 컨트롤러 코드

package com.varchar.view.controller;

@Controller
public class CartController {

	@Autowired
	private BuyDetailService buyDetailService;
	@Autowired
	private TeaService teaService;

	// --------------------------------- 장바구니 추가 ---------------------------------
	@RequestMapping(value = "/insertCart.do")
	public String insertCart(TeaVO teaVO, HttpSession session) {
		
		int cnt = teaVO.getTeaCnt();

		teaVO = teaService.selectOne(teaVO);
		int checkCnt = teaVO.getTeaCnt();
		
		teaVO.setTeaCnt(cnt);
		teaVO.setTeaCheckCnt(checkCnt);
		
		Product.cartInsert(teaVO, session);
		return "redirect:cartPage.do";
	}
}

 

문제해결

해당 기능 모듈화를 진행하며 가장 어려웠던 부분은
코드의 범위를 "어디서부터 어디까지 모듈화해야 하는지" 였다 
서비스류등의 행위를 컨트롤러가 아닌 일반 클래스에서 할 수 없다는 점을 고려하여 모듈화를 진행


또한 IoC(제어의 역행) 커맨드객체를 사용할때에 new와 set을 기존의 컨트롤러에서 진행해야
싱글톤 패턴을 유지할 수 있기 때문에 모듈화된 클래스내에서 사용할 객체를
컨트롤러에서 생성하여 전달하는 방식으로 구현해야 한다는 부분을 고려

728x90
반응형
Comments