코딩항해기

[Team] 쇼핑몰 프로그램 만들기 본문

Project

[Team] 쇼핑몰 프로그램 만들기

miniBcake 2024. 7. 24. 16:43

 

 

쇼핑몰 프로그램 만들기

java / Eclipse

5인참여 (팀명 : 삼부삼조)

24/07/19 ~ 24/07/24

 

MVC 패턴 연습을 위한 팀 프로젝트를 진행하였다.

 

 

[요구사항]

  1. 쇼핑몰 프로그램을 MVC 패턴으로 구현해주세요!
  2. 회원 속성 : 아이디(PK),비밀번호
  3. 상품 속성 : 품번(PK),품명,가격,재고
  4. "로그인한" 회원만 장바구니를 사용할수있습니다.
  5. 회원이 로그아웃을 하면 장바구니는 사라집니다.
  6. 요구기능 목록
    1. 회원가입
    2. 로그인
    3. 로그아웃
    4. 상품 목록 출력 : 재고가 없는 상품에 대해서 [품절] 표시하기
    5. 장바구니에 상품담기
    6. 장바구니에 담긴 상품 목록 출력
    7. 장바구니에 담긴 상품 목록 구매
    8. 장바구니에서 상품 빼기

 

[프로젝트 개요]

 

 

[전체 설계 (MVC 분배) ]

더보기

 

프로그램 관련

메뉴화면

  1. 프로그램 종료 (종료 안내 후 종료됨)
  2. 상품목록보기 (번호 | 상품 이름 | 가격 | 재고 ((품절포함)보여주기)
    1. (로그인상태일때) 상품 장바구니에 담기
      1. (번호선택하여 품절아니면) 장바구니에 담고 안내메세지 / 장바구니를 보여주지는 않는다)

로그아웃 상태일때

  1. 로그인 (아이디 비밀번호 입력받고 안내)
  2. 회원가입 (아이디 비밀번호 입력받고 중복된 아이디라면 불가, 아니라면 가입성공)

로그인 상태일때

  1. 장바구니
    (전체출력(없으면 없다고 출력(C), 전체가격) + 장바구니 관련 메뉴 출력 / 하위기능 끝나면 장바구니로)
    1. 장바구니 나가기
      (0번 : 메뉴로 돌아가기 )
    2. 물건 담기
      (담을 수 있는 물건 출력 후 1개 골라서 장바구니에 추가 동일 상품이 있으면 카운트가 올라가고)
    3. 물건 빼기
      (장바구니에 있는 물건 중 선택한 물건을 1개씩 빠짐)
    4. 물건 구매
      (가격 안내 + 구매하시겠습니까?)
      (있는 물건 전체 구매 , 재고보다 구매량이 많은 상품이 있으면 (무슨 상품이 재고부족) 불가함을 안내)
  2. 로그아웃 (로그아웃 안내 후 로그아웃)

 

기능별 MVC 파트

 

통합(View) : 실패 printFalse() : 실패화면은 통일함(관리자에게 문의)

 

회원가입

  • M : create 회원추가
  • V : 아이디 입력 / 비밀번호 입력 / 성공
  • C : 로그인확인 / 아이디 중복 검사 / PK값 전달

로그인

  • M : selectOne(로그인객체반환)
  • V : 아이디 입력, 비밀번호 입력 / 성공
  • C : 로그인확인 / 세션에 로그인정보저장

로그아웃

  • M : X
  • V : 로그아웃성공.
  • C : 로그인확인 / 장바구니 비우기 / 세션비우기(로그아웃)

상품 목록 출력 : 재고가 없는 상품에 대해서 [품절] 표시하기

  • M : 전체목록(selectAll)
  • V : 전체목록을 출력하며 재고가 있다면 재고량을 아니라면 품절로 표시 / 담을 상품번호입력 / 성공
  • C : M에게 목록받아 V전달 / (로그인상태라면) 장바구니에담기 띄워주기 / 장바구니에 추가

장바구니에 상품담기

  • M : 재고가 있는 상품 전체목록전달 (재고 0이 아닌 것만)
  • V : 목록출력 / 장바구니에 상품 번호 입력받기 / 성공
  • C : 로그인확인 / 장바구니에 상품저장

장바구니에 담긴 상품 목록 출력

  • M : X
  • V : 장바구니 상품 출력 / 장바구니가 비었는지 아닌지 구분하여 출력
  • C : 로그인확인 / 장바구니 V에 전달

장바구니에 담긴 상품 목록 구매

  • M : 전달받은상품들 재고 - N
  • V : 장바구니 상품 출력 / 구매확인(진짜살거임?) / 성공
  • C : 로그인확인 / 장바구니 비어있는지 확인 / 장바구니 상품 M에 전달

장바구니에서 상품 빼기

  • M : X
  • V : 장바구니 상품 출력 / 뺄 상품 입력받기 / 성공
  • C : 로그인확인 / 장바구니 비어있는지 확인 / 장바구니에서 입력받은 상품 삭제

 

[변수명, 메서드 시그니처, 샘플 값 설정]

더보기

MemberDTO

접근제어자 자료형 변수명 설명  비고
private String mid 회원 아이디 PK
private String password 회원 비밀번호  
private String condition 개발자용  

 

ProductDTO

접근제어자 자료형 변수명 설명 비고
private int productId 상품 번호 PK
private String productName 상품 이름  
private int productPrice 상품 가격  
private int productInventory 상품 재고  
private String condition 개발자용  

 

Sample Data

productId(PK)  productName productPrice productInventory
1001 수박 13,990 4
1002 딸기(300g) 14,900 0
1003 바나나(1kg) 4,150 5
1004 참외(1.5kg) 8,990 2
1005 블루베리(200g) 5,660 1

 

메서드 시그니처 통일 (V)

기능 class output 메서드명 input
실패 (전체 통일) mainView void printFalse  
메인 메뉴 출력 mainView void printMainMenuList  
로그아웃 용 메뉴 logoutView void printLogoutMenuList  
로그인 용 메뉴 loginView void printLoginMenuList  
메인 메뉴 입력 mainView int insertMainMenu MemberDTO 
프로그램 종료 안내 mainView void end  
상품목록 전체 보여주기 mainView void printProductList ArrayList<ProductDTO>
상품목록에서 장바구니 담기 loginView int addToCart ArrayList<ProductDTO>
품절상품 안내 loginView void printFalseNull  
장바구니 담김 성공 loginView void printTrueCart  
로그인 입력 (아이디/비밀번호) logoutView MemberDTO inputLogin  
로그인 성공 logoutView void printTrueLogin  
회원가입 입력 (아이디) logoutView String inputMid  
회원가입 아이디 중복 logoutView void printFalseSign  
회원가입 입력 (비밀번호) logoutView String inputPassword  
회원가입 성공 logoutView void printTrueSign  
장바구니 담긴 상품 출력 loginView void printCart ArrayList<ProductDTO>
장바구니 메뉴 출력 loginView void printCartMenu  
장바구니 메뉴 입력 loginView int inputICartMenu  
장바구니가 비어있음 loginView void printCartEmpty  
가격안내+구매확인하기 loginView boolean isBuyCart ArrayList<ProductDTO>
구매 성공 loginView void printTrueBuy  
구매 취소 loginView void printCancelBuy  
로그아웃 성공 loginView void printTrueLogout  
장바구니 빼기 loginView void printMinusCart  
로그인 실패 logoutView void printFalseLogin  

 

 

[파트분배]

전체 파트 분배

M AAA(팀장), BBB
V CCC
C DDD, miniBcake

 

Controller 파트 분배

장바구니 기능을 제외한 파트 DDD
장바구니 + 상품목록 a miniBcake

 

[Controller 장바구니 기능 세부 설계]

더보기
  • 상품목록보기에서 장바구니 담기
    1. 만약 현재 로그인 상태라면.
      1. 맞다면,
        1. V로부터 번호 입력값 받아오기
          1. 정상적이고 재고가 있는 값이면
            1. 입력받은 값 장바구니에 추가하기
              1. 만약 이미 담긴 물건이라면 카운트 +N
          2. 그 외의 값이라면,
            1. V로 실패 안내
      2. 아니라면 아무것도 하지 않음
  • 장바구니 메뉴
    1. 메뉴에서 4번 장바구니를 입력받으면,
      1. 로그인 상태인지 확인하기
      2. 장바구니 목록을 V에게 전달해 출력
      3. V로 장바구니 메뉴 안내
      4. V로 장바구니 메뉴 입력받기
        1. 1번 (물건담기) 라면
          1. 로그인 상태 확인하기
          2. M에서 재고가 0이 아닌 상품리스트 받아오기
          3. V에게 출력 시키기
          4. V로 물건 번호 입력받기
          5. 입력받은 값 장바구니에 추가하기
            1. 만약 이미 담긴 물건이라면 카운트 +1
          6. 장바구니로 돌아가기
        2. 2번 (물건 빼기)라면
          1. 로그인상태 확인하기
          2. 장바구니가 비어있는지 확인하기
            1. 비어있다면
              1. 비어있다고 안내 후 장바구니 메뉴로 돌아가기
          3. V로 입력받기
          4. 입력받은 물건을 장바구니에서 카운트 -1
            1. 카운트가 0이라면 장바구니에서 삭제하기
          5. 장바구니로 돌아가기
        3. 3번 (물건 구매)라면
          1. 로그인상태 확인하기
          2. 장바구니가 비어있는지 확인하기
            1. 비어있다면
              1. 비어있다고 안내 후 장바구니 메뉴로 돌아가기
          3. V에게 장바구니 전달하며 구매확인 출력요청하기
          4. 구매한다면
            1. M에게 장바구니를 순회하며 장바구니 객체(PK, cnt)전달
            2. V로 구매 성공실패 안내
          5. 상위메뉴로 돌아가기 (구매 실패라면 장바구니메뉴로)

 

한글코딩

 

상품 목력보기에서 장바구니 담기

//상품목록에서 장바구니 담기 - 지윤 start
if(만약 현재로그인 상태라면){
		int 입력값(==PK) = view.번호 입력값 받아오기();

			boolean flag = false;
			int 입력값2 = hasCartProduct(입력값);
			if(입력값2 < 0){
				flag = addCart(입력값);
			}
			else{
				flag = addCartCount(입력값2);
			}
			if(flag){ //상품추가 성공
				view.장바구니에 물건이 담김();
			}
			else{
				view.실패();			
			}
}
//상품목록에서 장바구니 담기 - 지윤 end

 

장바구니 메뉴

//장바구니 메뉴 - 지윤 start
//메뉴에서 4번(장바구니)를 입력받으면
	//비 정상적인 값 확인 절차
	if(로그인상태가 아니라면();){
		//log : [Cart Menu] wrong approach - state : + user
		continue;
	}
	while(true){
		//장바구니 출력
		view.장바구니 출력();
		
		//장바구니 하위 메뉴
		view.장바구니 메뉴 출력();
		int 입력값 = view.장바구니 입력받기();
		
		if(입력값이 0이라면){
			//장바구니 나가서 상위 메뉴로 돌아가기
			break;
		}
		else if(입력값이 1이라면){
			//로그인확인
			if(로그인상태가 아니라면){
				//log : [Cart Menu - 1] wrong approach - state : + user
				continue;
			}
			
			//상품출력 입력
			새 상품 객체;
			상품.setCondition :  INSTOCK_PRODUCTS
			ArrayList<ProductDTO> 입력값 = model.재고가있는 상품 받아오기(상품객체);
			view.상품목록출력(입력값);
			int 입력값(==PK) = view.상품입력값();
			
			boolean flag = false;
			int 입력값2 = hasCartProduct(입력값);
			if(입력값2 < 0){
				flag = addCart(입력값);
			}
			else{
				flag = addCartCount(입력값2);
			}
			if(flag){ //상품추가 성공
				view.장바구니에 물건이 담김();
				break;
			}
			view.실패();
		}//1
		else if(입력값이 2이라면){
			if(로그인상태가 아니라면){
				//log : [Cart Menu - 2] wrong approach - state : + user
				continue;
			}
			//장바구니가 비었는지 확인
			if(!isCartEmpty()){
				continue;
			}
			int num = 제거할 상품번호 입력받기
			for(장바구니 순회){
				if(장바구니내에 입력값과 일치하는 상품){
					해당 상품 카운트 - 1;
					
					if(해당 상품 카운트가 0이라면){
						해당 상품을 장바구니에서 삭제;
					}
					break;
				}
			}
		}//2
		else if(입력값이 3이라면){
			if(로그인상태가 아니라면){
				//log : [Cart Menu - 3] wrong approach - state : + user
				continue;
			}
			//장바구니가 비었는지 확인
			if(!isCartEmpty()){
				continue;
			}
			if(!view.가격안내및구매확인(장바구니)){
				view.실패();
				continue;
			}
			boolean 성공여부 = false;
			for(장바구니 순회){
				if(!model.update(장바구니상품)){
					view.실패();
					break;
				}
			}
			if(성공여부){
				view.구매성공();
			}
			else{
				view.구매취소();
				continue;
			}
			break; //상위메뉴로
		}//3
		else{
			view.실패();
			//다시 입력받기
		}
	}
//장바구니 메뉴 - 지윤 end

 

*1차 피드백 : 취소, 뒤로 되돌아가기 등의 기능 삭제

 

메서드

 

장바구니가 비었는지 확인하는 메서드

private boolean isCartEmpty(){	
	if(장바구니가 비었다면){
		view.장바구니가 비었음();
		return false;
	}
	return true;
}

 

장바구니에 물건을 추가하는 메서드

private boolean addCart(id){
	새 상품 객체 생성;
	상품객체에 pk저장;
	상품객체 = model.selectOne(입력값);
	상품객체의 cnt를 1로 설정;
	장바구니.add();
	return true;
}

 

장바구니에 이미 물건이 있다면 카운트를 올리는 메서드

private boolean addCartCount(상품넘버){
			해당 상품 카운트 + 1;
			return true;
}

 

장바구니에 물건이 있는지 확인하는 메서드

private int hasCartProduct(입력값){
	for(장바구니 순회){
		if(장바구니내에 입력값과 일치하는 상품이 이미 있다면){
			return 상품넘버;
		}
	}
	return -1;
}

 

[프로젝트 파일]

 

최종 취합 파일.zip | Notion

src.ver

minibcake.notion.site

 

 

 

[강사님 피드백]

  1. 주석 부족하니 추가하기
  2. 발표 시에 대기 중인 팀원들은 계속 움직이지 않고 의자 가져와 앉아있기
  3. 오탈자 꼼꼼하게 확인하기 ( 맞춤법 검사 )
  4. 발표 시 설명할 부분에 대한 개념 숙지하기

좋았던 점

  1. 설계 단계의 내용을 팀원 모두가 잘 숙지했다.
  2. 질문에 대해 파트에 맞게 잘 답변했다.
  3. 코드 함수화 수행이 잘 됐다. (부족한 기능 있음)

 

 

[후기]

느낀 점

협업을 할 때는 개인 작업보다 설계가 더욱 중요하다는 것을 알게 되었고, 메서드 시그니쳐 통일이나 condition 값과 같은 파트 별로 서로 약속하는 부분들을 정리하는 부분에 연습이 더 필요할 것 같다고 느꼈다.

개선할 점

장바구니에 담긴 상품을 구매할 때 중간에 오류가 나면 해당 상품은 구매 시도가 취소 되어도, 그 전까지의 상품은 구매 된 상태로 중간에 구매 취소가 이루어지게 되는데, 설계 단계에서 이 부분을 고려하여 모델로부터 재고량을 받아와 컨트롤러에서 임시로 값을 저장하고, 업데이트 작업(구매작업) 도중 오류가 발생할 경우 임시 값을 모델에게 전달하여 다시 재고량을 돌리는 방법을 취했더라면 좋았을 것 같다.

 

설계 단계에서 있었던 취소, 되돌아가기 기능이 빠지면서 설계가 많이 허술해지고 필요없는 부분이 늘어난 것 같아 아쉬웠다.

변경되는 부분이 있다면 아예 재설계를 하는 편이 후에 혼란을 줄이는 방향이라는 생각이 들었다.

 

 

회의록, 설계, 코드, 작업 파일 등 팀 작업 정리 노션

 

[임베디드] 3조 팀플 (세번째 팀) 상부삼조 | Notion

240711 ~ 240724 (김승주(팀장), 김무건, 장준희, 주예나, 한지윤)

minibcake.notion.site