The Debugging Chronicles : "코드의 미학"

쇼핑몰 프로그램을 MVC 패턴으로 구현하기 본문

Project

쇼핑몰 프로그램을 MVC 패턴으로 구현하기

sweetseonah1004 2024. 7. 24. 15:46

오늘 발표를 했다.

발표 주제는 쇼핑몰 프로그램을 MVC패턴으로 구현하기!

 

일단 우리조는 젓가락으로 물을 떠먹는 그런 조였다....

하지만 나름의 의미가 있었다고 생각한다...

 

내가 생각하지 못한 부분 내가 약한 부분에 강점을 가진 사람들이 있었고 그분에서 많은 피드백을 얻었다.

또한 실제로 코딩하면서 협업하니 엄청난 압박감도 느꼈었다. 

요구사항을 좀 더 면밀히 분석하고 인지하고 있어야 했다. 

 

발표 피드백

  1. 추상화 클래스에 대해 정확하게 대답하지 못했다.
  2. 이렇게 저렇게 라는 말로 발표 하면 안됨
  3. 말끝을 흐리면 안됨
  4. 발표 순서 맞추기 134/ 25이렇게가 아니라 123 / 456 이렇게
  5. 실제 경험에 대한 설명
  6. 시현 -> 시연
  7. 주석을 꼼꼼히 달면 달수록 좋다

발표한 소감은 대본을 숙지해서 전달력 있는 발표가 되도록 해야겠다고 생각했다.

급하게 쓴 대본을 보면서 읽기만 하고 나왔다는 점... 반성해야겠다.

 


01 프로젝트 요구사항

 

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

 

프로젝트 진행

view 출력문

 

 

# [요구 사항 분석]

## 로그인

- 로그인
    - 아이디 패스워드 입력안내 받는다.
    - 사용자가 로그인 = ID(PK), PW 입력하면
        - id, pw가 데이터에 있으면 성공
        - id, pw가 데이터에 없으면 실패
        - 유효성검사 : 로그인 5번할 실패할 경우 메뉴로 돌아간다.

## 로그아웃

- 로그아웃 후 메뉴로 이동
- 로그 아웃 상태 시,
    - 로그인, 공통 보이는 내용 및 상품목록이 보인다.

## 회원가입

- 회원가입
    - 아이디 입력 안내 받고 유효성 검사 후
        - 유효성 검사 : 같은 아이디(PK)가 있다면 다시 입력(중복 검사)
    - 비밀번호 입력 안내 시 숫자와 영어로만 입력할 수 있도록 출력해서 안내하기
    - 비밀번호 재확인 : 비밀번호 확인해서 비밀번호가 동일하면
    - 회원가입 완료 - 아이디 비밀번호 사용자 DB에 저장
    - 회원 가입 완료 시, 로그아웃 상태로 메뉴로 이동

## 상품목록(과자) - 구매하기, 장바구니 담기, 취소 하기

- 과자 이름과 번호가 목록에 출력
    - 번호 == 인덱스(PK번호 아님)
    - 현재 재고 개수가 과자 이름 옆에 적혀있다.
    - 뒤로가기
    - 예) [ 번호 = 101, 이름 = 뺴빼로 ] 상품 재고 개수 : 1개
    - 개수가 0일때 선택한다면 품절임을 출력하고 메뉴로 이동
    - 재고 개수보다 더 많은 개수를 입력했을 떄는 다시 입력받도록 한다.
- 상품 선택 입력 받고
    - 유효성 검사 : 목록에 없는 번호 선택 시 목록 다시 출력
    - 입력받은 값의 상품 상태 출력(이름 /재고 /가격)
    - 선택한 상품의 기본 개수는 1개
- **구매, 장바구니 담기, 취소하기** 선택창 출력후 입력받기
    - 유효성 검사 : 위 3개 중에 선택 안했을 시에 선택창 다시 출력
    - 로그아웃 상태에서 장바구니 담기 선택 시, 로그인 화면으로 이동
        - 로그인 성공할 경우 장바구니에 담아 졌다고 장바구니 목록이 출력 되고 상품 목록으로 이동한다.
        - 로그인 실패할 경우, 최대 5번까지 로그인을 다시 해볼 수 있고 실패 시 메인 메뉴로 돌아간다.
        - 장바구니 목록에 담겨있지만 재고에서는 빠지지 않는다.
    - 구매하기를 눌렀을 때
        - 현재 선택한 상품의 재고의 개수가 하나 빠진다.
        - 구매 완료 시, 메뉴 화면으로 돌아간다.
    - 취소 하기 눌렀을 때
        - 메뉴로 다시 돌아간다.

## 장바구니(로그인 상태일 때만 가능)

장바구니 목록 전체 출력 후 장바구니메뉴 출력

- 장바구니 목록 개수 설정(빼빼로가 10개)
    - 장바구니 목록에 있는 아이템을 선택(빼빼로 선택)
    - 개수 설정(8개)
- 장바구니 목록에서 선택상품 빼기
    - 선택상품 삭제
- 장바구니 구매하기
    - 구매한 아이템들의 재고들이 개수 만큼 빠진다.
- 취소하기
    - 메인 메뉴로 돌아간다

 


 

view 코드

 

loginView

package view;

import java.util.ArrayList;

import model.ProductDTO;

public class LoginView extends View {

	public void printLoginMenuList() {	// 로그인 메뉴
		System.out.println(" 4. 장바구니 ");
		System.out.println(" 5. 로그아웃 ");
	}
	public void printCartEmpty() {//장바구니가 비어있을 시
		System.out.println(" ===================");
		System.out.println(" 장바구니가 비어있습니다.");
	}
	public void printTrueCart() {//장바구니 담김 성공
		System.out.println(" 장바구니에 담았습니다.");
	}
	public void printFalseNull() {//품절 상품 안내
		System.out.println(" 품절된 상품입니다.");
	}
	public void printCart(ArrayList<ProductDTO> datas) {// 장바구니 출력
		if(datas.size() <= 0) {	// 상품이 없을 시 유효성 검사
			printCartEmpty();
			return;
		}
		int sum=0;
		System.out.println(" === 상품 목록 ===");
		System.out.println(" 상품 번호 | 상품 이름 | 가격 | 수량 ");
		for(ProductDTO data: datas) {	// 전체 목록 출력
			System.out.println(data.getProductId()+" | "+data.getProductName()+ " | "+ data.getProductPrice() + " | "+ data.getProductInventory());	
			sum+=data.getProductPrice()*data.getProductInventory();
		}
		System.out.println(" 전체 가격 = "+sum);
	}
	public boolean isBuyCart(ArrayList<ProductDTO> datas) { //가격안내+구매확인
		int sum = 0;
		int check = 0;
		for(ProductDTO data: datas) {   // 전체 목록 출력
			sum += data.getProductPrice()*data.getProductInventory();
		}
		System.out.println(" 전체 가격 = "+sum);
		while(true) {
			System.out.print(" 구매 하시겠습니까?\n 1. 예\n 2. 아니요\n 번호 입력 >> ");
			check=sc.nextInt();
			if(check == 1) { // 유효성 검사
				return true;
			}
			else if(check == 2) {
				return false;
			}
			else {
				System.out.println(" 다시 입력바랍니다.");
			}
		}

	}
	public void printCartMenu() { //장바구니 목록
		System.out.println(" ===== 장바구니 =====");
		System.out.println(" 1. 장바구니 상품 담기");
		System.out.println(" 2. 장바구니 상품 빼기");
		System.out.println(" 3. 장바구니 상품 구매");
	}
	public int inputICartMenu() {	//장바구니 메뉴 입력받기
		System.out.print(" 번호 입력 >> ");
		int inputICartMenu= sc.nextInt();
		while(true) {//장바구니 메뉴 유효성검사
			if(1<=inputICartMenu||inputICartMenu<=3) {
				//메뉴 번호에 맞게 입력했다면
				break;
			}
			System.out.println(" 다시 입력바랍니다.");
		}
		return inputICartMenu;	
	}
	public void printTrueBuy() {	// 구매성공
		System.out.println(" 구매했습니다.");
	}
	public void printCancelBuy() {	//구매 취소
		System.out.println(" 구매를 취소했습니다.");
	}
	public int addToCart(ArrayList<ProductDTO> datas) {//전체 상품 목록에서 장바구니에 상품 담기
		//컨드롤러에서 전달받기
		int productId;
		while(true) {
			System.out.print(" 상품 번호 입력 >> ");
			productId=sc.nextInt();
			boolean flag=false;	
			for(ProductDTO data:datas) {	//배열길이만큼 반복
				if(data.getProductId()==productId&&!(data.getProductInventory()<=0)) {
					flag=true;	
					break;
				}	
			}
			if(flag) {
				break;
			}
			System.out.println(" 상품번호를 다시 입력바랍니다.");
		}
		return productId;
	}
	public void printTrueLogOut() {	//로그아웃
		System.out.println(" 로그아웃 합니다.");
	}
	public void printMinusCart() {	//장바구니 빼기
		System.out.println(" 선택한 상품 1개가 장바구니에서 삭제했습니다.");
	}
}

 

logoutView

package view;

import model.MemberDTO;

public class LogoutView extends View{

	public void printLogoutMenuList() {	// 로그아웃 메뉴
		System.out.println(" 2. 로그인 ");
		System.out.println(" 3. 회원가입 ");
	}
	public MemberDTO inputLogin() {//로그인
		System.out.print(" 아이디 입력 >> ");
		String mid=sc.next();	//min > PK값
		System.out.print(" 비밀번호 입력 >> ");
		String password=sc.next();

		MemberDTO data=new MemberDTO();
		data.setMid(mid);
		data.setPassword(password);		
		return data;
	}
	public void printTrueLogin() {	// 로그인 성공
		System.out.println(" 로그인 성공!");
	}
	public void printFalseLogin() {//로그인 실패
		System.out.println(" 아이디와 비밀번호를 다시 확인바랍니다.");
	}
	public void printTrueSign() {	// 회원가입 성공
		System.out.println(" 회원가입 성공!");
	}

	public String inputMid() {	//회원가입 아이디
		System.out.print(" 아이디 입력 >> ");
		String mid=sc.next();
		return mid;
	}
	public String inputPassword() {//회원가입 비밀번호
		System.out.print(" 비밀번호 입력 >> ");
		String password=sc.next();
		return password;
	}
	public void printFalseSign() {//중복 아이디 입력시 안내 
		System.out.println(" 중복된 아이디 입니다. 다시 입력바랍니다!");
	}

}

 

MainView

package view;

import java.util.ArrayList;
import java.util.Scanner;

import model.MemberDTO;
import model.ProductDTO;
abstract class View {
	public static Scanner sc=new Scanner(System.in);
}

public class MainView extends View{

	public void printMainMenuList() {	// 메인 메뉴 출력
		System.out.println(" === 메인 메뉴 ===");
		System.out.println(" 0. 프로그램 종료");
		System.out.println(" 1. 전체 상품 목록");
	}

	public int insertMainMenu(MemberDTO user) {	//메인 메뉴 입력 받기
		int insertMainMenu;

		while(true) {		
			System.out.print(" 번호 입력 >> ");
			insertMainMenu= sc.nextInt();
			if(user!=null) {//로그인 상태라면
				if(!(2<=insertMainMenu&&insertMainMenu<=3)&&(0<=insertMainMenu&&insertMainMenu<=5)) {
					//입력값이 2번,3번을 선택타지 않았고, 
					//0~5 사이의 숫자를 선택받았을때 
					break;
				}
			}
			else {//로그인 상태가 아니라면
				if(0<=insertMainMenu&&insertMainMenu<=3) {
					//0~3사이를 입력받기
					break;
				}

			}//위에가 다 아니라면 
			System.out.println("다시 입력바랍니다!");
		}
		return insertMainMenu;
	}

	public void end() {	// 프로그램 종료
		System.out.println(" 프로그램을 종료합니다.");
	}

	public void printFalse() {	// 실패...
		System.out.println(" 실패 했습니다...띵띵 딩딩딩..");
	}
	public void printProductList(ArrayList<ProductDTO> datas) { // 상품목록 전체 보여주기
		String productInventory="[품절]";
		if(datas.size() <= 0) {	// 상품이 없을 시 유효성 검사
			System.out.println(" 상품이 준비되지 않았습니다.");
			return;
		}
		System.out.println(" ========= 상품 목록 =========");
		System.out.println(" 번호 | 상품 이름 | 가격 | 재고");
		for(ProductDTO data: datas) {	// 전체 목록 출력
			if(data.getProductInventory()<= 0) {
				System.out.println(" "+data.getProductId()+" | "+  data.getProductName()+ " | "+ data.getProductPrice()+ " | "+productInventory);	
			}
			else {
				System.out.println(" "+data.getProductId()+" | "+  data.getProductName()+ " | "+ data.getProductPrice()+ " | "+ data.getProductInventory());	
			}
		}		
	}
}

'Project' 카테고리의 다른 글

중간 프로젝트 기능 발표를 위한 PPT 작업  (0) 2024.09.25
[Team Project - 코마] 중중프 완료  (0) 2024.08.30
포켓몬 잡기 03  (0) 2024.07.11
포켓몬 잡기 02  (2) 2024.07.11
포켓몬 잡기 01  (0) 2024.07.08