코딩항해기
[Team] 쇼핑몰 프로그램 만들기 본문
쇼핑몰 프로그램 만들기
java / Eclipse
5인참여 (팀명 : 삼부삼조)
24/07/19 ~ 24/07/24
MVC 패턴 연습을 위한 팀 프로젝트를 진행하였다.
[요구사항]
- 쇼핑몰 프로그램을 MVC 패턴으로 구현해주세요!
- 회원 속성 : 아이디(PK),비밀번호
- 상품 속성 : 품번(PK),품명,가격,재고
- "로그인한" 회원만 장바구니를 사용할수있습니다.
- 회원이 로그아웃을 하면 장바구니는 사라집니다.
- 요구기능 목록
- 회원가입
- 로그인
- 로그아웃
- 상품 목록 출력 : 재고가 없는 상품에 대해서 [품절] 표시하기
- 장바구니에 상품담기
- 장바구니에 담긴 상품 목록 출력
- 장바구니에 담긴 상품 목록 구매
- 장바구니에서 상품 빼기
[프로젝트 개요]
[전체 설계 (MVC 분배) ]
![](https://blog.kakaocdn.net/dn/J0OSL/btsIKVhJ6e1/TAA0znJOpAcGobaFkExU21/img.png)
프로그램 관련
메뉴화면
- 프로그램 종료 (종료 안내 후 종료됨)
- 상품목록보기 (번호 | 상품 이름 | 가격 | 재고 ((품절포함)보여주기)
- (로그인상태일때) 상품 장바구니에 담기
- (번호선택하여 품절아니면) 장바구니에 담고 안내메세지 / 장바구니를 보여주지는 않는다)
- (로그인상태일때) 상품 장바구니에 담기
로그아웃 상태일때
- 로그인 (아이디 비밀번호 입력받고 안내)
- 회원가입 (아이디 비밀번호 입력받고 중복된 아이디라면 불가, 아니라면 가입성공)
로그인 상태일때
- 장바구니
(전체출력(없으면 없다고 출력(C), 전체가격) + 장바구니 관련 메뉴 출력 / 하위기능 끝나면 장바구니로)- 장바구니 나가기
(0번 : 메뉴로 돌아가기 ) - 물건 담기
(담을 수 있는 물건 출력 후 1개 골라서 장바구니에 추가 동일 상품이 있으면 카운트가 올라가고) - 물건 빼기
(장바구니에 있는 물건 중 선택한 물건을 1개씩 빠짐) - 물건 구매
(가격 안내 + 구매하시겠습니까?)
(있는 물건 전체 구매 , 재고보다 구매량이 많은 상품이 있으면 (무슨 상품이 재고부족) 불가함을 안내)
- 장바구니 나가기
- 로그아웃 (로그아웃 안내 후 로그아웃)
기능별 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 장바구니 기능 세부 설계]
- 상품목록보기에서 장바구니 담기
- 만약 현재 로그인 상태라면.
- 맞다면,
- V로부터 번호 입력값 받아오기
- 정상적이고 재고가 있는 값이면
- 입력받은 값 장바구니에 추가하기
- 만약 이미 담긴 물건이라면 카운트 +N
- 입력받은 값 장바구니에 추가하기
- 그 외의 값이라면,
- V로 실패 안내
- 정상적이고 재고가 있는 값이면
- V로부터 번호 입력값 받아오기
- 아니라면 아무것도 하지 않음
- 맞다면,
- 만약 현재 로그인 상태라면.
- 장바구니 메뉴
- 메뉴에서 4번 장바구니를 입력받으면,
- 로그인 상태인지 확인하기
- 장바구니 목록을 V에게 전달해 출력
- V로 장바구니 메뉴 안내
- V로 장바구니 메뉴 입력받기
- 1번 (물건담기) 라면
- 로그인 상태 확인하기
- M에서 재고가 0이 아닌 상품리스트 받아오기
- V에게 출력 시키기
- V로 물건 번호 입력받기
- 입력받은 값 장바구니에 추가하기
- 만약 이미 담긴 물건이라면 카운트 +1
- 장바구니로 돌아가기
- 2번 (물건 빼기)라면
- 로그인상태 확인하기
- 장바구니가 비어있는지 확인하기
- 비어있다면
- 비어있다고 안내 후 장바구니 메뉴로 돌아가기
- 비어있다면
- V로 입력받기
- 입력받은 물건을 장바구니에서 카운트 -1
- 카운트가 0이라면 장바구니에서 삭제하기
- 장바구니로 돌아가기
- 3번 (물건 구매)라면
- 로그인상태 확인하기
- 장바구니가 비어있는지 확인하기
- 비어있다면
- 비어있다고 안내 후 장바구니 메뉴로 돌아가기
- 비어있다면
- V에게 장바구니 전달하며 구매확인 출력요청하기
- 구매한다면
- M에게 장바구니를 순회하며 장바구니 객체(PK, cnt)전달
- V로 구매 성공실패 안내
- 상위메뉴로 돌아가기 (구매 실패라면 장바구니메뉴로)
- 1번 (물건담기) 라면
- 메뉴에서 4번 장바구니를 입력받으면,
한글코딩
상품 목력보기에서 장바구니 담기
//상품목록에서 장바구니 담기 - 지윤 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
[강사님 피드백]
- 주석 부족하니 추가하기
- 발표 시에 대기 중인 팀원들은 계속 움직이지 않고 의자 가져와 앉아있기
- 오탈자 꼼꼼하게 확인하기 ( 맞춤법 검사 )
- 발표 시 설명할 부분에 대한 개념 숙지하기
좋았던 점
- 설계 단계의 내용을 팀원 모두가 잘 숙지했다.
- 질문에 대해 파트에 맞게 잘 답변했다.
- 코드 함수화 수행이 잘 됐다. (부족한 기능 있음)
[후기]
느낀 점
협업을 할 때는 개인 작업보다 설계가 더욱 중요하다는 것을 알게 되었고, 메서드 시그니쳐 통일이나 condition 값과 같은 파트 별로 서로 약속하는 부분들을 정리하는 부분에 연습이 더 필요할 것 같다고 느꼈다.
개선할 점
장바구니에 담긴 상품을 구매할 때 중간에 오류가 나면 해당 상품은 구매 시도가 취소 되어도, 그 전까지의 상품은 구매 된 상태로 중간에 구매 취소가 이루어지게 되는데, 설계 단계에서 이 부분을 고려하여 모델로부터 재고량을 받아와 컨트롤러에서 임시로 값을 저장하고, 업데이트 작업(구매작업) 도중 오류가 발생할 경우 임시 값을 모델에게 전달하여 다시 재고량을 돌리는 방법을 취했더라면 좋았을 것 같다.
설계 단계에서 있었던 취소, 되돌아가기 기능이 빠지면서 설계가 많이 허술해지고 필요없는 부분이 늘어난 것 같아 아쉬웠다.
변경되는 부분이 있다면 아예 재설계를 하는 편이 후에 혼란을 줄이는 방향이라는 생각이 들었다.
회의록, 설계, 코드, 작업 파일 등 팀 작업 정리 노션
[임베디드] 3조 팀플 (세번째 팀) 상부삼조 | Notion
240711 ~ 240724 (김승주(팀장), 김무건, 장준희, 주예나, 한지윤)
minibcake.notion.site
'Project' 카테고리의 다른 글
[Team/붕어빵원정대(중중프)] 테이블 설계 (0) | 2024.08.25 |
---|---|
[Team] 알흠 프로젝트 (0) | 2024.08.02 |
[Team] Pokemon 게임 만들기 (0) | 2024.07.11 |
[Personal/클론코딩] 숨고 : 숨은 고수 홈페이지 클론코딩 (0) | 2024.07.06 |
[Team] UpDown 게임 만들기 (0) | 2024.06.29 |