[JAVA][조별과제] 03 상품목록 MVC

stan·2023년 6월 4일
0

설계서

3팀 팀프로젝트 과제 설계서



[모델]
[이진, 이성모]

ModelVO, DAO설계서 

class product // 상품
변수
- 인스턴스 변수 : PK, 이름, 가격, 재고 - VO
- 클래스 변수 : PK지정값 - DAO

생성자 - VO
- PK 저장 - DAO에서 받기
- 이름 받고 저장
- 가격 받고 저장
- 재고 받고 저장

메서드
- 판매 - View, DAO
- 재고변경 - View,DAO
- 상품 정보 출력 - View,DAO,VO

getter,setter - VO

main
- 스캐너 - View
- 목차 선택값 저장용 변수 - View
- 생성한 상품 개수 저장용 변수 - DAO

사용자모드 - View
- 목차
- 상품목록출력
- 구매하기
- 프로그램 종료

관리자모드 - View
- 목차
- 상품 추가
- 상품 재고 변경
- 상품 삭제
- 관리자모드 종료

그외
- 유효성 검사 - View
- 예외 처리 - View
- 기능 검사(재고 등) - DAO
- 로그 - DAO
- 사용자편의성 - 전체 다 고려할 것

참고
CRUD

1
2
3
==============================================

※※※※ProductVO※※※※ //상품 데이터 그 자체를 의미함
[멤버변수]

인스턴스 변수 : 
!!! 전부 private !!!
PK int num //PK
이름 String name; //상품이름
가격 int price; //상품가격
재고 int cnt; // 상품재고

[생성자] //멤버변수 초기화

-getter,setter

[메서드]
기능 : 상품목록 출력 할때 번호,이름,가격,재고가 어떻게 보여질지를 정의하는 기능 
INPUT : 없음
OUTPUT : String

toString제정의; 오버라이딩

String msg = "";

if(재고<=0)
	msg PK + 상품이름 + 상품가격 + [품절]
else 
	msg PK + 상품이름 + 상품가격 + 상품재고 

return msg;

※※※※ProductDAO※※※※
!!! 주의할 것 !!!
기능 검사(재고 등)
로그

[멤버변수]
private AL <ProductVO> datas; // 선언; ProductVO 상품데이터 사용할것임
private static int PK = 1001; 선언,초기화

[생성자] 

ProductVO 초기화, 객체
datas=new AL<ProductVO>(); //상품 데이터 초기화
datas.add(new ProductVO(PK++,"상품이름1",가격1,재고1)) //기본상품 추가
datas.add(new ProductVO(PK++,"상품이름2",가격2,재고2)) //기본상품 추가
datas.add(new ProductVO(PK++,"상품이름3",가격3,재고3)) //기본상품 추가

[메서드]
// [메서드_R (read)]
// 기능		: 상품목록 전체 출력 (이름으로 필터검색시 출력)
// INPUT	: ProductVO pVO
// OUTPUT	: ArrayList<ProductVO>
// 함수명		: selectAll (상품전체출력)

//Read
AL<ProductVO> selectAll(){ //전체출력
//searchCondition
	- 이름으로검색!(필터검색)
		-if문
}
// 기능		: 상품 최고가, 최저가 출력
// INPUT	: ProductVO pVO( == personVO)
// OUTPUT	: ArrayList<ProductVO>
// 함수명		: selectOne (상품1개출력)
//Read
ProductVO selectOne(){ //1개 선택출력
//searchCondition
	
	- 최고값검색
	- 최저값검색
		-for문
		-if문

}
// 기능 		: 상품 이름, 가격, 재고를 사용자에게 입력 받아 AL에 저장 하는 기능; PK는 시스템에서 1001번 부터 자동 부여 
// INPUT	: ProductVO
// OUTPUT	: boolean
// 함수명		: insert (상품추가)
//Create
boolean insert(){ //상품추가
	- new AL<모델VO>();
	- .add(new 모델VO(PK++,"상품이름",가격,재고);
	
}

// 기능 		: 사용자가 상품번호와 구매 개수를 입력시 구매 (재고 업데이트);
		  혹은 사용자가 상푼번호와 추가/감소 개수를 입력지 재고 업데이트;
// INPUT	: ProductVO
// OUTPUT	: boolean
// 함수명		: update (상품구매, 상품재고변경)
//Update
boolean update(){ //구매하기,재고변경
	- 사용자 입력값 : 상품번호, 개수
	- for문
	
}
// 기능		: 사용자가 상품번호 입력시 삭제
// INPUT	: ProductVO
// OUTPUT	: boolean
// 함수명		: delete (상품삭제)
//Delete
boolean delete(){ //상품삭제
	- for문
	- remove
}



[뷰]

[김민섭, 이광원, 조재영]

View
Scanner sc = new Scanner(System.in);

예외처리 모듈 만들어서 진행 
tryCatch()


사용자모드

"======[사용자]======\n" + 
"1. 상품목록출력 \n" + 
"2. 구매하기 \n" + 
"3. 상품검색 \n" + 
"4. 최저가검색 \n" + 
"5. 최고가검색 \n" + 	
"6. 프로그램종료\n" + 
"번호 입력 : ");
tryCatch() + 범위 유효성 검사 

사용자 모드에서 사용할 변수
int action == 사용자 메뉴 입력 
int uCnt	== 상품 재고 입력받기
int uNum == 상품 번호 입력 받기
PK번호가 범위에 해당하지 않다면 안내멘트 출력
String uName == 상품 이름 입력 받기 // 이름 검색에 사용 
int uPrice == 최고가, 최저가 검색에 사용

관리자모드
"======[관리자]=====\n" + 
"1. 상품추가 \n" + 
"2. 상품재고변경 \n" + 
"3. 상품삭제 \n" + 
"4. 관리자모드종료\n" + 
"번호 입력 : ");
tryCatch() + 범위 유효성 검사 

관리자 모드에서 사용할 변수
int action == 사용자 메뉴 입력 
int aNum == 상품 번호 입력 받기
PK번호가 범위에 해당하지 않다면 안내멘트 출력
int aCnt	== 상품 재고 입력받기
String aName == 상품 이름 입력받기
int aPrice == 최고가, 최저가 검색에 사용


유저가 입력 시
유효성 체크 중심으로 진행하고
추가적으로 중간 중간 필요한 멘트 출력하도록 만들거임 

※ 주의할것
유효성 검사 
사용 빈도수가 많을 경우  모듈 만드는거 추천


[컨트롤]
[강승찬, 김지훈]

int action=view.printMenu( );

1번 입력시 상품 목록출력
	ArrayList<ProductVO> datas=dao.selectAll(new ProductVO(null));
	view.printProductList(datas);  // view를 통해 datas에 있는것들을 사용자에게 보여줌

2번 입력시 구매하기 
	int num=view.getproductNum( ); // view 에서 상품번호를 입력받아
	int cnt=view.getproductCnt( ); // view 상품재고를 입력받아
	if(dao.update(vo)){ // 성공했을때
		ProductVO data=dao.selectOne(vo); // 저장한 vo를 하나 선택해서 data에 저장
		data.setCnt(cnt); // data에 내가 입력한 재고로 바꿔줘
		// 구매 성공시 카트에 추가
		boolean flag=false 만들어
		int index를 하나 만들고 
		// 내가 저장한 data가 카트에 존재 하는지 확인 ( for문 )
		// flag=true로 바꾸어주어 바로 나갈수있게
 		if (  ) { // 카트안에 존재한다면
			// 카트의 재고 + cnt(내가 입력한 재고)
		}
		else{ // 카트안에 존재하지 않는다면
			cart .add( ); // 카트에 데이터 추가
		}
		// 카트안에 있는 목록 출력해서 보여주기
		view.success // 성공했을때 view를 통해 사용자한테 알리기
	}
	else{ // 실패했을때
		view.fail // 실패했을때 view를 통해 사용자한테 알리기
	}
3번 입력시 검색하기
	// 검색시작!
	String name=view.getProductName( ); // 이름을 입력받아
	ArrayList<ProducVO> datas=dao.selectAll(new ProducVO(0,name,0,0));
	// selectAll에서 name이 들어가있는것들을 찾아서 datas에 저장해줘
	view.printProductList( datas ); // datas에 저장되어있는것들 다 보여줘

4번 입력시 최고가 상품 검색하기
	ProductVO vo= clienw.getSearchMax(); 
	       // new ProductVO(0,"최고가",maxPrice,0) 이름에 "최고가" 라고 저장해놓은걸 받아옴
	pDAO.selectOne(vo) // vo를 이용해 selcetOne 실행-> datas에 저장
	client.printProduct(datas);
	// view를 통해 datas안에 저장된 내용 사용자한테 보여주기

5번 입력시 최저가 상품 검색하기
	ProductVO vo= clienw.getSearchMin(); 
	       // new ProductVO(0,"최고가",minPrice,0) 이름에 "최저가" 라고 저장해놓은걸 받아옴
	pDAO.selectOne(vo) // vo를 이용해 selcetOne 실행-> datas에 저장
	client.printProduct(datas);
	// view를 통해 datas안에 저장된 내용 사용자한테 보여주기
6번 입력시 프로그램 종료
	view.printMenuEnd( ); // 프로그램 종료라고 알려줘
	break;

1234번 입력시 관리자 모드
    while{   } // 관리자 모드 에서만 돌도록
	// view에서 관리자 모드 시작 출력
	// view에서 관리자 모드 메뉴 출력
	1번 입력시 상품추가 
	String name=view.getProductName( ); // 상품의 이름받아
	int price=view.getProducPrice( ); // 상품의 가격받아
	int cnt=view.getProductCnt( ); // 상품의 재고받아
         ProductVO vo=new ProductVO( 0 , name , price , cnt ); // numPK은 입력x  0으로 두고저장
	if( pDAO.insert(vo) ) { 
	// 입력받은 vo를 써서 추가해달라고 dao한테 부탁
	// 상품추가가 리스트 출력하고 성공한다면
		view.success( ); // 관리자한테 알려줘
	}
	else{ // 상품추가가 실패했다면
		view.fail( ); // 실패했다고 관리자한테 알려줘 
	}
	2번 입력시 상품재고변경
	     int num=view.getProductNum( ); // 재고변경할 상품의 번호를 입력 받아
	     int cnt = view.getProductCnt( ); // 재고변경할 갯수를 입력 받아
	  Product vo=new ProductVO(num,null,0,cnt); // vo에 삭제할 상품의 번호를 저장해
	 if (pDAO.update(vo)) { // vo를 사용해서 update 진행해줘
			// 성공했으면 리스트 출력하고
		view.success( ); // 관리자한테 알려줘
	}
	 else{ // 실패한다면
		view.fail( ); // 실패했으면 실패했다고 관리자한테 알려줘
	}
	3번 입력시 상품삭제 
		int num=view.getProductNum( ); // 삭제할 상품의 번호를 입력 받아
	         Product vo=new ProductVO(num,null,0,0); // vo에 삭제할 상품의 번호를 저장해
		if(pDAO.delete(vo)){ // 만약 dao.delete가 성공했다면
			// 성공했으면 리스트 출력하고
			view.success( ); // 관리자한테 알려줘
		}
		else{ // 실패한다면
			view.fail( ); // 실패했으면 실패했다고 관리자한테 알려줘
		}

	4번 입력시 관리자 모드종료
		view.printAdminMenuEnd( ); // 관리자종료라고 알려줘 
		break;

	// 사용자 로그오프 안내문구
	// cart안에 저장된 데이터 비우기

AdminView

package view;

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

import model.ProductVO;


public class AdminView {
	private static Scanner sc = new Scanner(System.in);

	//숫자입력 유효성 검사
	public int tryCatch() { // 입력받을때마다 진행할 예정
		while (true) {
			try {
				int action = sc.nextInt();
				return action;
			} catch (Exception e) {
				sc.nextLine();
				System.out.println("정수로 입력해주세요!");
			}
		}
	}


	// 상품 목록 출력
	public void printProductList(ArrayList<ProductVO> datas) {
		for (ProductVO v : datas) {
			System.out.println(v);
		}
	}
	//관리자 모드 메뉴 출력
	public int printAdminMenu() {
		System.out.println();
		System.out.println("======[관리자]=====\n" 
				+ "1. 상품추가 \n" 
				+ "2. 상품재고변경 \n" 
				+ "3. 상품삭제 \n" 
				+ "4. 관리자모드종료"); 
		System.out.print("번호 입력 : ");
		//관리자 모드 접속 유효성
		while(true) {
			int action = tryCatch();
			if(action > 4 || action < 1) {
				System.out.print("다시 입력 해 주세요 : ");
				continue;
			}
			return action;
		}
	}
	// 상품 번호 입력
	public int getProducNum(ArrayList<ProductVO> mdatas) {
		ArrayList<ProductVO> vo=new ArrayList<ProductVO>(mdatas);
		while(true) {
			System.out.print("상품번호입력) "); 
			int num = tryCatch();
			boolean flag = false;
			for(int i=0 ;i <vo.size();i++) {
				if(num>=1001 && num<=vo.get(i).getNum()) {
						num=vo.get(i).getNum();
						flag=true;
						break;

					}
				}
				if(!flag) {
					System.out.println("해당상품은 존재하지 않습니다.");
					continue;
				}
				return num;
			}
		}
		// 상품 이름 입력
		public String getProductName() { 
			System.out.print("상품이름입력) ");
			String uName = sc.next();
			return uName;
		}
		// 상품 가격 입력
		public int getProductPrice() {
			System.out.print("상품가격입력) ");
			while(true) {
				int uPrice = tryCatch();  
				if(uPrice < 0) {
					System.out.print("양수로 다시 입력 해 주세요 : ");
					continue;
				}
				return uPrice;
			}
		}
		// 상품 재고 입력
		public int getProductCnt() {
			System.out.print("상품재고입력) ");
			int uCnt = tryCatch();  
			return uCnt;
		}
		//관리자 모드 시작 안내문
		public void printAdminStart() {
			System.out.println();
			System.out.println("=== 관 리 자 모 드 시 작 ===");
		}
		//관리자 모드 종료 안내문
		public void printAdminEnd() {
			System.out.println();
			System.out.println("=== 관 리 자 모 드 종 료 ===");
		}

		// 상품 추가 시작 안내문
		public void addProductStart() {
			System.out.println();
			System.out.println("=== 상 품 추 가 시 작 ===");
		}
		//상품 추가 실패 안내문
		public void addProductFail(){
			System.out.println();
			System.out.println("=== 상 품 추 가 실 패 ===");

		}
		//상품 추가 종료 안내문
		public void addProductEnd() {
			System.out.println();
			System.out.println("=== 상 품 추 가 종 료 ===");
		}

		// 재고 변경 시작 안내문
		public void changeProductStart() {
			System.out.println();
			System.out.println("=== 재 고 시 작 ===");
		}
		//재고 변경 종료 안내문
		public void changeProductEnd() {
			System.out.println();
			System.out.println("=== 재 고 변 경 종 료 ===");
		}

		// 상품 삭제 시작 안내문
		public void deleteProductStart() {
			System.out.println();
			System.out.println("=== 상 품 삭 제 시 작 ===");
		}
		//상품 삭제 종료 안내문
		public void deleteProductEnd() {
			System.out.println();
			System.out.println("=== 상 품 삭 제 종 료 ===");
		}
		//업데이트 성공 안내문
		public void updateTrue(){
			System.out.println();
			System.out.println("=== 업 데 이 트 성 공 ===");
		}
		//업데이트 실패 안내문
		public void updateFalse(){
			System.out.println();
			System.out.println("=== 업 데 이 트 실 패 ===");
		}



	}

ClientView

package view;

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

import model.MemberVO;
import model.ProductVO;



public class ClientView {

	private static Scanner sc = new Scanner(System.in);

	//숫자 입력 유효성 검사
	public int tryCatch() { // 입력받을때마다 진행할 예정
		while (true) {
			try {
				int action = sc.nextInt(); // 잘못입력했을때
				return action;
			} catch (Exception e) {
				sc.nextLine();
				System.out.println("정수로 입력해주세요!");
			}
		}
	}

	// 상품 재고 입력
	public int getProductCnt() {
		System.out.print("상품재고입력) ");
		while(true) {
			int uCnt = tryCatch();   
			if(uCnt < 0) {
				System.out.print("양수로 다시 입력 해 주세요 : ");
				continue;
			}
			return uCnt;
		}
	}
	// 상품 가격 입력
	public int getProductPrice() {
		System.out.print("상품가격입력) ");
		while(true) {
			int uPrice = tryCatch(); 
			if(uPrice < 0) {
				System.out.print("양수로 다시 입력 해 주세요 : ");
				continue;
			}
			return uPrice;
		}
	}
	// 상품번호 입력
	/// 
	public int getProducNum(ArrayList<ProductVO> mdatas) {
		ArrayList<ProductVO> vo=new ArrayList<ProductVO>(mdatas);
		while(true) {
			System.out.print("상품번호입력) "); 
			int num = tryCatch();
			boolean flag = false;
			for(int i=0 ;i <vo.size();i++) {
				if(num>=1001 && num<=vo.get(i).getNum()) {
					if(vo.get(i).getCnt()==0) {
						System.out.println("해당상품은 품절입니다.");
						return -1;
					}
					else {
						num=vo.get(i).getNum();
						flag=true;
						break;
					}
				}
			}
			if(!flag) {
				System.out.println("해당상품은 존재하지 않습니다.");
				continue;
			}
			return num;
		}
	}
	// 최고가 검색
	public ProductVO getSearchMax() { 
		System.out.println();
		System.out.println("=== 최 고 가 검 색 ===");
		ProductVO pVO=new ProductVO(0,"최고가",0,0);
		// searchCondition
		return pVO;
	}
	// 최저가 검색
	public ProductVO getSearchMin() {
		System.out.println();
		System.out.println("=== 최 저 가 검 색 ===");
		ProductVO pVO=new ProductVO(0,"최저가",0,0);// searchCondition
		return pVO;
	}
	// 상품 이름으로 검색
	public void printSearchContent() {
		System.out.println();
		System.out.println("=== 상품 검색 시 작 ===");
	}
	public String getSearchContent() {
		System.out.println();
		System.out.println("=== 이 름 으 로 검 색 ===");
		System.out.print("검색어입력) ");
		String name=sc.next();
		return name;
	}
	// 유저 입장 안내문
	public void printUserJoin() {
		System.out.println("사용자가 입장했습니다.");
	}

	// 사용자 메뉴 출력
	public int printClientMenu01() {
		System.out.println();
		System.out.println("=== 프 로 그 램 모 드 ===");
		System.out.println("1. 회원가입");
		System.out.println("2. 로그인");
		System.out.println("3. 프로그램 종료");
		System.out.print("입력) ");
		return sc.nextInt();
	}
	
	public MemberVO signUp() {
		System.out.println();
		System.out.println("=== 회 원 가 입 ===");
		System.out.print("아이디입력) ");
		String mid=sc.next();
		System.out.print("비밀번호입력) ");
		String mpw=sc.next();
		System.out.print("이름입력) ");
		String name=sc.next();
		return new MemberVO(mid,mpw,name);
	}
	
	public int printUserMenu(MemberVO mVO) {// 사용자모드 화면 선택창
		System.out.println();
		System.out.println("======[사용자]======\n" 
				+"현재 로그인한 사용자이름 ["+mVO.getName()+"] \n"
				+ "1. 상품목록출력 \n" 
				+ "2. 구매하기 \n"
				+ "3. 이름으로 검색\n"
				+ "4. 최고가 검색 \n"
				+ "5. 최저가 검색 \n"
				+ "6. 로그아웃 \n"
				+ "7. 회원탈퇴 ");
		System.out.print("번호 입력 : ");
		//사용자 모드 접속 유효성
		while(true) {
			int action = tryCatch();
			if(action <=7 && action >= 1 || action==1234) {
				return action;
			}
			else
				System.out.println("다시 입력 해 주세요 : ");
			continue;
		}
	}

	// 상품 목록 출력 + 유효성 검사
	//select All
	// 배열 비교해서 검사
	public void printProductList(ArrayList<ProductVO> mdatas) {
		System.out.println();
		if (mdatas.isEmpty()) {
			System.out.println("=== 상품이 없습니다.! ===");
			return;
		}
		System.out.println("=== 상 품 목 록 ===");
		for (ProductVO mdata : mdatas) {
			System.out.println(mdata);
		}
	}
	//select One
	// 상품 목록 출력    
	// 한개만 가져오면 되니까
	public void printProduct(ProductVO vo){
		System.out.println(vo);
	}

	// 구매 시작 안내문
	public void buyProductStart() {   
		System.out.println();
		System.out.println("===구 매 시 작===");
	}
	// 구매 실패 안내문
	public void buyFail() {
		System.out.println();
		System.out.println("=== 구 매 실 패 ===");
	}

	public void buyProductEnd() {   // 
		System.out.println();
		System.out.println("===구 매 완 료===");
	}
	// 사용자 모드 시작 안내
	public void printClientStart() {
		System.out.println();
		System.out.println("=== 사 용 자 모 드 시 작 ===");
	}
	// 사용자 모드 종료 안내
	public void printClientEnd() {
		System.out.println();
		System.out.println("=== 사 용 자 모 드 종 료 ===");
	}
	// 장바구니 시작 안내
	public void cartStart() {
		System.out.println();
		System.out.println("=== 장 바 구 니 에 담 기  ===");
	}
	// 장바구니 목록 출력
	public void printcartList(ArrayList<ProductVO> mdatas) {
		System.out.println();
		if (mdatas.isEmpty()) {
			System.out.println("=== 상품이 없습니다.! ===");
			return;
		}
		System.out.println("=== 상 품 목 록 ===");
		for (ProductVO mdata : mdatas) {
			System.out.println(mdata);
		}
	}
	// 장바구니 종료 안내
	public void cartEnd() {
		System.out.println();
		System.out.println("=== 장 바 구 니 담 기 종 료 ===");
	}   
	// 상품 번호 불일치 경우 출력
	public void printNumMisMatch() {
		System.out.println("없는 상품번호입니다.");
	}
	//회원가입 성공,실패
	public void signUpTrue() {
		System.out.println();
		System.out.println("회원가입 성공!");
	}
	public void signUpFalse() {
		System.out.println();
		System.out.println("회원가입 실패...");
	}
	
	//로그인 화면, 성공, 실패
	public MemberVO signIn() {
		System.out.println();
		System.out.println("=== 로 그 인 ===");
		System.out.print("아이디입력) ");
		String mid=sc.next();
		System.out.print("비밀번호입력) ");
		String mpw=sc.next();
		return new MemberVO(mid,mpw,null);
	}
	public void signInTrue() {
		System.out.println();
		System.out.println("로그인 성공!");
	}
	public void signInFalse() {
		System.out.println();
		System.out.println("로그인 실패...");
	}
	//로그아웃
	public void logout() {
		System.out.println();
		System.out.println("=== 로 그 아 웃 ===");
	}
	// 프로그램종료
	public void printPwrOff() {
		System.out.println("프로그램을 종료합니다");
	}
	
	//비밀번호확인
	public String getMpw() {
		System.out.println();
		System.out.println("=== 비 밀 번 호 확 인 ===");
		System.out.println("비밀번호입력) ");
		String mpw=sc.next();
		return mpw;
	}
	public void printFalse() {
		System.out.println("비밀번호불일치");
	}
	
	//회원탈퇴 성공,실패
	public void printMemberDeleteTrue(){
		System.out.println();
		System.out.println("회원탈퇴성공");
	}
	public void printMemberDeleteFalse() {
		System.out.println();
		System.out.println("회원탈퇴실패");
	}
}

MemberVO

package model;

public class MemberVO {
	private String mid; // PK
	// : 일반적으로 PK는 시스템에서 부여함
	// : 사용자가 등록 --->> 중복검사필수 ☆
	private String mpw;
	private String name;
	public MemberVO(String mid,String mpw,String name) {
		this.mid=mid;
		this.mpw=mpw;
		this.name=name;
	}
	

	public String getMid() {
		return mid;
	}

	public void setMid(String mid) {
		this.mid = mid;
	}

	public String getMpw() {
		return mpw;
	}

	public void setMpw(String mpw) {
		this.mpw = mpw;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return this.name+"님";
	}

	@Override
	public boolean equals(Object obj) {
		// 아이디(mid)가 같다면, 같은객체!
		MemberVO mVO=(MemberVO)obj;
		if(this.mid.equals(mVO.mid)) {
			//pk가 같다면 동일한 객체다!
			return true;
		}
		return false;
	}
}

MemberDAO

package model;

import java.util.ArrayList;

public class MemberDAO {
	// 회원목록출력
	// 회원가입,로그인,로그아웃,마이페이지,회원탈퇴
	
	//멤버변수
	private ArrayList<MemberVO> datas;
	
	//생성자
	public MemberDAO () {
		datas=new ArrayList<MemberVO>();
		datas.add(new MemberVO("admin","1234","관리자"));
	}
	public ArrayList<MemberVO> selectAll(MemberVO mVO){
		return datas;
	}
	public MemberVO selectOne(MemberVO mVO){
		for(MemberVO v : datas) { 
			if(mVO.getMid().equals(v.getMid())) {//내가받은값이 datas에 있어?
				if(mVO.getMpw().equals(v.getMpw())) {//비밀번호확인해보기
					return v;//반환
				}
				System.out.println(" 로그: MemberDAO: selectOne(): 비밀번호가 일치하지않습니다!");
				return null;
			}
		}
		System.out.println(" 로그: MemberDAO: selectOne() : 해당 아이디가 없습니다!");
		return null;
	}
	
	public boolean insert(MemberVO mVO) {
		boolean flag=false;
		for(MemberVO data:datas) {
			if(data.equals(mVO)) {
				flag=true;
				System.out.println(" 로그: MemberDAO: insert(): 아이디 중복");
				break;
			}
		}
		if(flag) {
			return false;
		}
		datas.add(new MemberVO(mVO.getMid(),mVO.getMpw(),mVO.getName()));
		/*
		1) datas.add(new MemberVO());
		 -> datas DB공간에 new 새로운 데이터를 추가
		2) MemberVO(데이터1,데이터2,데이터3)
		 -> 데이터들을 mVO에서 추출하면됨
		*/
		return true;
	}
	public boolean update(MemberVO mVO) {
		//비밀번호변경
		
		return true;
	}
	public boolean delete(MemberVO mVO) {
		for(int i=0; i<datas.size();i++) {
			if(datas.get(i).equals(mVO)) {
				datas.remove(i);
				return true;
			}
		}
		return true;
	}
}

ProductVO

package model;

public class ProductVO {
	//멤버변수
	int num; //PK (시스템에서 자동 부여)
	String name; //상품이름
	int price; //상품가격
	int cnt; // 상품재고

	//생성자
	public ProductVO(int num,String name,int price,int cnt) {
		this.num=num;
		this.name=name;
		this.price=price;
		this.cnt=cnt;
	}
	//getter, setter
	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}

	public int getCnt() {
		return cnt;
	}

	public void setCnt(int cnt) {
		this.cnt = cnt;
	}

	//출력 메서드
	@Override
	public String toString() {
		String msg="";
		if(cnt<=0) {
			msg=num+". "+name+" "+price+"원 [품절]";
		}
		else {
			msg=num+". "+name+" "+price+"원 ["+cnt+"]";
		}
		return msg;
	}



}

ProductDAO


// [import]
// 1. ArrayList << ArrayList를 통한 배열생성 위해.
// 2. ProductVO << 해당값을 사용하기 위해.
package model;
import java.util.ArrayList;
//--------------------------------------------------------------------------------------------------------------------------------------------------
//[DAO(data access of object)]
//※ 고려사항.
//1. CRUD(비즈니스 메서드, 핵심 로직)
//1-1. C (create)	: 상품추가.
//1-2. R (read)	: 상품전체출력-필터검색, 상품1개출력-최고가,최저가.
//1-3. U (update)	: 상품구매, 상품재고변경.
//1-4. D (delete)	: 상품삭제.
//
//2. (C,U,D) OUTPUT : boolean Type << '성공실패' 반환여부를 위해 사용.
//		      INPUT	 : ProductVO vo << '응집도'를 높이기 위해 사용.
//
//3. ProductDAO는 main(); 미생성.
//4. 로그들만 출력 가능, 나머지 출력들은 view에서 가능.
//>> 로그는 나중에 주석으로 제거한다. 사용자한테는 안보여진다.
public class ProductDAO { 
	//--------------------------------------------------------------------------------------------------------------------------------------------------
	// [멤버변수]
	// ※ 고려사항
	// 1. PK는 사용자로부터 입력받으면 안된다.
	//	  ID를 입력받을수는 있으나, 반드시 "중복검사"를 한다.
	//    해당 과제에서는 "중복검사"를 안할예정이므로, '시스템'에서 int값을 부여한다.
	//    PK(상품번호)값에 'final'을 넣지 않는 이유는 여기서 PK(상품번호)값은 증가하기 때문이다.
	private ArrayList<ProductVO> datas;
	private static int PK=1001;
	//--------------------------------------------------------------------------------------------------------------------------------------------------
	// [생성자]
	// ※ 3조의 경우 기본상품 데이터를 추가한 상태.
	public ProductDAO() {
		datas=new ArrayList<ProductVO>(); //상품 데이터 초기화
		datas.add(new ProductVO(PK++,"물",1000,10)); //기본상품 추가
		datas.add(new ProductVO(PK++,"멘토씨리즈자바",2000,10)); //기본상품 추가
		datas.add(new ProductVO(PK++,"마스크KF99",3000,10)); //기본상품 추가
	}// << 생성자 생명주기 종료.

	//--------------------------------------------------------------------------------------------------------------------------------------------------
	// [메서드_C (create)]
	// INPUT	: ProductVO
	// OUTPUT	: boolean
	// 함수명		: insert (상품추가)
	public boolean insert(ProductVO vo){ //상품추가
		datas.add(new ProductVO(PK++,vo.getName(),vo.getPrice(),vo.getCnt()));// : 상품추가시 PK++을 통한 번호증가. 
		return true;
	}// << insert(create) 생명주기 종료.
	//--------------------------------------------------------------------------------------------------------------------------------------------------
	// [메서드_R (read)]
	// INPUT	: ProductVO pVO
	// OUTPUT	: ArrayList<ProductVO>
	// 함수명		: selectAll (상품전체출력)
	//

	// ※ 'selectAll' 고려사항
	// 1. '전체목록출력' : 내가가진 전체목록출력을 통해 보여주는 경우. == 내가가진 멤버변수 productDatas 반환.
	//    '검색결과출력' : 검색결과를 새로만들어서 보여주는 경우. == 상품이름을보고, 그 상품이름을 가진 데이터를 반환.
	//				 : == 새로운 데이터를 만들어서, 상품이름을 가진 데이터를 넣어서 반환. << 'mdatas' 생성.
	//	  => selectAll은 '전체목록출력'과 '검색결과출력' 사용이 가능하다.
	// 2. '필터검색'( == searchCondition) 사용.
	//				 : '필터검색'은 상품
	// 3. 높은 '응집도'를 위해 여러기능을 하나의 메서드에서 작성.
	// >> INPUT : "ProductVO pVO"
	// >> "필터검색"은 가격검색해서 여러개가 나오기 때문에, selectAll()에서 구현한다.
	//
	// ※ 코드의미전달
	// 1. pVO.getProductName() : 사용자가 검색한 단어(검색어).
	public ArrayList<ProductVO> selectAll(ProductVO pVO){ // : '검색결과출력'은 'selectAll'을 사용.
		if(pVO==null) {// : pVO(사용자)가 별다른 검색을 안한 경우. (pVO가 null인 이유는 C에서 상품전체검색할때 null값을 주기 때문이다.)
			return datas;// : (내 데이터)를 return을 통한 반환.
		}
		else if(pVO.getName().equals("필터검색")) { // searchCondition // : 사용자가 "필터검색"을 통해 상품이름을 검색한 경우.
			ArrayList<ProductVO> mdatas=new ArrayList<ProductVO>();// : 반환해줄 배열을 생성.
			for(ProductVO data:datas) { // : 내 데이터(this.datas)의 있는 것들을 for문을통한 반복 비교.
				if(pVO.getPrice() <= data.getPrice() && data.getPrice() <= pVO.getCnt()) {// : 가겨범위에 들어가는 데이터인지 확인.
					mdatas.add(data);// : 'data'의 값을 add 함수를 통해 저장.
				}
			}
			return mdatas;// : '검색결과(searchDatas)'를 return(반환). 
		}
		else {// : '상품이름으로검색'한 경우. << '상품목록출력'을 할때에는 인자(pVO)가 null이므로, pVO가 null이 아니라면 '상품이름으로검색'이다.
			// '상품목록출력'을 할때에는 인자(pVO)가 null이므로
			// pVO가 null이 아니라면 '이름으로검색'임!
			ArrayList<ProductVO> mdatas=new ArrayList<ProductVO>();// : 반환해줄 배열을 생성.
			for(ProductVO data:datas) {// : 내 데이터(this.datas)의 있는 것들을 "향상된 for문"을통한 반복 비교.
				if(data.getName().contains(pVO.getName())) {// : 현재보고있는 데이터의 이름이 검색어를 포함하고 있는지 확인.
					// pVO.getName() == 사용자가 검색한 단어
					mdatas.add(data);// : 'data'의 값을 add 함수를 통해 저장.
				}
			}			
			return mdatas;// : '검색결과'를 return(반환).
		}
	}// << selectAll() 생명주기 종료.

	//--------------------------------------------------------------------------------------------------------------------------------------------------
	// [메서드_R (read)]
	// INPUT	: ProductVO pVO( == personVO)
	// OUTPUT	: ArrayList<ProductVO>
	// 함수명		: selectOne (상품1개출력)
	//
	// ※ 'selectOne' 고려사항
	// 1. 최고가 검색, 최저가 검색에 사용.
	// 2. selectOne()의 인자로 안쓰는 인자를 사용.
	// >> 'searchCondition'이라고 한다.
	public ProductVO selectOne(ProductVO pVO){  // : '최고가' 및 '최저가'은 'selectOne'을 사용.
		//searchCondition
		//	- 최고값검색
		for(ProductVO data:datas) {
			if(data.getNum()==pVO.getNum()) {
				ProductVO p2VO=new ProductVO(data.getNum(),data.getName(),data.getPrice(),data.getCnt());				
				return p2VO;
				// 실제 DB 데이터(==datas)를 전송 xxxxx
				// 새로 vo객체를 new(객체화)해서 전송 O
			}
		}
		if(pVO.getName().equals("최고가")) { // : 사용자가 최고가 검색을 하는 경우. (searchCondition 활용)
			int max=datas.get(0).getPrice();// : '최고가' 변수 선언 및 저장.
			int maxIndex=0;// : '최고가인덱스방'의 변수 선언 및 초기화.
			for(int i=1;i<datas.size();i++) {// : datas 크기만큼 비교 반복. 
				if(max<datas.get(i).getPrice()) {// : '최고가'가 productDatas의 i번째방의 상품가격보다 작은지비교. 
					max=datas.get(i).getPrice();// : if문이 true일때.
					maxIndex=i;// : 해당 index i를 'maxPriceIndex'에 저장.	
				}
			} 
			return datas.get(maxIndex);// : 찾은 '최고가상품'을 반환.
		}// << '최고가검색' 생명주기 종료.
		//	- 최저값검색
		else if(pVO.getName().equals("최저가")) {// : 사용자가 최저가 검색을 하는 경우. (searchCondition 활용)
			int min=datas.get(0).getPrice();// : '최저가' 변수 선언 및 productDatas.get(0).getProductPrice() 저장.
			int minIndex=0;// : '최저가인덱스방'의 변수 선언 및 초기화.
			for(int i=1;i<datas.size();i++) {// : productDatas의 방의 크기만큼 비교 반복. (향상된 for문)
				if(min>datas.get(i).getPrice()) {// : '최저가'가 productDatas의 i번째방의 상품가격보다 큰지비교.
					min=datas.get(i).getPrice();// : if문이 true일때.
					minIndex=i;// : 해당 index i를 'maxPriceIndex'에 저장.
				}
			}
			return datas.get(minIndex);// : 찾은 '최고저상품'을 반환.
		}// << '최저가검색' 생명주기 종료.
		return null;// : 해당값이 존재하지 않으면 로그 반환.
	}// << selectOne() 생명주기 종료.
	//--------------------------------------------------------------------------------------------------------------------------------------------------
	// [메서드_U (update)]
	// INPUT	: ProductVO
	// OUTPUT	: boolean
	// 함수명		: update (상품구매, 상품재고변경)
	//
	// ※ '상품구매' 고려사항
	// 1. 상품구매시, 절대값이랑 내 재고랑 비교.
	//
	// ※ '상품재고변경' 고려사항
	// 1. 상품번호를 V에서 사용자가 입력.
	// 2. V에서 사용자가 재고변경할 숫자를 입력(음수 or 양수).
	// 
	// ※ 코드의미전달
	// 1. purchaseCnt	: 상품구매 변수명.
	// 2. changeCnt		: 상품재고변경 변수명.
	public boolean update(ProductVO vo){ // : 상품업데이트(상품구매, 상품재고변경) 
		for(ProductVO data:datas) {// : 나의 상품데이터 전체 반복비교.
			if(data.getNum()==vo.getNum()) {// : 상품구매
				// 구매할때에는 절대값이랑 내 재고랑 비교
				if(vo.getCnt()<0) {  // 구매할때
					int cnt=vo.getCnt()*(-1); // : -1을 곱하여서 음수값을 양수값으로 바꿔준다.
					if(cnt<=data.getCnt()) {
						return false;// : false 반환.
					}
					data.setCnt(data.getCnt()+vo.getCnt());
					return true;
				}
				//재고변경
				//상품번호를 V에서 사용자가 입력
				//V에서 사용자가 재고변경할 수 입력(음수나 양수)
				//남은 제고 5면 사용자가 재고변경숫자를 뭐 10으로 바꿔
				if(vo.getCnt()>0) {// : 상품재고변경(현재고에서 바꿀재고로 변경)
					int cnt=vo.getCnt();// : -1을 곱하여서 음수값을 양수값으로 바꿔준다.
					data.setCnt(data.getCnt()+cnt);// : 나온값을 data에 저장.
					return true;
				}
			}
		}
		System.out.println("로그 : update(): 해당상품없음");
		return false;// 상품번호 없으면 false 반환.
	}// << update() 생명주기 종료.
	//--------------------------------------------------------------------------------------------------------------------------------------------------
	// [메서드_D (delete)]
	// INPUT	: ProductVO
	// OUTPUT	: boolean
	// 함수명		: delete (상품삭제)
	public boolean delete(ProductVO vo){ // : 해당상품번호 삭제.
		for(int i=0;i<datas.size();i++) {// : 상품데이트의 크기만큼 반복.
			if(datas.get(i).getNum()==vo.getNum()) { // : 삭제하고자하는값 찾은경우.
				datas.remove(i);// : 해당 index i번째방의 데이터값 삭제.
				return true;// : true값 반환.
			}
		}
		return false;
	}// << delete() 생명주기 종료.
}// << public class ProductDAO 생명주기 종료.

Ctrl

package ctrl;

import java.util.ArrayList;

import model.MemberDAO;
import model.MemberVO;
import model.ProductDAO;
import model.ProductVO;
import view.AdminView;
import view.ClientView;

public class Ctrl {
	private MemberDAO mDAO;
	private ProductDAO pDAO;
	private AdminView admin;
	private ClientView client;
	private MemberVO member; //현재 로그인한 회원정보 <<상단배치 해도 됨 
	public Ctrl() {
		mDAO=new MemberDAO();
		pDAO=new ProductDAO();
		admin=new AdminView();
		client=new ClientView();
		member=null;// 세션로그인데이터
		// 컨트롤러가 생긴다고 해서 로그인한 회원이 생기는건 아니기 때문에 초기화 하지 않음
		// 프로그램을 실행한다고해서, 자동로그인이되지는않기때문에
	}

	public void startApp() {
		while(true) {
			int action=client.printClientMenu01();
			if(action == 1234) {//1234번 입력시 관리자 모드
				admin.printAdminStart();
				while(true) {
					action = admin.printAdminMenu();
					if(action == 1) {//1번 입력시 상품추가 
						String name=admin.getProductName( ); // 상품의 이름받아
						int price=admin.getProductPrice( ); // 상품의 가격받아
						int cnt=client.getProductCnt( ); // 상품의 재고받아
						ProductVO vo=new ProductVO( 0 , name , price , cnt ); // numPK은 입력x  0으로 두고저장
						if( pDAO.insert(vo) ) { 
							// 입력받은 vo를 써서 추가해달라고 dao한테 부탁
							// 상품추가가 성공한다면
							ArrayList<ProductVO> datas=pDAO.selectAll(null);
							client.printProductList(datas);
							admin.addProductEnd(); // 성공했다고 관리자한테 알려줘
						}
						else{ // 상품추가가 실패했다면
							admin.addProductFail(); // 실패했다고 관리자한테 알려줘 
						}
					}
					else if (action == 2) {//2번 입력시 상품재고변경
						ArrayList<ProductVO> datas=pDAO.selectAll(null);
						int num=admin.getProducNum( datas ); // 재고변경할 상품의 번호를 입력 받아
						int cnt = admin.getProductCnt( ); // 재고변경할 갯수를 입력 받아
						ProductVO vo=new ProductVO(num,null,0,cnt); // vo에 삭제할 상품의 번호를 저장해
						if (pDAO.update(vo)) { // vo를 사용해서 update 진행해줘
							ArrayList<ProductVO> data=pDAO.selectAll(null);
							client.printProductList(data);
							admin.updateTrue( ); // 성공했으면 했다고 관리자한테 알려줘
						}
						else{ // 실패한다면
							admin.updateFalse( ); // 실패했으면 실패했다고 관리자한테 알려줘
						}
					}
					else if(action == 3) {//3번 입력시 상품삭제 
						ArrayList<ProductVO> datas=pDAO.selectAll(null);
						int num=admin.getProducNum(datas); // 삭제할 상품의 번호를 입력 받아
						ProductVO vo=new ProductVO(num,null,0,0); // vo에 삭제할 상품의 번호를 저장해
						if(pDAO.delete(vo)){ // 만약 dao.delete가 성공했다면
							client.printProductList(datas);
							admin.updateTrue( ); // 성공했으면 했다고 관리자한테 알려줘
						}
						else{ // 실패한다면
							client.printNumMisMatch();
							admin.updateFalse( ); // 실패했으면 실패했다고 관리자한테 알려줘
						}
					}
					else if(action == 4) {//4번 입력시 관리자 모드종료
						admin.printAdminEnd( ); // 관리자종료라고 알려줘 
						break;
					}
				}
			}//관리자모드 생명명주기 종료
			
			else if(action==1) {// 회원가입
				MemberVO mVO=client.signUp();
				boolean flag=mDAO.insert(mVO);
				if(flag) {
					client.signUpTrue();
				}
				else {
					client.signUpFalse();
				}
			}
			else if(action==2) { // 로그인
				MemberVO mVO = client.signIn();
				//mVO에는 사용자가 입력한 아이디,비밀번호가 저장되어있음!
				//MemberVO mdata
				member = mDAO.selectOne(mVO); //mVO를 재활용 하는것이 헷갈리면 새로 하나 만들어도 됨
				// mdata에는 유효한 사용자 정보 or null
				// 유효한 사용자 정보 == 현재 로그인한 회원

				// 아이디입력해봐! 라고 V가 사용자에게 요청
				// 비밀번호도 같이 입력해~~

				// C는 이 정보가 있는지, 그리고 맞는지 (==유효한지)
				// 위의 여부를 M한테 판단을 부탁함
				// ----->> selectOne(); // 이 '사람' 데이터 있어??
				if(member==null) {
					client.signInFalse();//로그인실패V
					continue;//프로그램모드에계속존재
				}
				client.signInTrue();//로그인성공
				//다음스텝으로이동
				while(true) { // 장바구니 사용유저 진입
					client.printUserJoin(); // 사용자 입장 문구 출력
					ArrayList<ProductVO> cart=new ArrayList<ProductVO>(); // 장바구니 
					client.printClientStart();//사용자모드 시작
						action=client.printUserMenu(member); // 사용자메뉴출력 action값 입력

						if(action == 1) {//1번 입력시 상품 목록출력
							ArrayList<ProductVO> datas=pDAO.selectAll(null);
							client.printProductList(datas);
						}
						else if (action == 2) {//2번 입력시 구매하기 
							client.buyProductStart();// 구매하기 시작
							ArrayList<ProductVO> datas=pDAO.selectAll(null); // 상품목록
							int num=client.getProducNum(datas); // 상품번호를 입력받아
							if(num == -1) {
								continue;
							}
							int cnt=client.getProductCnt(); // 상품재고를 입력받아
							ProductVO vo=new ProductVO(num,null,0,-cnt);
							if(pDAO.update(vo)){ // 성공했을때
								ProductVO data=pDAO.selectOne(vo); // 저장한 vo를 하나 선택해서 data에 저장
								data.setCnt(cnt); // data에 내가 입력한 재고로 바꿔줘
								boolean flag=false;
								int index=0;
								for(int i=0;i<cart.size();i++) { // 입력한 상품이 카트에 존재하는지 검사
									if(data.equals(cart.get(i))) { // 입력한 상품이 카트에 존재하는지 검사
										index=i;
										flag=true;
									}
								}
								if(flag) { // 같은상품일 경우 장바구니에 있는 재고에 입력한 재고 추가하기
									cart.get(index).setCnt(cart.get(index).getCnt()+cnt);
								}
								else {
									cart.add(data); // 장바구니.add(내가 구매한 상품);
								}						

								client.printcartList(cart); // 장바구니 목록 출력

								client.buyProductEnd(); // 성공했을때 사용자한테 알리기
							}
							else{ // 실패했을때
								client.buyFail(); // 실패했을때 사용자한테 알리기
							}
						}
						else if (action == 3) {//3번 입력시 검색하기
							client.printSearchContent();
							String name=client.getSearchContent(); // 이름을 입력받아
							ArrayList<ProductVO> datas=pDAO.selectAll(new ProductVO(0,name,0,0));
							// selectAll에서 name이 들어가있는것들을 찾아서 datas에 저장해줘
							client.printProductList( datas ); // datas에 저장되어있는것들 다 보여줘
						}
						else if (action == 4) {//4번 입력시 최고가 검색
							// 최고가 검색시작
							ProductVO vo= client.getSearchMax();// new ProductVO(0,"최고가",maxPrice,0)
							ProductVO datas=pDAO.selectOne(vo);
							client.printProduct(datas);
							// 최고가 검색완료
						}
						else if (action == 5) {//5번 입력시 최저가 검색
							// 최저가 검색시작
							ProductVO vo= client.getSearchMin(); // ProductVO(0,"최저가",minxPrice,0)
							ProductVO datas=pDAO.selectOne(vo);
							client.printProduct(datas);
							// 최저가 검색완료
						}
						else if (action == 6) {//6번 입력시 프로그램 종료
							//사용자가 로그아웃을 원하면,
							//C에 mdata가 현재 존재하는데, 이걸
							
							//현재로그인한 회원이였기때문에
							member = null;//제거하고
							
							// V->C->V 로그아웃은 모델 불필요  
							// V->C->M->C->V 대부분 이렇게 진행
							
							client.logout();//로그아웃이 되었음을 사용자에게 알려주자!~~
							client.printClientEnd(); // 사용자모드 종료라고 알려줘
							break;
						}
						else if(action == 7) {//회원탈퇴
							// 현재 로그인한 상황.
							String mpw=client.getMpw();//view.비번입력해봐();
							//비밀번호 일치
							// 비밀번호를 한번더 확인하는 로직
							// 비밀번호가 불일치 -> 회원탈퇴를 막아버리면됨 (너 데이터제거할 수 있는 위치에 있어?)
							if(!member.getMpw().equals(mpw)) {//현재 로그인한 사람의 비밀번호와 사용자가 입력한 비밀번호와 같니? 
								client.printFalse();//view.비밀번호불일치();	//	비밀번호 불일치
									continue;
							}
							// 비밀번호 일치 해야
							// -> 
							// 로그인이 되어있는 회원을
							// 전체회원목록에서 제거
							
							if(!mDAO.delete(member)) {	//model.delete(지금로그인한사람)
								client.printMemberDeleteFalse();//회원탈퇴실패
								continue;
							}
							//회원탈퇴성공
							client.printMemberDeleteTrue();
							client.printClientEnd(); // 사용자모드 종료라고 알려줘
							break;
						}
						
						//사용자 로그오프 안내문구
						//cart안에 저장된 데이터 비우기
						else {
							client.cartEnd();
							cart.clear();
							break;
						}
					
				}//사용유저 while문 생명주기종료
			}
			else if(action==3) {// 프로그램종료
				client.printPwrOff();
				break;
			}
			
			
		}//전체 while문(로그인,회원가입화면) 생명주기종료 

	}
}

Client

package client;

import ctrl.Ctrl;

public class Client {

	public static void main(String[] args) {
		Ctrl app=new Ctrl();
		app.startApp();
	}

}
profile
이진 입니다

0개의 댓글