카테고리 없음

MVC패턴 활용한 자판기 프로그램 ver.3

ZI_CO 2023. 12. 15. 14:30

클라이언트 클래스

package client;

import ctrl.Ctrl2;

public class Client {
	public static void main(String[] args) {

		// 설치
		Ctrl2 app=new Ctrl2();
		
		// 실행
		app.start();
		
	}
}

 

 

 

 

 

 

뷰 클래스

package view;

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

import model.ProductDTO;

public class View4 {

	private Scanner sc;
	private int userMAX;
	private int adminMAX;
	public View4() {
		this.sc=new Scanner(System.in);
		this.userMAX=2;
		this.adminMAX=3;
	}

	public void adminInfo() {
		System.out.println("관리자 모드는 1234로 진입하실수있습니다.");
	}
	
	public void printMenu() { // 로그아웃 상태일때의 VIEW
		System.out.println("=== 자 판 기 ===");
		System.out.println("1. 메뉴목록출력");
		System.out.println("2. 메뉴선택");
		System.out.println("3. 이름으로검색");
		System.out.println("4. 회원가입");
		System.out.println("5. 로그인");
		System.out.println("0. 종료");
	}
	public void printLoginMenu() { // 로그인 상태일때의 VIEW
		// 4,5를 누를수없게 VIEW에서 유효성 검사 ☆
		System.out.println("=== 자 판 기 ===");
		System.out.println("1. 메뉴목록출력");
		System.out.println("2. 메뉴선택");
		System.out.println("3. 이름으로검색");
		System.out.println("6. 로그아웃");
		System.out.println("7. 비밀번호변경");
		System.out.println("8. 회원탈퇴");
		System.out.println("0. 종료");
	}
	public int inputInteger() {
		System.out.print("번호입력 >> ");
		int integer=sc.nextInt();
		return integer;
	}
	public void printAdminMenu() {
		System.out.println("=== 관 리 자 ===");
		System.out.println("1. 메뉴추가");
		System.out.println("2. 메뉴재고변경");
		System.out.println("3. 메뉴삭제");
		System.out.println("4. 메뉴재고추가");
		System.out.println("5. 메뉴가격변경");
		System.out.println("0. 관리자모드 종료");
	}
	public int inputNum() {
		System.out.print("메뉴번호입력 >> ");
		int num=sc.nextInt();
		return num;
	}
	public void printDeleteData01() {
		System.out.println("메뉴가 삭제되었습니다!");
	}
	public void printDeleteData02() {
		System.out.println("메뉴삭제에 실패했습니다...");
	}
	public String inputName() {
		System.out.print("메뉴이름입력 >> ");
		String name=sc.next();
		return name;
	}
	public int inputPrice() {
		System.out.print("메뉴가격입력 >> ");
		int price=sc.nextInt();
		return price;
	}
	public int inputCnt() {
		System.out.print("메뉴재고입력 >> ");
		int cnt=sc.nextInt();
		return cnt;
	}
	public void printInsertData(ProductDTO data) {
		System.out.println(data.getName()+"이(가) 추가되었습니다! :D");
	}
	public void printDatas(ArrayList<ProductDTO> datas) {
		if(datas.size()<=0) {
			System.out.println("출력할 메뉴가 없습니다...");
			return;
		}
		for(ProductDTO data:datas) {
			if(data.getCnt()<=0) {
				System.out.println("재고없음!");
				continue;
			}
			System.out.println(data);
		}
	}
	public void printNoData() {
		System.out.println("해당 데이터는 없습니다...");
	}
	public void printData(ProductDTO data) {
		if(data==null) {
			System.out.println("출력할 데이터가 없습니다...");
			return;
		}
		if(data.getCnt()<=0) {
			System.out.println(data.getName()+"는(은) 재고가 없습니다...");
			return;
		}
		System.out.println(data);
		System.out.println("구매완료!");
	}
}

 

 

 

ProductDTO 클래스

package model;

public class ProductDTO {

	private int num; // PK
	private String name;
	private int price;
	private int cnt;
	
	private String searchConditon; // JAVA 로직에서만 사용하는 변수
	private int addCnt;
	
	// 웹 개발에서는,
	// 기본 생성자를 사용하는 것을 원칙으로 한다!!!!!
	//  : new할때 생성자의 인자로 넣는 값중에서,
	//    어떤 값이 정말 유효한 값인지 파악하는 시간을 줄이기위함!

	public int getAddCnt() {
		return addCnt;
	}
	public void setAddCnt(int addCnt) {
		this.addCnt = addCnt;
	}
	public String getSearchConditon() {
		return searchConditon;
	}
	public void setSearchConditon(String searchConditon) {
		this.searchConditon = searchConditon;
	}
	
	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() {
		if(this.cnt<=0) {
			return this.num+"번 상품 품절";
		}
		return "ProductDTO [num=" + num + ", name=" + name + ", price=" + price + ", cnt=" + cnt + "]";
	}
	
}

 

 

ProductDAO 클래스

package model;

import java.util.ArrayList;

public class ProductDAO4 {

	private ArrayList<ProductDTO> datas; // DB

	public ProductDAO4() {
		datas=new ArrayList<ProductDTO>();

		// 샘플 데이터 추가
		ProductDTO sample01=new ProductDTO();
		sample01.setNum(1001);
		sample01.setName("콜라");
		sample01.setPrice(1200);
		sample01.setCnt(3);
		datas.add(sample01);
		ProductDTO sample02=new ProductDTO();
		sample02.setNum(1002);
		sample02.setName("사이다");
		sample02.setPrice(1100);
		sample02.setCnt(0);
		datas.add(sample02);
	}

	public ArrayList<ProductDTO> selectAll(ProductDTO productDTO){
		if(productDTO.getSearchConditon()==null) {
			// 전체출력
			return this.datas;
		}
		else if(productDTO.getSearchConditon().equals("이름검색")) {
			ArrayList<ProductDTO> datas=new ArrayList<ProductDTO>();
			
			for(int i=0;i<this.datas.size();i++) {
				if(this.datas.get(i).getName().contains(productDTO.getName())) {
					datas.add(this.datas.get(i));
				}
			}
			
			return datas;
		}
		return null;
	}
	public ProductDTO selectOne(ProductDTO productDTO){
		boolean flag=false;
		int i;
		for(i=0;i<this.datas.size();i++) {
			// this.datas.get(i).getNum()
			// 내꺼.DB.요소 == 상품
			// 상품.pk()
			if(this.datas.get(i).getNum() == productDTO.getNum()) {
				flag=true;
				break;
			}
		}
		if(!flag) {
			return null;
		}
		return this.datas.get(i);
	}

	public boolean insert(ProductDTO productDTO) {
		try {
			ProductDTO data=new ProductDTO();
			data.setNum(productDTO.getNum());
			data.setName(productDTO.getName());
			data.setPrice(productDTO.getPrice());
			data.setCnt(productDTO.getCnt());
			this.datas.add(data);
		}catch(Exception e) {
			System.out.println("[로그] 알수없는 이슈발생!");
			return false;
		}
		return true;
	}
	public boolean update(ProductDTO productDTO) {
		if(productDTO.getSearchConditon().equals("구매")) {
			productDTO.setCnt(productDTO.getCnt()-1);
		}
		else if(productDTO.getSearchConditon().equals("가격변경")) {
			productDTO.setPrice(productDTO.getPrice());
		}
		else if(productDTO.getSearchConditon().equals("재고변경")) {
			productDTO.setCnt(productDTO.getCnt());
		}
		else if(productDTO.getSearchConditon().equals("재고추가")) {
			// "재고"라는 속성의 값을 "변경"하는 것이므로 "U"에 해당함!
			productDTO.setCnt(productDTO.getCnt()+productDTO.getAddCnt());
			// "추가할 값"이라는 속성은,
			// 제품의 속성이 아님!
			// "U" 기능을 수행할때 필요한 속성일뿐임!
			// "searchCondition"같은 속성이라는뜻!
		}
		else {
			return false;
		}		
		return true;
	}
	public boolean delete(ProductDTO productDTO) {
		try {
			int i;
			for(i=0;i<this.datas.size();i++) {
				if(this.datas.get(i).getNum() == productDTO.getNum()) {
					break;
				}
			}
			this.datas.remove(i);
		}catch(Exception e) {
			return false;
		}
		return true;
	}

}

 

 

 

MemberDTO 클래스

package model;

public class MemberDTO {
	// PK란? 시스템이 부여하는 값
	// 유일한 값이어야함!!!!!
	
	// ID의 경우, 사용자가 생성함
	// "ID 중복검사" 필수 !
	// selectAll VS selectOne
	// selectOne !
	private String mid; // PK
	private String mpw;
	private String name;
	
	private String searchCondition;
	
	public String getSearchCondition() {
		return searchCondition;
	}
	public void setSearchCondition(String searchCondition) {
		this.searchCondition = searchCondition;
	}
	
	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 "MemberDTO [mid=" + mid + ", mpw=" + mpw + ", name=" + name + "]";
	}
}

 

 

 

 

MemberDAO 클래스

package model;

import java.util.ArrayList;

public class MemberDAO {
	private ArrayList<MemberDTO> datas;
	public MemberDAO() {
		datas=new ArrayList<MemberDTO>();

		MemberDTO admin=new MemberDTO();
		admin.setMid("admin");
		admin.setMpw("1234");
		admin.setName("관리자");
		datas.add(admin);
	}

	public ArrayList<MemberDTO> selectAll(MemberDTO memberDTO){
		return datas;
	}
	public MemberDTO selectOne(MemberDTO memberDTO){
		if(memberDTO.getSearchCondition().equals("ID중복검사")) {
			boolean flag=false;
			int i;
			for(i=0;i<this.datas.size();i++) {
				if(this.datas.get(i).getMid().equals(memberDTO.getMid())) {
					flag=true;
					break;
				}
			}
			if(!flag) {
				return null;
			}
			MemberDTO data=new MemberDTO();
			data.setMid(this.datas.get(i).getMid());
			data.setMpw(this.datas.get(i).getMpw());
			data.setName(this.datas.get(i).getName());
			return data; // data를 new하는 이유? 원본이 변경되는것을 막기위함!
		}
		else if(memberDTO.getSearchCondition().equals("로그인")) {
			boolean flag=false;
			int i;
			for(i=0;i<this.datas.size();i++) {
				if(this.datas.get(i).getMid().equals(memberDTO.getMid()) && this.datas.get(i).getMpw().equals(memberDTO.getMpw())) {
					flag=true;
					break;
				}
			}
			if(!flag) {
				return null;
			}
			MemberDTO data=new MemberDTO();
			data.setMid(this.datas.get(i).getMid());
			data.setMpw(this.datas.get(i).getMpw());
			data.setName(this.datas.get(i).getName());
			return data;
		}
		return null;
	}
	// 만약, null이 반환되면 ID가 중복되지않음!
	// null이 아닌것이 반환되면 회원이 있는것이므로 회원가입 불가능...

	public boolean insert(MemberDTO memberDTO) {
		try {
			MemberDTO data=new MemberDTO();
			data.setMid(memberDTO.getMid());
			data.setMpw(memberDTO.getMpw());
			data.setName(memberDTO.getName());
			this.datas.add(data);
		}catch(Exception e) {
			System.out.println("[로그] 알수없는 이슈발생!");
			return false;
		}
		return true;
	}
	public boolean update(MemberDTO memberDTO) {
		boolean flag=false;
		int i;
		for(i=0;i<this.datas.size();i++) {
			if(this.datas.get(i).getMid().equals(memberDTO.getMid())) {
				flag=true;
				break;
			}
		}
		if(!flag) {
			return false;
		}
		this.datas.get(i).setMpw(memberDTO.getMpw());
		return true;
	}
	public boolean delete(MemberDTO memberDTO) {
		boolean flag=false;
		int i;
		for(i=0;i<this.datas.size();i++) {
			if(this.datas.get(i).getMid().equals(memberDTO.getMid())) {
				flag=true;
				break;
			}
		}
		if(!flag) {
			return false;
		}
		this.datas.remove(i);
		return true;
	}
}

 

 

 

 

컨트롤러 클래스

package ctrl;

import java.util.ArrayList;

import model.MemberDAO;
import model.MemberDTO;
import model.ProductDAO4;
import model.ProductDTO;
import view.MemberView;
import view.View4;

public class Ctrl4 {

	private ProductDAO4 productDAO; // MODEL
	private MemberDAO memberDAO;
	private View4 view;
	private MemberView memberView;
	private int PK;
	private MemberDTO user; // 현재 로그인한 사람의 정보
	 // 로그인 세션,쿠키,로컬 스토리지 정보
	public Ctrl4() {
		this.productDAO=new ProductDAO4();
		this.memberDAO=new MemberDAO();
		this.view=new View4();
		this.memberView=new MemberView();
		this.PK=1003;
		this.user=null; // 아무도 로그인하지않은 상태
	}

	public void start() {
		while(true) {
			if(user == null) { // 로그아웃 상태
				view.printMenu();
			}
			else {
				view.printLoginMenu();
				if(user.getMid().equals("admin")) {
					view.adminInfo();
				}
			}
			
			int action=view.inputInteger();
			if(action==0) {
				break;
			}
			else if(action==1234) {
				while(true) {
					view.printAdminMenu();
					action=view.inputInteger();
					if(action==0) {
						break;
					}
					else if(action==1) {
						String name=view.inputName();
						int price=view.inputPrice();
						int cnt=view.inputCnt();

						ProductDTO productDTO=new ProductDTO();
						productDTO.setNum(PK++);
						productDTO.setName(name);
						productDTO.setPrice(price);
						productDTO.setCnt(cnt);

						productDAO.insert(productDTO);
					}
					else if(action==2) {
						int num=view.inputNum();

						ProductDTO productDTO=new ProductDTO();
						productDTO.setNum(num);
						productDTO=productDAO.selectOne(productDTO);
						if(productDTO==null) {
							view.printNoData();
							continue;
						}

						int cnt=view.inputCnt();
						productDTO.setCnt(cnt);
						productDTO.setSearchConditon("재고변경");
						boolean flag=productDAO.update(productDTO);
						if(flag){
							view.printDeleteData01(); // update 성공 !
						}
						else {
							view.printDeleteData02(); // update 실패 ...
						}
					}
					else if(action==3) {
						int num=view.inputNum();

						ProductDTO productDTO=new ProductDTO();
						productDTO.setNum(num);

						productDTO=productDAO.selectOne(productDTO);
						if(productDTO == null) {
							view.printNoData();
							continue;
						}

						boolean flag=productDAO.delete(productDTO);
						if(flag) {
							view.printDeleteData01();
						}
						else {
							view.printDeleteData02();
						}
					}
					else if(action==4) {
						int num=view.inputNum();

						ProductDTO productDTO=new ProductDTO();
						productDTO.setNum(num);
						productDTO=productDAO.selectOne(productDTO);
						if(productDTO==null) {
							view.printNoData();
							continue;
						}

						int addCnt=view.inputCnt();
						productDTO.setAddCnt(addCnt);
						productDTO.setSearchConditon("재고추가");
						boolean flag=productDAO.update(productDTO);
						if(flag) {
							view.printDeleteData01();
						}
						else {
							view.printDeleteData02();
						}
					}
					else if(action==5) {
						int num=view.inputNum();

						ProductDTO productDTO=new ProductDTO();
						productDTO.setNum(num);
						productDTO=productDAO.selectOne(productDTO);
						if(productDTO==null) {
							view.printNoData();
							continue;
						}

						int price=view.inputPrice();
						productDTO.setPrice(price);
						productDTO.setSearchConditon("가격변경");
						productDAO.update(productDTO);
					}
				}
			}
			else if(action==1) {
				ProductDTO productDTO=new ProductDTO();
				ArrayList<ProductDTO> datas=productDAO.selectAll(productDTO);
				view.printDatas(datas);
			}
			else if(action==2) {
				int num=view.inputInteger();
				ProductDTO productDTO=new ProductDTO();
				productDTO.setNum(num);
				ProductDTO data=productDAO.selectOne(productDTO);
				view.printData(data);
				if(data!=null && data.getCnt()>0) { // 구매성공이라면
					data.setSearchConditon("구매");
					productDAO.update(data);
				}
			}
			else if(action==3) {
				String name=view.inputName();

				ProductDTO productDTO=new ProductDTO();
				productDTO.setName(name);
				productDTO.setSearchConditon("이름검색");
				ArrayList<ProductDTO> datas=productDAO.selectAll(productDTO);

				view.printDatas(datas);
			}
			else if(action==4) {
				if(user != null) {
					continue;
				}
				// 로그아웃 상태일때만 수행할 예정
				// 로그인 상태야? 그럼 못해. 되돌아가!
				// 유효성 검사 ☆
				
				MemberDTO memberDTO=new MemberDTO();
				String mid;
				while(true) {
					mid=memberView.inputMemberID();
					
					memberDTO.setMid(mid);
					memberDTO.setSearchCondition("ID중복검사");
					memberDTO=memberDAO.selectOne(memberDTO);
					if(memberDTO == null) {
						break;
					}
					
					memberView.signUpFalse();
				}
				memberDTO=new MemberDTO();
				memberDTO.setMid(mid);
				String mpw=memberView.inputMemberPW();
				memberDTO.setMpw(mpw);
				String name=memberView.inputMemberName();
				memberDTO.setName(name);
				memberDAO.insert(memberDTO);
				
				memberView.signUpTrue();
			}
			else if(action==5) {
				if(user != null) {
					continue;
				}
				// 로그아웃 상태일때만 수행할 예정
				// 로그인 상태야? 그럼 못해. 되돌아가!
				// 유효성 검사 ☆
				
				String mid=memberView.inputMemberID();
				String mpw=memberView.inputMemberPW();
				MemberDTO memberDTO=new MemberDTO();
				memberDTO.setMid(mid);
				memberDTO.setMpw(mpw);
				memberDTO.setSearchCondition("로그인");
				memberDTO=memberDAO.selectOne(memberDTO);
				if(memberDTO == null) {
					memberView.loginFalse();
					continue;
				}
				user=memberDTO;
				memberView.loginTrue();
			}
			else if(action==6) {
				user=null;
				memberView.logout();
			}
			else if(action==7) {
				if(user == null) {
					continue;
				}
				
				String mpw=memberView.inputMemberPW(); // 현재 비번
				
				// 현재 로그인한 정보의 비번과 같은지 확인해야함!
				MemberDTO memberDTO=new MemberDTO();
				memberDTO.setMid(user.getMid()); // 현재 로그인한 정보
				memberDTO.setMpw(mpw); // 입력한 정보
				memberDTO.setSearchCondition("로그인");
				memberDTO=memberDAO.selectOne(memberDTO);
				if(memberDTO==null) {
					memberView.printFalse();
					continue;
				}
				
				mpw=memberView.inputMemberPW(); // 바꿀 비번
				memberDTO=new MemberDTO();
				memberDTO.setMid(user.getMid()); // 현재 로그인한 사람을
				memberDTO.setMpw(mpw); // 바꿀 비번으로 설정해줘!~~
				memberDAO.update(memberDTO);
				
				user=null;
				memberView.logout();
			}
			else if(action==8) {
				if(user == null) {
					continue;
				}
				
				MemberDTO memberDTO=new MemberDTO();
				memberDTO.setMid(user.getMid());
				memberDAO.delete(memberDTO);
				user=null; // 로그아웃도 시켜주어야함!
				memberView.printTrue();
			}
		}		
	}

}