Tiny Bunny [JAVA]팀 프로젝트_MVC 패턴을 이용한 쇼핑몰 프로그램_3(최종) - 솜님의 블로그
솜님의 블로그
카테고리
작성일
2024. 7. 24. 17:11
작성자
겨울솜사탕

파트별로 코드를 모두 작성하고 -> 우리 파트 내부적으로도 담당이 나뉘어 있기 때문에 우리끼리의 코드도 합치고  ->

View와 Model에서 코드를 받아 모두 합쳐보았다.

 

생각보다 오류로 발생되는 부분이 여러가지 있었는데,

진짜 사소한 부분부터 ~ 기능이 제대로 구현되지 않는 오류까지도 발생되었다.

 

오류의 종류는

  • 변수명 다름 (ex. C에서 작성한 이름과 M 혹은 V에서 작성한 이름이 다름), 혹은 오타
  • 대소문자 미구분 (ex. setPassword 를 setpassword로 작성하는 등)
  • 문자열 비교를 .equals가 아닌 == 사용하여 정상적으로 기능이 동작되지 않음 

등등... 다양한 오류가 발생되었다.

 

▼ 오류에 대한 내용은 노션에 캡쳐와 함께 기록했다.

     다른 곳에서도 확인할 수 있도록 PDF 파일로 변환하였다. 

4조 쇼핑몰 프로그램_오류 수정.pdf
0.64MB

 

▼ 우리 팀 발표에 대한 PPT 자료이다.

4조_PPT자료.pdf
1.60MB

 


 

우리 팀의 경우, Model과 View는 서로 아예 만날 일이 없다는 강사님의 말씀대로 해당 파트원 분들끼리는 서로 프로젝트 관련해서 소통은 아예 하지 않으셨었고, 중간에 있는 우리 Controller는 양측으로 의견을 주고받았었다.

강사님께서는 우리 팀이 M V C 각 파트별 구분이 잘 되어있다는 칭찬을 해주셨다..!

 

발표를 할 때에 대본도 미리 적어갔는데도, 막상 발표할 상황이 되니까 많이 긴장이 되어 대본도 눈에 잘 안 들어오고, 하려고 했던 이야기를 차분하게 잘 전달하지 못했던 것 같아서 아쉬운 마음도 들었다.

 

[우리 팀_강사님의 피드백]

- 발표할 내용 대본 숙지하기

- 말을 보다 천천히 해서 명확히 전달하기

 

[전체 유의사항]

- 문서화 작업할 때 말 어미를 맞추기

- 대본 작성해 와서 발표할 때 읽기 (이런 식 ~ 저런 식~ xxxx)

- 발표 시작과 끝에 본인 이름 말하기

- 말 끝을 정확히 끝내기

- 코드에 대한 설명도 중요하지만, 내가 이 프로젝트를 하면서 느꼈던 점을 설명하는 것도 중요함

- 주석 꼼꼼히 달기

 

다음 프로젝트 때는 위 사항들을 유의해서 더 열심히 노력해야겠다 🥹 🥹 🥹

 

 

 


 

우리 팀에서 최종적으로 합친 코드는 아래에서 파트별로 확인할 수 있다.

⬇️ 최종 코드 : Client / Controller

더보기

💟 Client

package client;

import controller.ShoppingController;

public class Client {
	public static void main(String[] args) {
		ShoppingController ctrl = new ShoppingController();
		
		ctrl.start();
	}
}

 

 

💖 Controller

package controller;

import java.util.ArrayList;

import model.MemberDAO;
import model.MemberDTO;
import model.ProductDAO;
import model.ProductDTO;
import view.LoginView;
import view.LogoutView;
import view.MainView;

public class ShoppingController {

	// controller에서 사용하기 위해
	// Model과 View를 멤버변수로 가지고 온다. 
	private MemberDAO memberDAO;
	private ProductDAO productDAO;
	private MainView mainView;
	private LoginView loginView;
	private LogoutView logoutView;
	private MemberDTO user; //현재 상태 로그인,로그아웃 판단하는 변수

	// 장바구니 관리를 위한 ArrayList
	private ArrayList<ProductDTO> basket; // 장바구니 AL

	// 생성자, 멤버변수 초기화
	public ShoppingController(){
		this.memberDAO=new MemberDAO();
		this.productDAO=new ProductDAO();
		this.mainView=new MainView();
		this.loginView=new LoginView();
		this.logoutView=new LogoutView();
		this.user=null;
		this.basket= null;
	}

	// 장바구니 합을 계산하는 함수
	private int basketSum(ArrayList<ProductDTO> datas) {
		// 합(정수 sum)을 담을 변수를 0으로 생성;
		int sum = 0;

		// 합 계산
		for(ProductDTO data : datas) {  // 장바구니만큼 반복
			// sum += 장바구니에서 가격을 뽑음(this.basket.가격) * 갯수를 뽑음(this.basket.구매갯수);
			sum += data.getPrice() * data.getBasketCount();
		}

		return sum;
	}

	//기능 구현 시작, client에서 시작_start
	public void start() {

		// 메뉴 사이즈를 선언하는 변수
		// 현재 로그아웃 상태임(2)
		int menuLoginSize = 6;
		int menuLogoutSize = 3;
		int menuSize = menuLogoutSize;


		while(true){


			// 로그아웃, 로그인 여부과 관계없이 실행시키는 메뉴

			// 먼저 메인뷰 메뉴를 실행시키고(0. 종료 / 1. 상품목록 출력)
			mainView.printMenuList();

			// 로그인/로그아웃 상태에 따라 출력되는 메뉴가 다름
			if(user != null){ // 만약 user가 null이 아니라면 == 로그인 상태라면
				loginView.menuList();
			}
			else{ // user가 null 상태라면 == 로그아웃 상태라면
				logoutView.printMenuList();
			}

			// 메뉴 선택 받기
			//(유효성 검사 : 메뉴사이즈)
			int menu=mainView.inputMenuNum(menuSize);

			if(menu==0) {
				//0. 종료하기 (프로그램 종료)
				mainView.exit();
				break;
			} // 0끝
			else if(menu==1) {//1. 상품 목록 출력
				// 1. 상품 목록 출력_재고 없는 상품에 대해 품절표시

				// DB에서 상품 전체 목록 받아오기 위해 객체 생성
				ProductDTO productDTO = new ProductDTO();
				// V에 출력 요청 + Model에서 selectAll로 상품 전체 자료 받가오기
				mainView.printProductMenu(productDAO.selectAll(productDTO));

			} // 1끝

			if(user==null) { // 만약 로그아웃 상태라면
				//로그아웃뷰에서 메뉴 실행(2. 회원가입 / 3. 로그인)

				if(menu==2) { // 2. 회원가입

					//회원 DB를 가져오기 위해 new DTO 생성
					MemberDTO memberDTO = new MemberDTO(); 


					while(true) { // 아이디 중복검사하고, 중복이면 다시 반복하기 위한 while문

						// V에게서 회원가입을 할 ID를 받아와 저장시킨다
						// id 사용할게 맞는지 유효성 검사
						String id = logoutView.inputNewId();
						memberDTO.setMid(id);
						MemberDTO data= memberDAO.selectOne(memberDTO);

						// M에게서 입력한 아이디가 중복값인지 확인한다. 
						// null 혹은 data 
						// 반환값은 CUD는 boolean, selectOne==DTO All==AL      
						if(data == null) { // 만약 가입하려는 id가 없다면
							// while문을 탈출
							break;
						}
						else{ // 일치하는 ID가 있다면 회원DTO가 null이 아니라면
							// 다시 입력 요청, while문 반복
							logoutView.nameInUse();
						}
					}

					// 비밀번호 V에게 입력 요청 및 입력받기
					// 1차 2차 입력받고 유효성 검사까지 끝나서 가입 완료가 된 자료를 저장
					String pw = logoutView.inputNewPw();
					// ID가 저장된 DTO에 PW DTO 값을 저장해준다
					memberDTO.setPassword(pw);      

					// 합쳐진 ID와 PW를 M에게 보내준다. (insert)
					memberDAO.insert(memberDTO);
					mainView.printTrue();


				}  // 2. 회원가입 끝

				else if(menu==3) { // 3. 로그인

					MemberDTO memberDTO = new MemberDTO(); 

					// V에 아이디와 비밀번호 입력받아오기
					// 받아서 저장할 DTO 생성해서 받아온 ID, PW 저장
					MemberDTO data= logoutView.inputLoginInfo();

					// 회원DTO에 ID, PW 정보를 저장한다.
					// 이는 selectOne에서 검색을 위한 정보이다.
					memberDTO.setMid(data.getMid());

					MemberDTO checkData = new MemberDTO();
					// model의 selectOne에 ID 자료를 넘겨서 저장된 자료가 있는지 확인하고
					// 확인 후 자료가 있으면 ID와 PW 자료가 반환, 없다면 null 값이 반환
					checkData=memberDAO.selectOne(memberDTO);

					if(checkData !=null ) { // 회원정보가 있다면

						if(data.getPassword().equals(checkData.getPassword())) { // 입력받은 비밀번호와 checkData의 비밀번호가 같다면
							// v에 전달해줄 회원 id 저장
							String id = data.getMid();
							// 로그인 상태로 전환한다
							user=data;
							// 로그인 후 상품을 담을 수 있는 장바구니 ArrayList 생성
							basket = new ArrayList<ProductDTO>();
							// 로그인 되었다는 문구 출력
							logoutView.printLoginSuccess(id);
							// 메뉴사이즈 변경
							// 공통 메뉴 + 로그인 or 로그아웃시 메뉴 출력이 다르기 때문에
							// 메뉴 사이즈 변수 설정하여, 최대 메뉴 갯수를 설정해준다.
							// 이 사이즈는 V에 넘어가서 유효성 검사로 사용하게 됨                  
							menuSize = menuLoginSize;
						}
						else {//입력 받은 비밀번호와 checkData의 비밀번호가 다르다면
							logoutView.printLoginFail();
						}
					}
					else { //회원 정보가 없다면, 데이터==null
						logoutView.printLoginFail();
					}

				} // 3. 로그인 끝 

			} // 로그아웃 상태 메뉴 끝


			// 로그인 상태라면
			else if(user!=null) {

				if(menu == 2) {  // 장바구니에 상품 담기
					// 장바구니에 담을 객체 생성
					// new 상품DTO 객체 생성(data);
					ProductDTO data = new ProductDTO();

					// 상품 전체 목록 가져옴
					// new 배열 리스트(datas) 생성;
					// M에게 selectAll()로 모든 데이터를 받아서 datas에 담음;
					ArrayList<ProductDTO> datas = new ArrayList<ProductDTO>();
					datas = productDAO.selectAll(data);

					// V에게 datas 전달, 상품 목록 출력 요청;
					// V에게 품번(정수 oNum)을 반환 받기; (유효성 검사 : datas)
					mainView.printProductMenu(datas);
					int oNum = loginView.productNum(datas);

					// 생성한 객체(data)에 품번 입력(set);
					data.setPK(oNum);

					// M의 selectOne에 data를 주고 값을 반환받음
					// 반환받은 값을 data에 넣어줌;
					data = productDAO.selectOne(data);

					// 장바구니에 담긴 수량이 재고수를 넘지 않게 제한하는 작업
					int indexNum = 0;
					//장바구니와 같은 것이 있는지 확인하는 변수 false로 생성(boolean flag);
					boolean flag = false;

					// 일치하는 장바구니 위치 찾기
					for(int i = 0; i < this.basket.size(); i++) {	// 장바구니만큼 반복
						if(this.basket.get(i).getPK() == oNum) {	//장바구니 품목이 입력한 품목과 같다면
							indexNum = i;
							// 장바구니 안에 넣을 수 있는 수량 줄이기
							data.setStockCount(data.getStockCount() - this.basket.get(i).getBasketCount());
							//flag를 true로 변경;
							flag = true;
							break;
						}
					}

					// flag가 true일 때
					// 사용자가 입력한 물품이 장바구니에 몇 개 담겼는지 출력
					if(flag) {
						loginView.basketAmountCnt(this.basket.get(indexNum).getProductName(), this.basket.get(indexNum).getBasketCount());
					}

					// V에게 장바구니에 담을 수량을 입력 요청;
					// V에게 재고수를 주고 수량(정수 bNum)을 반환받기;  (유효성 검사: data)
					int bNum = loginView.productAmount(data.getStockCount());

					// 만약 flag가 true라면
					//  == 장바구니에 데이터가 있다면
					if(flag) {
						// 구매갯수(this.basket.구매갯수)에 bNum을 추가로 넣어줌
						this.basket.get(indexNum).setBasketCount(this.basket.get(indexNum).getBasketCount() + bNum);
						// 밑 내용 스킵
						continue;
					}

					// data에 구매 갯수(this.basket.구매갯수) bNum 추가;
					data.setBasketCount(bNum);
					//장바구니(this.basket) 안에 data 추가;
					this.basket.add(data);

					// 장바구니에 추가 완료했다는 말을 할까?
				} // 2. 장바구니 상품 담기 끝

				else if(menu == 3) {  // 장바구니 상품 목록 출력
					// 합(정수 sum)을 담을 변수를 생성;
					// 함수로 값 가져오기
					int sum = basketSum(this.basket);
					loginView.basketList(this.basket, sum);
				} // 3. 장바구니 상품 목록 출력 끝

				else if(menu == 4) {  // 장바구니 상품 목록 구매
					// 장바구니가 비어있는지 아닌지 확인
					if(this.basket.isEmpty()) {
						// 비어있음 출력
						loginView.basketListEmpty();
						continue;
					}

					// 합(정수 sum)을 담을 변수를 생성;
					// 함수로 값 가져오기
					int sum = basketSum(this.basket);

					// V에게 장바구니(this.basket), 합(sum)을 보냄; (장바구니(물품, 구매갯수), 합)
					// V에게 구매 의사(boolean flag)을 반환받음;
					loginView.basketList(this.basket, sum);
					boolean flag = loginView.buyProduct();

					if(!flag) {
						// 밑의 프로그램 스킵;
						continue;
					}

					// 업데이트 성공에서 한 번 더 사용하기 위해 flag를 true로
					flag = true;
					// 전부 성공인지 확인하는 boolean allFlag를 true로 생성;
					boolean allFlag = true;

					// 재고 수량 변경
					for(int i = 0; i < this.basket.size(); i++) {	// 장바구니만큼 반복
						// new 상품DTO 객체(data) 생성;
						ProductDTO data = new ProductDTO();
						// M에게 장바구니의 객체를 전달하고 품번과 일치하는 객체를 받아옴(selectOne)
						// data에 M에서 받아온 객체 저장;
						data = productDAO.selectOne(this.basket.get(i));

						// data의 재고 수량을 (this.basket.재고수량 - 구매 갯수(this.basket.구매갯수))을 넣어줌(set);
						int stockNum = this.basket.get(i).getStockCount() - this.basket.get(i).getBasketCount();
						data.setStockCount(stockNum);

						// M에게 이 객체data를 update_상품재고 하도록 전달;
						// update의 boolean값 받아오기
						flag = productDAO.update(data);

						// 상품명, 구매갯수를 뽑아서
						String productName = this.basket.get(i).getProductName();
						int buyNum = this.basket.get(i).getBasketCount();

						if(!flag) {	// flag가 false라면
							// V에게 업데이트 실패 출력;
							loginView.buyFail(productName, buyNum);
							// allFlag를 false로;
							allFlag = false;
							continue;
						}

						// V에게 성공 출력
						loginView.buySuccess(productName, buyNum);
						// this.basket에 해당 객체 (remove)
						this.basket.remove(i);
					}
				} // 4. 구매 끝

				else if (menu == 5){ // 장바구니에서 제외(삭제)	
					// 장바구니가 비어있는지 아닌지 확인
					if(this.basket.isEmpty()) {
						// 비어있음 출력
						loginView.basketListEmpty();
						continue;
					}

					// 합(정수 sum)을 담을 변수를 생성;
					// 함수로 값 가져오기
					int sum = basketSum(this.basket);
					loginView.basketList(this.basket, sum);

					// V에게 장바구니를 보냄;
					// V에게 뺄 품번(정수 oNum)을 반환 받음; (유효성 검사 : this.장바구니)
					int oNum = loginView.deleteProductList(this.basket);

					// new 상품DTO 객체 생성(data);
					// 생성한 객체(data)에 품번 입력(set);
					ProductDTO data = new ProductDTO();

					int indexNum = 0;

					// 일치하는 장바구니 위치 찾기
					for(int i = 0; i < this.basket.size(); i++) {	// 장바구니만큼 반복
						if(this.basket.get(i).getPK() == oNum) {	//장바구니 품목이 입력한 품목과 같다면
							indexNum = i;
							break;
						}
					}
					// 반환받은 값을 data에 넣어줌;
					data = this.basket.get(indexNum);

					// V에게 장바구니 안의 구매갯수(this.basket.구매갯수)를 보내고 제외 수량(정수 bNum)을 반환 받음; (유효성 검사: this.장바구니) 
					int bNum = loginView.deleteProductAmount(this.basket.get(indexNum).getBasketCount());

					// 구매갯수(this.basket.구매갯수)의 갯수를 -bNum 한다;
					this.basket.get(indexNum).setBasketCount(this.basket.get(indexNum).getBasketCount() - bNum);

					if(this.basket.get(indexNum).getBasketCount() <= 0) {	// 구매갯수(this.basket.구매갯수)가 0이하라면
						// 해당 상품을 장바구니에서 삭제한다.(remove);
						this.basket.remove(indexNum);
					}
				} // 5. 장바구니에서 제외 끝

				else if(menu==6) { // 6. 로그아웃

					// 로그아웃시 장바구니 초기화!
					this.basket=null;
					// 회원정보 로그아웃으로 변경
					user=null;
					// 메뉴사이즈 변경
					// 공통 메뉴 + 로그인 or 로그아웃시 메뉴 출력이 다르기 때문에
					// 메뉴 사이즈 변수 설정하여, 최대 메뉴 갯수를 설정해준다.
					// 이 사이즈는 V에 넘어가서 유효성 검사로 사용하게 됨   
					menuSize = menuLogoutSize;
				} // 6. 로그아웃 끝
			} // 로그인 상태 끝
		} // 전체 while 끝
	} // start 끝
} // class 끝

⬇️ 최종 코드 : Model

더보기

💖 MemberDTO

package model;

public class MemberDTO {
	private String Mid; // 아이디
	private String password; // 비밀번호

	public String getMid() {
		return Mid;
	}
	public void setMid(String mid) {
		this.Mid = mid;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Override
	public String toString() {
		return "MemberDTO [Mid=" + Mid + ", passward=" + password + "]";
	}
	

}

 

💖 MemberDAO

package model;


import java.util.ArrayList;

public class MemberDAO {
	private ArrayList<MemberDTO> datas;

	public MemberDAO(){
		this.datas = new ArrayList<MemberDTO>();

		MemberDTO data = new MemberDTO(); //샘플데이터 1
		data.setMid("teemo");
		data.setPassword("1234");
		this.datas.add(data);

		MemberDTO data1 = new MemberDTO(); //샘플데이터 2
		data1.setMid("ari");
		data1.setPassword("ari123");
		this.datas.add(data);

		MemberDTO data2 = new MemberDTO(); //샘플데이터3
		data2.setMid("아무말");
		data2.setPassword("아무번호");
		this.datas.add(data2);
	}


	public boolean  insert(MemberDTO memberDTO) {
		//회원가입
		System.out.println("model.MemberDAO.insert 실행 시작");

		//입력받은값을 사용자DB 추가

		MemberDTO data = new MemberDTO();
		//data에 input으로 받은 이름을 추가해줘
		data.setMid(memberDTO.getMid());
		
		//data에 input으로 받은 비밀번호 추가해줘
		data.setPassword(memberDTO.getPassword());
		
		//내 datas배열에 입력 다 받은 data 추가해줘
		this.datas.add(data);

		System.out.println("model.MemberDAO.insert 실행 끝");
		return true;
	}

	private ArrayList<MemberDTO> selectAll(MemberDTO memberDTO){
		//기능 미구현으로 hiding
		return datas;
	}

	public MemberDTO selectOne(MemberDTO memberDTO){
	      System.out.println("model.MemberDAO.selectOne 시작");
	      MemberDTO data = new MemberDTO(); // seletOne 저장공간 할당
	      for(MemberDTO searchMember : this.datas) {
	         if(searchMember.getMid().equals(memberDTO.getMid())) {// 만약에 입력한 아이디가 내 DB에 있는 아이디 라면
	            data.setMid(searchMember.getMid()); //그 아이디와 비밀번호를 둘다 반환한다
	            data.setPassword(searchMember.getPassword());
	            System.out.println("model.MemberDAO.selectOne 성공");
	            return data; // 데이터 반환
	         }
	      }
	      System.out.println("model.MemberDAO.selectOne 실패");
	      return null; // 없다면 null 반환
	   }

	private boolean update(MemberDTO memberDTO) {
		//기능 미구현으로 hiding
		return false;
	}

	private boolean delete(MemberDTO memberDTO) {
		//기능 미구현으로 hiding
		return false;
	}
}

 

💖 ProductDTO

package model;
public class ProductDTO {
   private int PK; // 상품 번호
   private String productName; // 상품 이름
   private int price; // 가격
   private int stockCount; // 잔여수량
   private int basketCount; // C에서 사용할 장바구니수량
   public int getPK() {
      return PK;
   }
   public void setPK(int pK) {
      PK = pK;
   }
   public String getProductName() {
      return productName;
   }
   public void setProductName(String productName) {
      this.productName = productName;
   }
   public int getPrice() {
      return price;
   }
   public void setPrice(int price) {
      this.price = price;
   }
   public int getStockCount() {
      return stockCount;
   }
   public void setStockCount(int stockCount) {
      this.stockCount = stockCount;
   }
   public int getBasketCount() {
      return basketCount;
   }
   public void setBasketCount(int basketCount) {
      this.basketCount = basketCount;
   }
   @Override
   public String toString() {
      return "ProductDTO [PK=" + this.PK + ", productName=" + this.productName + 
    		  ", price=" + this.price + ", stockCount=" + this.stockCount + 
    		  ", basketCount="+ this.basketCount + ",]";
   }
}

 

💖 ProductDAO

package model;
import java.util.ArrayList;
public class ProductDAO {
   
  //멤버변수 설정
  private ArrayList<ProductDTO> productDatas;//전체 상품 배열리스트
   
   
  //기본생성자 생성
  public ProductDAO(){
    this.productDatas = new ArrayList<ProductDTO>();
  //샘플데이터 생성
    //상품 번호, 상품명, 가격, 잔여수량 초기화
   ProductDTO productData1 = new ProductDTO(); //한 상품 객체 선언
   productData1.setPK(101);
    //상품번호: 101~ DTO내 상품 번호 가져오기(get), DAO에 상품 번호 입력(set)      
   productData1.setProductName("사과"); //상품 이름
   productData1.setPrice(1000); //상품 가격
   productData1.setStockCount(20); //잔여 수량
   productDatas.add(productData1);
   
   ProductDTO productData2 = new ProductDTO(); //한 상품 객체 선언
   productData2.setPK(102); //상품번호: 101~   
   productData2.setProductName("귤"); //상품 이름
   productData2.setPrice(1500); //상품 가격
   productData2.setStockCount(5); //잔여 수량
   this.productDatas.add(productData2);

   ProductDTO productData3 = new ProductDTO(); //한 상품 객체 선언
   productData3.setPK(103); //상품번호: 101~
   productData3.setProductName("딸기"); //상품 이름
   productData3.setPrice(1500); //상품 가격
   productData3.setStockCount(0); //잔여 수량
   this.productDatas.add(productData3);

  }
   
  //C(create)R(read)U(update)D(delete)기능
  //ProductDTO produtDTO: 상품DAO 요소(PK, 이름, 가격, 재고 수량) 배열
   
  private boolean insert(ProductDTO productDTO) {
  //기능 미구현으로 hiding
  return false;
  }


  //전체 상품 목록-Read.sellectAll, update 
  //input으로 ProductDTO(상품요소), output으로 productDTO를 반환값으로 받는 함수.
  public ArrayList<ProductDTO> selectAll(ProductDTO productDTO){ 
    System.out.println("model.ProductDAO.SellectAll 전체 상품 목록 시작");  
    ArrayList<ProductDTO> productDatas = new ArrayList<ProductDTO>();//힙메모리에 ProductDTO 타입의 데이터공간 만듦. productDatas변수명에 저장 //Datas객체 생성
    for (ProductDTO productData : this.productDatas) {/*0에서 1씩 증가. productDatas의 크기 이내만큼 참되어 실행문 반복.productData에 넣기*/
      productDatas.add(productData);//productData 받아오기. 받아온 데이터 productDatas에 넣기
      System.out.println("model.ProductDAO.SellectAll 전체 상품 목록 반환");
    }
   return productDatas;//Datas 반환
  }   
   
  // 선택 상품 보내기. 선택 상품을 반환하는 함수.   
  public ProductDTO selectOne(ProductDTO productDTO){//R.sellectOne
    System.out.println("model.ProductDAO.sellectOne 상품 선택 시작");
    for(ProductDTO productData : this.productDatas) {//컨트롤러가 상품 정보 주면, 그 정보와 일치하는 상품 꺼내기
       if(productData.getPK()==productDTO.getPK()){//2. 전체상품 배열에서 인덱스 번호 찾기(선택상품 PK로)
       // 해당 인덱스 번호의 값 반환값으로 내보내기
       System.out.println("model.ProuductDAO.sellectOne 선택 상품 반환");
       return productData; //선택 상품 데이터 반환
       }   
    }return null;
  }
  public boolean update(ProductDTO productDTO) {//상품 구매 재고 수량 업데이트
    System.out.println("model.ProductDAO.update 시작");
   for(ProductDTO productData:productDatas){/*0에서 1씩 증가. productDatas의 크기 이내만큼 참되어 실행문 반복.productData에 넣기*/
     if(productData.getPK()==productDTO.getPK()/*data에 있는 PK와 구매한 PK가 같을 때*/) {
        productData.setStockCount(productDTO.getStockCount());/*c에서 받아온 stockCount를 data의 stockCount에 넣기*/
      System.out.println("model.ProductDAO.update 종료");
      return true;//수량변경완료
     }
   }
   return false;//수량변경 미진행
  }
   /*
     C : 현재재고-장바구니수량
     U : 그냥 받은값으로 변경
   */
      
  private boolean delete(ProductDTO productDTO) {  //기능 미구현으로 hiding
  return false;
  }
}

⬇️ 최종 코드 : View

더보기

💖 LoginView

package view;
/*
1. 로그아웃 
2. 장바구니에 상품 담기 
3. 장바구니에 담긴 상품 목록 출력
4. 장바구니에 담긴 상품 목록 구매
5. 장바구니에서 상품 빼기 
 */

import java.util.ArrayList;

import model.ProductDTO;

// void로 우선 사용 model 완성 후 변경 / 인자값도 넣지 않음
public class LoginView extends View { // 메인에서 abstract class View 선언

   public void menuList () { // 메뉴 출력
      System.out.println("2. 장바구니에 상품 담기");
      System.out.println("3. 장바구니에 담긴 상품 보기");
      System.out.println("4. 장바구니에 있는 상품 구매");
      System.out.println("5. 장바구니에 담긴 상품 삭제");
      System.out.println("6. 로그아웃");
   }
   public int productNum(ArrayList<ProductDTO> datas) { // 상품 번호 입력
      int num; // 스코프 맞추기
      while(true){ // 사용자가 몇번만에 입력할지 몰라 while
         try{ // 사용자의 입력 값이 잘못 될 수 있기 때문에 try로 감쌈
            System.out.println("장바구니에 담을 상품의 번호를 입력해주세요 >> ");
            num=sc.nextInt(); // 입력 받은 값을 저장
         }
         catch(Exception e){ // 오류 코드 이름을 몰라 최상위 클래스인 Exception을 사용
            System.out.println("올바른 상품 번호를 다시 입력해주세요!");
            continue; // 올바른 값을 입력 할 때 까지
         }

         for(ProductDTO data : datas) { // 배열을 비교해서
            if(num==data.getPK()) { // 사용자가 입력한 값이 배열안에 있다면
               if(data.getStockCount() == 0) {// data에 재고가 0이라면 false기 때문에 break를 만나서
                  break; // for문을 종료하고 while문으로 다시 돌아감
               }
               return num;
            }
         }
      }
   }
   // 가독성생각해서 메서드명 정의해보면어떨까?
   public void basketListEmpty() { // 장바구니가 비어있을때 비어있다고 출력해주는 메서드
      System.out.println("장바구니가 비어있습니다..");
   }
   public void basketList(ArrayList<ProductDTO> datas, int sum) { // 담아놓은 장바구니 목록 출력
      if(datas.size()<=0) { // 만약 배열의 크기가 0과 같거나 작다면
         System.out.println("장바구니가 비어있습니다..");
         return;
      }
      // 장바구니에 상품이 있다면 장바구니 목록을 출력
      System.out.println("=== 장바구니 목록 ===");
      for(ProductDTO data:datas) { // 장바구니 배열을 확인하면서
         System.out.println("상품 번호 : "+data.getPK()+" | "+"상품 이름 : "+data.getProductName()+" | "+"상품 가격 : "+data.getPrice()+"원"+" | "+"장바구니에 있는 상품 수량 : "+data.getBasketCount()+"개"); // 상품 정보 출력
      }
      System.out.println("장바구니에 담긴 상품의 총합 : "+sum); // sum은 장바구니 상품의 총합 가격
      // 상품 PK, 상품 이름, 상품 가격, 상품 수량 출력
   }
   // 인자 타입 한글로 정의해두기
   public int productAmount(int stockCount) { // 구매를 원하는 제품 수량 입력 받는 메서드
      int num; // 스코프 맞추기
      if(stockCount==0) {
         System.out.println("상품의 최대 수량을 담았습니다.");
         return 0;
      }
      while(true) {
         try { // 입력 값이 잘 못 될 수 있기 때문에 try
            System.out.println("구매를 원하는 상품의 수량을 입력해주세요 >> ");
            num=sc.nextInt(); // 구매를 원하는 상품의 수량을 저장
         }
         catch(Exception e){ // 오류 코드 이름을 몰라 최상위 클래스인 Exception을 사용
            System.out.println("올바른 상품의 수량을 다시 입력해주세요!");
            continue; // 올바른 값을 입력 할 때 까지
         }
         if(num>stockCount) { // 만약 사용자가 입력한 값이 재고 수량보다 많으면
            System.out.println("선택하신 제품의 재고 수량보다 작은 값을 입력해주세요!");
            continue;
         }
         else if(num<=stockCount && num>0) { // 재고 수량보다 작거나 같은 경우 / 0보다 커야할때
            System.out.println(num+"개의 상품이 장바구니에 담겼습니다!");
            break; // 반복문 종료
         }
         System.out.println("1개 이상의 값을 입력해주세요.."); // 사용자가 -를 입력 할수도 있음
      }
      return num; // 사용자가 입력한 값 반환
   } 
   // 인자 타입 한글로 정의해두기 & 메서드명 가독성 & 메서드 역할 체크
   public void basketAmountCnt(String productName, int basketCount) { // 바구니에 담겨있는 상품의 이름과 수량을 출력해주는 메서드
      System.out.println(productName+"이(가) "+basketCount+"개 담겨있습니다!");
   }
   public int deleteProductList(ArrayList<ProductDTO> datas) { // 담아놓은 상품 삭제 / PK값으로 c한테 전달
      int num; // 스코프 맞추기

      while(true){
         try { // 입력 값이 잘 못 될 수 있기 때문에 try
            System.out.println("삭제를 원하는 상품의 번호를 입력해주세요 >> ");
            num=sc.nextInt(); // 삭제를 원하는 상품의 수량을 저장
         }
         catch(Exception e){ // 오류 코드 이름을 몰라 최상위 클래스인 Exception을 사용
            System.out.println("올바른 상품의 번호를 다시 입력해주세요!");
            continue; // 올바른 값을 입력 할 때 까지
         }
         boolean flag=false; // flag는 false로 시작

         for(ProductDTO data:datas) { // 배열을 확인하면서
            // 배열과 정확한 입력을 할 횟수는 1:1
            // 배열을 확인 할때 잘못 된 값을 입력했다고 출력하는 횟수는 == 배열 전체 값 - 1
            if(num == data.getPK()) { // 사용자가 입력한 값이 있다면 배열안에 있다면
               flag=true; // flag가 true가 되고
               return num;
            }
         }
         if(flag != true) { // flag가 true가 아닐 경우
            System.out.println("장바구니에 없는 상품 번호 입니다.. 다시 입력해주세요!");

         }
      }
   } 


   public int deleteProductAmount(int stockCount) { // 장바구니에 있는 상품을 삭제 할때 수량을 입력 받는 메서드
      int num; // 스코프 맞추기
      while(true) {
         try { // 입력 값이 잘 못 될 수 있기 때문에 try
            System.out.println("삭제를 원하는 상품의 수량을 입력해주세요 >> ");
            num=sc.nextInt(); // 구매를 원하는 상품의 수량을 저장
         }
         catch(Exception e){ // 오류 코드 이름을 몰라 최상위 클래스인 Exception을 사용
            System.out.println("올바른 상품의 수량을 다시 입력해주세요!");
            continue; // 올바른 값을 입력 할 때 까지
         }
         if(num>stockCount || num<=0) { // 장바구니에 있는 수량보다 큰 값 혹은 0과 같거나 작은 값을 입력했을 때
            System.out.println("올바른 상품의 수량을 다시 입력해주세요!");
            continue;
         }
         else { // 입력한 값이 장바구니 수량과 같거나 작다면
            System.out.println(num+"개의 상품이 삭제 되었습니다!");
         }
         break; // 반복문 종료
      }
      return num; // 사용자가 입력한 삭제를 원하는 값을 반환
   }
   public boolean buyProduct() { // 장바구니에 있는 상품 구매
      String ans; // 스코프 맞추기
      while(true) {
         System.out.println("장바구니에 있는 상품을 구매하시겠습니까? (Y / N) >> ");
         ans=sc.next(); // Y / N을 입력 받고 저장

         if(ans.equals("Y") || ans.equals("N")) { // Y 또는 N이 입력되어야
            break; // while문 종료
         }
         System.out.println("[Y / N]으로만 입력해주세요!"); // Y 또는 N이 아니라면 다시 입력하라는 문구 출력
      }
      // 사용자가 입력하는 건 1번이기 때문에 while문 밖으로 보내야함..
      if(ans.equals("Y")) { // 입력한 값이 Y라면
         return true; // true 반환
      }
      return false; // false 반환

   }
   public void buySuccess(String productName, int buyNum) { // 구매에 성공한 상품의 이름과 수량을 사용자에게 보여줌
      System.out.println(productName+"상품을 "+buyNum+"개 구매에 성공했습니다!");
   }
   public void buyFail(String productName, int buyNum) { // 구매에 실패한 상품의 이름을 출력
      System.out.println(productName+"상품을 "+buyNum+"개 구매에 실패했습니다!");
      System.out.println("관리자에게 문의 해주세요");
   }
}

 

💖 LogoutView

package view;

import model.MemberDTO;

public class LogoutView extends View { //로그 아웃 상황에서 보여줄 View

	public void printMenuList() {
		// 로그아웃 상태에서 나오는 메뉴판
		System.out.println("2. 회원가입"); //"회원가입"
		System.out.println("3. 로그인");  //"로그인"
		System.out.println("=====================");
	}

	public MemberDTO inputLoginInfo() {

		// "아이디 입력"
		System.out.println("아이디 입력: ");
		String Id = sc.next();

		// "비밀번호 입력"
		System.out.println("비밀번호 입력: ");
		String Pw = sc.next();

		// 받은 값들로 아이디 비밀번호 set
		MemberDTO data = new MemberDTO();// 반환 타입과 동일한 객체 생성
		data.setMid(Id); // 객체 내 아이디 설정
		data.setPassword(Pw); // 객체 내 비밀번호 설정

		return data;
		// DTO 변수 data로 값 반환
	}

	public void nameInUse() {// 중복아이디 안내 문구
		System.out.println("=================================");
		System.out.println("       동일한 아이디가 존재합니다!      ");
		System.out.println("=================================");
	}

	public String inputNewId() {
		String id;
		while (true) {
			// 신규 회원 가입
			// 아이디 입력 문구
			System.out.println("아이디 입력: ");
			id = sc.next();

			// 이 아이디로 가입을 계속하시겠습니까? (Y/N)
			System.out.println("=================================");
			System.out.println("해당 아이디로 가입 하시겠습니까? (Y/N)");
			System.out.println("=================================");
			System.out.println("입력하신 아이디: " + id); // ID 재확인 UI
			System.out.println("=================================");
			String idAnswer = sc.next(); //아이디 확인에 대한 답변 받기.

			if (idAnswer.equals("Y")) { // 답이 문자 'Y'라면
				break; // 반복문 종료// Id 값을 반환
			} else {
				continue;
			}
		}
		return id;
	}

	public String inputNewPw() {
		String pw;
		String pw2;
		while (true) {
			System.out.println("=================================");
			System.out.println("비밀번호: ");
			System.out.println("=================================");
			pw = sc.next();
			System.out.println("=================================");
			System.out.println("비밀번호 확인: ");
			System.out.println("=================================");
			pw2 = sc.next();
			if (pw.equals(pw2)) {
				System.out.println("=================================");
				System.out.println("           회원가입 성공!           ");
				System.out.println("         즐거운 쇼핑 되세요!          ");
				System.out.println("=================================");
				break;
			} 
			else {
				System.out.println("=================================");
				System.out.println("      비밀번호가 일치하지 않습니다!     ");
				System.out.println("         다시 입력해 주세요!         ");
				System.out.println("=================================");
			}
		}
		return pw;
	}


	public void printLoginSuccess (String id){
		//로그인 성공!
		System.out.println("*********** 로그인 성공! ***********");
		System.out.println("=================================");
		System.out.println("          반갑습니다! " + id + "님!");
		System.out.println("       원하시는 상품을 담아보세요!      "); // 원하시는 상품을 담아보세요!
		System.out.println("=================================");
	}

	public void printLoginFail () {
		//로그인 실패!
		System.out.println("*********** 로그인 실패! ***********");
		System.out.println("=================================");
		System.out.println("         다시 로그인 해주세요!        "); // 원하시는 상품을 담아보세요!
		System.out.println("=================================");
	}
}

 

💖 MainView

package view;


import model.ProductDTO;
import java.util.ArrayList;
import java.util.Scanner;

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

public class MainView extends View {// 추상클래스 View를 상속받은 MainView
    // 로그인/ 아웃 상태 상관없이 출력받을 수 있는
    // 공통 메뉴
    public void printMenuList() { //전체 메뉴 출력문 메서드
        // =======메뉴=======
        System.out.println("======== 메뉴 ========");
        System.out.println("0. 창 닫기");
        System.out.println("1. 상품 목록 출력");
    }

    public void printProductMenu(ArrayList<ProductDTO> datas) { // 상품 품절 여부 검사 및 상태 출력
        System.out.println("================ 상품 목록 출력 ================");
        for (ProductDTO data : datas) {
            if (data.getStockCount()==0){ // import된 Product.dto로부터 상품 고유번호, 이름, 가격, 재고량까지 받아서 출력.
                System.out.println("[상품 번호=" + data.getPK() + ", 상품명=" + data.getProductName() + ", 가격=" + data.getPrice() + " 품절" + "]");
            }
            else{
                System.out.println("[상품 번호=" + data.getPK() + ", 상품명=" + data.getProductName() + ", 가격=" + data.getPrice() + ", 재고 보유량="
                        + data.getStockCount() + "]");
            }
        }
    }

    public int inputMenuNum(int menuSize) { // 메뉴를 입력받을때 사용될 메서드
        int menuInput; //scope 맞춰주기 위해 while문에서 밖으로.
        while (true) {
            // 메뉴 입력 안내문구
            System.out.println("메뉴 입력: ");
            // 메뉴 입력 받고
            menuInput = sc.nextInt();
            // 유효성 검사 후,
            if ((menuInput >= 0) && (menuInput <= menuSize)) { //메뉴 입력 번호가 0과 같거나 크고, 총 길이보다 작거나 같은 떄
                break;// 정수값 반환 및 반복 종료
            }
            else {// 아닐 경우
                continue; // 반복문으로 복귀
            }
        }
        return menuInput;
    }

    public void exit() {// 프로그램 종료 안내문구
        System.out.println("사이트 이용을 종료합니다!");
    }

    public void printTrue() { //일반 성공 문구 출력 메서드
        System.out.println("성공!");
    }

}