헬린코린이

MVC 패턴 VO 2개 이용 본문

Project/Solo Project

MVC 패턴 VO 2개 이용

HCD 2022. 12. 8. 22:36

이번에도 많이 부족하지만

VO를 두 개 이용한 간단한 프로젝트를 작성했다.

package client;

import ctrl.Ctrl;

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

model

memberVO

package model;

public class MemberVO {
	private String id; //PK
	private String pw; //apple1234
	private String name;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPw() {
		return pw;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "MemberVO [id=" + id + ", pw=" + pw + ", name=" + name + "]";
	}
	public MemberVO() {
		
	}
	public MemberVO(String id, String pw, String name) {
		this.id = id;
		this.pw= pw;
		this.name=name;
	}
	
}

ProductVO

package model;

public class ProductVO {
	private int num; //PK
	private String name;
	private int price;
	private int cnt;
	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() {
		return "ProductVO [num=" + num + ", name=" + name + ", price=" + price + ", cnt=" + cnt + "]";
	}
	public ProductVO() {
		
	}
	public ProductVO(int num, String name, int price,int cnt) {
		this.num=num;
		this.name=name;
		this.price=price;
		this.cnt=cnt;
	}
	
}

MemberDAO

package model;

import java.util.ArrayList;

public class MemberDAO {
	ArrayList<MemberVO> mdatas;
	public MemberDAO() {
		mdatas=new ArrayList<MemberVO>();
		//샘플 데이터
		mdatas.add(new MemberVO("time","1234","티모"));
	}
	public MemberVO selectOne(MemberVO mvo) {  //로그인
		for(int i=0; i<mdatas.size(); i++) {
			if(mdatas.get(i).getId().equals(mvo.getId())) {
				System.out.println("   로그: 아이디 존재함");
				if(mdatas.get(i).getPw().equals(mvo.getPw())) {
					System.out.println("   로그: 비밀번호 일치함");
					System.out.println("   로그: 로그인 성공");
					return mdatas.get(i);
				}
			}
		}
		System.out.println("   로그: 로그인 실패");
		return null;
	}
	//d
	public boolean withdrawal(MemberVO mvo) { //회원탈퇴
		for(int i=0; i<mdatas.size(); i++) {
			if(mdatas.get(i).getId().equals(mvo.getId())) {
				if(mdatas.get(i).getPw().equals(mvo.getPw())) {
					mdatas.remove(i);
					return true;
				}
			}
		}
		return false;
	}
	//u
	public boolean update(MemberVO mvo) {
		for(int i=0; i<mdatas.size(); i++) {
			if(mvo.getName() != null) { //이름 변경
				mdatas.get(i).setName(mvo.getName());
				return true;
			}else if(mvo.getPw() != null) { //비밀번호 변경
				mdatas.get(i).setPw(mvo.getPw() );
				return true;
			}
		}
		return false;
	}
	//c
	public boolean insert(MemberVO mvo) {
		for(int i=0; i<mdatas.size(); i++) {
			if(!mdatas.get(i).getId().equals(mvo.getId())) {
				mdatas.add(new MemberVO(mvo.getId(),mvo.getPw(),mvo.getName()));//?
				return true;
			}
		}
		return false;
	}
}

ProductDAO

package model;

import java.util.ArrayList;

public class ProductDAO {
	ArrayList<ProductVO> pdatas;
	int PK;
	public ProductDAO() {
		pdatas=new ArrayList<ProductVO>();
		PK=1011;
		pdatas.add(new ProductVO(PK++,"커피",2500,1));
		pdatas.add(new ProductVO(PK++, "케이크",4700,0));
		pdatas.add(new ProductVO(PK++, "홍차",3200,2));
	}
	public ArrayList<ProductVO> selectAll(ProductVO pvo){
		return pdatas;
	}
	public ProductVO selectOne(ProductVO pvo){
		for(int i=0; i<pdatas.size(); i++) {
			if(pdatas.get(i).getNum()==pvo.getNum()) {
				return pdatas.get(i);
			}
		}
		return null;
	}
	// c
	public boolean insert(ProductVO pvo) {
		pdatas.add(new ProductVO(PK++,pvo.getName(),pvo.getPrice(),pvo.getCnt()));//?
		return true;
	}
	//d
	public boolean delete(ProductVO pvo) {
		for(int i=0; i<pdatas.size(); i++) {
			if(pdatas.get(i).getName().equals(pvo.getName())) {
				pdatas.remove(i);
				return true;
			}
		}
		return false;
	}
	//u
	public boolean update(ProductVO pvo) {
		for(int i=0; i<pdatas.size(); i++) {

			if(pvo.getName() != null) {
				pdatas.get(i).setName(pvo.getName());
				return true;
			}else if(pvo.getPrice()!=0) { //?
				pdatas.get(i).setPrice(pvo.getPrice());
				return true;
			}else if(pvo.getCnt() !=0) {
				pdatas.get(i).setCnt(pvo.getCnt());
				return true;
			}

		}
		return false;
	}
	public boolean buy(ProductVO pvo) {
		// 구매 로직
		for(int i=0;i<pdatas.size();i++) {
			if(pdatas.get(i).getNum()==pvo.getNum()) {
				if(pdatas.get(i).getCnt()>0) {
					pdatas.get(i).setCnt(pdatas.get(i).getCnt()-1);
					return true;
				}            
			}
		}
		return false;
	}
	
}

view

package view;

import java.awt.Desktop.Action;
import java.util.ArrayList;
import java.util.Scanner;

import model.MemberVO;
import model.ProductVO;

public class View {
	private Scanner sc;
	public View() {
		sc=new Scanner(System.in);
	}
	// DBxxx
	public int printStart() {
		// 1. 사용자의 입력값을 검사 == 유효성 검사
		// 2. 사용자에게 상황을 안내 == 사용자 편의성 고려
		int action;
		while(true) {
			try {
				System.out.println();
				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.print(">>> ");
				action = sc.nextInt();
			}catch (Exception e){
				sc.nextLine();
				System.out.println("정수로 입력해주세요");
				continue;
			}
			if(1<=action && action<=5) {//저ㅏㅇ확하게 입력했따면
				break;
			}
			System.out.println("범위를 확인하고 다시 입력해주세요!");
		}
		return action; //유효성검사 뷰에서ㅗ 하는 거임
	}
	public void powerOff() {
		for(int i=0; i<5; i++) {
			System.out.println(".");
			try {
				Thread.sleep(250);
			}catch(InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.println("프로그램 종료");
	}
	public MemberVO login() {
		//아이디 String
		//비밀번호 String
		// 데이터를 2개이상 전달해야할떄,
		// VO를 사용한다.
		System.out.println();
		System.out.println("=== 로그인 ===");
		System.out.println("아이디 >> ");
		String id = sc.next();
		System.out.println("비밀번호 >>");
		String pw = sc.next();
		MemberVO vo = new MemberVO();
		vo.setId(id);
		vo.setPw(pw);
		return vo;
	}
	public MemberVO joinMembership() {
		//아이디 String
		//비밀번호 String
		// 데이터를 2개이상 전달해야할떄,
		// VO를 사용한다.
			System.out.println();
			System.out.println("=== 회원가입 ===");
			System.out.println("아이디 >>");
			String id = sc.next();
			System.out.println("비밀번호 >>");
			String pw = sc.next();
			System.out.println("비밀번호 확인 >>");
			String pwCheck = sc.next();
			if(pw.equals(pwCheck)) {
				System.out.println("ㄴㄴ비밀번호 똑같은");
			}
			System.out.println("이름 >>");
			String name = sc.next();
			MemberVO vo = new MemberVO();
			vo.setId(id);
			vo.setPw(pw);
			vo.setName(name);

			return vo;
	}
	public void loginTrue(MemberVO vo) {
		System.out.println(vo.getName()+"님, 안녕하세요! :D");
	}
	public void loginFalse() {
		System.out.println("로그인 실패...");
		System.out.println("아이디 or 비밀번호를 다시 확인해보세요!");
	}
	public void joinMembershipFalse() {
		System.out.println("이미 있는 아이디입니다.");
	}
	public void logout() {
		System.out.println("로그아웃 되었습니다.");
	}
	public int printMenu() {
		int action;
		while(true) {
			try {
				System.out.println();
				System.out.println("=== 서비스 ===");
				System.out.println("1. 상품 목록 출력");
				System.out.println("2. 상품 선택 구매");
				System.out.println("3. 로그아웃");
				System.out.print(">>> ");
				action = sc.nextInt();
			}catch (Exception e) {
				sc.nextLine();
				System.out.println("정수로 다시 입력해주세요!");
				continue;
			}
			if(1<=action && action<=3) {//올바른 입력
				break;
			}
			System.out.println("범위를 확인하고 다시 입력해주세요!");
		}
		return action;
	}
	public int printProductMenu(ArrayList<ProductVO> datas) {
		System.out.println();
		System.out.println("=== 상품 목록 ===");
		for(ProductVO v: datas) {
			System.out.println(v.getNum()+"."+v.getName()+" "+v.getPrice()+"원 ["+v.getCnt()+"]");
			//System.out.println("PK.상품명 0원 [2]");
		}
		System.out.println("0. 상품정보 변경");
		System.out.println("1. 뒤로가기");
		int action = sc.nextInt();
		return action;
	}
	public int BuyProduct(ArrayList<ProductVO> datas) {
		System.out.println();
		System.out.println("=== 상품 목록 ===");

		for(ProductVO v: datas) {
			if(v.getCnt()==0) {//재고가 없으면
				System.out.print("[X] ");
			}else {
				System.out.print(v.getNum()+". ");
			}
			System.out.println(v.getName()+" "+v.getPrice()+"원");
			//System.out.println("1.  목도리 10000d원");
			//System.out.println("[X] 목도리 10000d원");
		}
		int num=0;
		while(true) {
			try {
				System.out.print("상품번호 >>");
				num = sc.nextInt();
			}catch (Exception e) {}
			for(int i=0; i<datas.size(); i++) {
				if(datas.get(i).getNum()==num) {
					break;
				}
			}
			return num;
		}
	}
	public void buyTrue(MemberVO mvo, ProductVO pvo) {
		System.out.println("");
		System.out.println(" === 영수증 ===");
		System.out.println(pvo.getName()+" "+pvo.getPrice()+"원");
		System.out.println(mvo.getName()+"님, "+pvo.getName()+"을 구매완료했습니다.");
	}
	public void buyFalse() {
		System.out.println("구매실패... 잠시후 다시 이용해주세요!");
	}
	public void success() {
		System.out.println("성공했습니다.");
	}
	public void failed() {
		System.out.println("실패했습니다.");
	}
	public int informationUpdate() {
		System.out.println("1. 비밀번호 변경");
		System.out.println("2. 이름 변경");
		System.out.println(">>  ");
		int action = sc.nextInt();
		return action;
	}
	public MemberVO mdaoPw() {
		System.out.println("변경하실 비밀번호를 입력해주세요");
		System.out.println(">> ");
		String pw = sc.next();
		MemberVO mvo = new MemberVO();
		mvo.setPw(pw);
		return mvo;
	}
	public MemberVO mdaoName() {
		System.out.println("변경하실 이름을 입력해주세요");
		System.out.println(">> ");
		String name = sc.next();
		MemberVO mvo = new MemberVO();
		mvo.setName(name);
		return mvo;
	}
	public ProductVO pdaoPrice() {
		System.out.println("변경하실 가격을 입력해주세요");
		System.out.println(">> ");
		int price = sc.nextInt();
		ProductVO pvo = new ProductVO();
		pvo.setPrice(price);
		return pvo;
	}
	public ProductVO pdaoName() {
		System.out.println("변경하실 이름을 입력해주세요");
		System.out.println(">> ");
		String name = sc.next();
		ProductVO pvo = new ProductVO();
		pvo.setName(name);
		return pvo;
	}
	public ProductVO pdaoCnt() {
		System.out.println("변경하실 재고을 입력해주세요");
		System.out.println(">> ");
		int cnt = sc.nextInt();
		ProductVO pvo = new ProductVO();
		pvo.setCnt(cnt);
		return pvo;
	}
	public int pdaoUpdate() {
		System.out.println("변강할 상품을 입력해주세요");
		System.out.println("1. 상품이름");
		System.out.println("2. 상품가격");
		System.out.println("3. 상품재고");
		int action = sc.nextInt();
		return action;
	}
	public int seachNum() {
		System.out.print("변경할 상품번호 >>");
		int num = sc.nextInt();
		return num;
	}
	public void printProductMenuAll(ArrayList<ProductVO> datas) {
		System.out.println();
		System.out.println("=== 상품 목록 ===");
		for(ProductVO v: datas) {
			System.out.println(v.getNum()+"."+v.getName()+" "+v.getPrice()+"원 ["+v.getCnt()+"]");
			//System.out.println("PK.상품명 0원 [2]");
		}
	}
	public void replay() {
		System.out.println("없는 번호입니다.");
	}
	public void list() {
		System.out.println("상품목록을 다시 선택해주세요.");
	}
}

ctrl

package ctrl;


import model.MemberDAO;
import model.MemberVO;
import model.ProductVO;
import model.ProductDAO;
import view.View;

public class Ctrl {
	View view;
	MemberDAO mdao;
	ProductDAO pdao;
	public Ctrl() {
		view=new View();
		mdao = new MemberDAO();
		pdao= new ProductDAO();
	}
	public void startAPP() {
		while(true) {
			int action =view.printStart();
			if(action==1) {
				MemberVO mvo= view.login();
				mvo=mdao.selectOne(mvo); //왜 저장해야하는지 선생님께 물어보기
				if(mvo==null) {
					//로그인 실패
					view.loginFalse();
					continue;
				}
				view.loginTrue(mvo);
				while(true) {
					action=view.printMenu();
					if(action==1) {
						action=view.printProductMenu(pdao.selectAll(null));
						if(action==0) {
							view.printProductMenuAll(pdao.selectAll(null));
							action = view.seachNum();
							ProductVO pvo = new ProductVO();
							pvo.setNum(action);
							pvo =pdao.selectOne(pvo);
							if(pvo==null) {
								view.list();
								continue;
							}
							action = view.pdaoUpdate();
							if(action==1) {
								pvo = view.pdaoName();
								if(pdao.update(pvo)) {
									view.success();
									continue;
								}
							}else if(action==2) {
								ProductVO price =view.pdaoPrice();
								if(pdao.update(price)) {
									view.success();
									continue;
								}
							}else if(action==3) {
								ProductVO cnt =view.pdaoCnt();
								if(pdao.update(cnt)) {
									view.success();
									continue;
								}
							}
							view.failed();
						}
					}else if(action==2) {
						int num =view.BuyProduct(pdao.selectAll(null));

						ProductVO pvo = new ProductVO();
						pvo.setNum(num);
						pvo=pdao.selectOne(pvo);
						if(pvo==null) {
							view.replay();
							continue;
						}
						if(pdao.buy(pvo)) {
							view.buyTrue(mvo, pvo);
						}else {
							view.buyFalse();
						}
					}else if(action ==3) {
						view.logout();
						break;
					}
				}
			}else if(action ==2) {
				view.powerOff();
				return;
			}else if(action ==3) { //로직 구성
				MemberVO mvo =view.joinMembership();
				if(mdao.insert(mvo)) {
					view.success();
				}
				view.joinMembershipFalse();

			}else if(action ==4) {
				MemberVO mvo = view.login();
				if(mdao.withdrawal(mvo)) {
					view.success();
					continue;
				}
				view.loginFalse();
			}else if(action ==5) {
				MemberVO mvo = view.login();
				mvo=mdao.selectOne(mvo);
				if(mvo==null) {
					view.loginFalse();
					continue;
				}
				view.success();
				action = view.informationUpdate();
				if(action==1) {
					MemberVO mvo1 = view.mdaoPw();
					if(mdao.update(mvo1)) {
						view.success();
						continue;
					}
				}else if(action ==2) {
					MemberVO mvo1 = view.mdaoName();
					if(mdao.update(mvo1)) {
						view.success();
						continue;
					}
				}
				view.buyFalse();
			}
		}
	}
}

이렇게 하는게 좋은 코드 인지도 모르겠다.

더 좋은 코드를 작성하기위한 발판일지도 모른다. 

열심히 하면 된다!

Comments