Java/study

MVC 패턴 사용 예제

Clearing 2022. 6. 30. 23:14
728x90

MVC 패턴을 이용한 자판기 프로그램

 

Model

VO

음료(상품)들을 정의함

멤버변수로 PK(Primary Key), 이름(상품명), 재고, 가격을 가지고 있음

package model;

// 웹 개발에서, 일반적으로 기본 생성자를 사용하여 VO를 생성(new)
public class ProductVO {
	private int num; // PK
	private String name; // 상품명
	private int cnt; // 재고
	private int price; // 가격
	
	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 getCnt() {
		return cnt;
	}
	public void setCnt(int cnt) {
		this.cnt = cnt;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	
	@Override
	public String toString() {
		return "ProductVO [num=" + num + ", name=" + name + ", cnt=" + cnt + ", price=" + price + "]";
	}
}

 

DVO

데이터베이스를 대체하여 배열리스트를 사용

배열의 전체를 반환받는 selectAll과 하나의 객체만 반환받는 selectOne

소비자가 사용하는 상품구매, 관리자가 사용하는 상품추가, 재고추가, 상품삭제 메서드 존재

package model;

import java.util.ArrayList;

// CRUD
public class ProductDAO {
	// DB를 대체하는 컬렉션(배열리스트)
	ArrayList<ProductVO> datas;
	private int pk=101; // pk값

	public ProductDAO() { // 초기 데이터, 샘플 데이터
		datas=new ArrayList<ProductVO>();

		ProductVO vo = new ProductVO(); // 샘플 1
		vo.setNum(pk++);
		vo.setName("콜라");
		vo.setPrice(1200);
		vo.setCnt(0);
		datas.add(vo);
		ProductVO vo2 = new ProductVO(); // 샘플 2
		vo2.setNum(pk++);
		vo2.setName("사이다");
		vo2.setPrice(900);
		vo2.setCnt(5);
		datas.add(vo2);
		ProductVO vo3 = new ProductVO(); // 샘플 3
		vo3.setNum(pk++);
		vo3.setName("환타");
		vo3.setPrice(800);
		vo3.setCnt(2);
		datas.add(vo3);
	}

	public ArrayList<ProductVO> selectAll(ProductVO vo) { // getAll()
		// V측에서 무엇을 필요로할지 고려!
		System.out.println("	로그: selectAll()");
		return datas;
	}
	public ProductVO selectOne(ProductVO vo) { // getOne()
		for(int i=0;i<datas.size();i++) {
			if(vo.getName().equals(datas.get(i).getName())) {
				System.out.println("	로그: "+datas.get(i)+" 반환");
				return datas.get(i);
			}	
		}
		System.out.println("	로그: 반환xxx -> 확인필요!");
		return null;
	}
	public boolean BuyProduct(ProductVO vo) { // 상품 구매 - 소비자
		if(vo.getCnt()==0) {
			System.out.println("	로그: "+vo.getNum()+" 재고가 없습니다.");
			return false;
		}
		vo.setCnt(vo.getCnt()-1);
		System.out.println("	로그: "+vo.getNum()+" 구매완료!");
		return true;
	}

	public boolean insert(ProductVO vo) { // 상품 생성 - 관리자
		try {
			vo.setNum(pk++); // 상품이 새로 추가되면 pk값 부여
			datas.add(vo);
			System.out.println("	로그: 메뉴추가성공!");
			return true;
		}catch(Exception e) {
			System.out.println("	로그: 메뉴추가실패: 확인이 필요한 예외발생!");
			e.printStackTrace();
			return false;
		}
	}
	
	public boolean update(ProductVO vo) { // 재고추가 - 관리자
		for(int i=0;i<datas.size();i++) {
			if(datas.get(i).getNum()==vo.getNum()) {
				datas.get(i).setCnt(datas.get(i).getCnt()+vo.getCnt());
				return true;
			}
		}
		return false;
	}
	public boolean delete(ProductVO vo) { // 상품 삭제 - 관리자
		for(int i=0;i<datas.size();i++) {
			if(datas.get(i).getNum()==vo.getNum()) {
				datas.remove(i);
				return true;
			}
		}
		return false;
	}

}

 

View

package view;

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

import model.ProductVO;

public class ProductView {
	Scanner sc=new Scanner(System.in);
	public int action;
	public void startView() {
		while(true) { // 유효성 검사 -> 꼼꼼하게 작업해보기!
			System.out.println("=== 자판기 ===");
			System.out.println("1.메뉴확인 2.구매 3.종료");
			System.out.print("입력) ");
			action=sc.nextInt();
			if((1<=action&&action<=3) || action==1234) {
				break;
			}
			System.out.println("범위외입력!");
		}
	}
	public void func1(ArrayList<ProductVO> datas) { // 메뉴확인시 출력
		for(int i=0;i<datas.size();i++) {
			System.out.println((i+1)+"번메뉴 "+datas.get(i).getName());
		}
	}
	public void func2(ArrayList<ProductVO> datas) { // 구매시 출력
		for(int i=0;i<datas.size();i++) { // 메뉴출력 로직
			System.out.print((i+1)+"번메뉴 ");
			if(datas.get(i).getCnt()==0) { // 재고가 없으면 X
				System.out.println("X");
				continue;
			}
			System.out.println(datas.get(i).getName());
		}
		while(true) { // 주문 로직
			System.out.print("메뉴입력) ");
			action=sc.nextInt();
			if(1<=action && action<=datas.size()) {
				break;
			}
			System.out.println("상품번호 확인후 다시입력해주세요!");
		}
	}
	public void funcT(ProductVO vo) { // 구매 성공
		System.out.println(vo.getName()+" 구매완료!");
	}
	public void funcF(ProductVO vo) { // 구매 실패
		System.out.println(vo.getName()+" 재고가 없습니다...");
	}
	public void func3() { // 프로그램 종료
		System.out.print("프로그램이 종료됩니다");
		for(int i=0;i<5;i++) {
			System.out.print(".");
//			try {
//				Thread.sleep(1000); // 1000==1초
//			} catch (InterruptedException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
		}
		System.out.println();
	}
	
	public void admin_func1() { // 관리자모드 입장시 출력
		while(true) { 
			System.out.println("=== 관리자 모드 ===");
			System.out.println("1.음료추가 2.재고추가 3.음료삭제 4.관리자모드 종료");
			System.out.print("입력) ");
			action=sc.nextInt();
			if(1<=action&&action<=4) {
				break;
			}
			System.out.println("범위외입력!");
		}
	}
	public void admin_func2() { // 음료추가
		System.out.println("음료추가 메뉴입니다.");
	}
	public String admin_func3() { // 음료이름입력
		System.out.print("음료 이름을 입력) ");
		String name=sc.next();
		return name;
	}
	public int admin_func4() { // 음료가격입력
		System.out.print("음료 가격을 입력) ");
		int price=sc.nextInt();
		return price;
	}
	public int admin_func5() { // 음료재고입력
		System.out.print("음료 재고를 입력) ");
		int cnt=sc.nextInt();
		return cnt;
	}
	public void admin_func6() { // 수행이 완료되었습니다!
		System.out.println("수행이 완료되었습니다!");
	}
	public void admin_func7() { // 수행실패! 다음에 다시 이용해주세요...
		System.out.println("수행실패! 다음에 다시 이용해주세요...");
	}
	public void admin_func8() { // 음료재고추가
		System.out.println("음료재고추가 메뉴입니다.");
	}
	public int admin_func9() { // 번호입력
		System.out.print("번호 입력) ");
		int num=sc.nextInt();
		return num;
	}
	public void admin_func10() { // 음료삭제
		System.out.println("음료삭제 메뉴입니다.");
	}
	
}

 

Controller

package controller;

import java.util.ArrayList;

import model.ProductDAO;
import model.ProductVO;
import view.ProductView;

public class ProductController {
	ProductDAO model;
	ProductView view;
	public ProductController() {
		model=new ProductDAO();
		view=new ProductView();
	}
	public void startApp() {
		while(true) {
			view.startView();
			
			if(view.action==1) {
				ProductVO vo= new ProductVO();
				view.func1(model.selectAll(vo));
			}
			else if(view.action==2) {
				ProductVO vo= new ProductVO();
				view.func2(model.selectAll(vo)); // 상품구매
				/*C에서는 사용자가 입력한 메뉴의 번호를 view.action으로 참조가능하고,
				M은 pk를 입력받으면 상품객체를 줄 준비가 되어있음.
				 */
				ArrayList<ProductVO> data = model.selectAll(vo);
				int num=view.action-1; // V에서 사용자가 입력한 메뉴번호. pk(인덱스)				
				// pk를 넣으면 해당하는 상품을 반환하는 M의 selectOne()메서드
				boolean flag=model.BuyProduct(model.selectOne(data.get(num)));
				// M은 반환받은(==사용자가 선택한) 객체의 재고를 --
				/// model.update(model.selectOne(view.action+100));
				if(flag) {
					view.funcT(data.get(num));
				}
				else {
					view.funcF(data.get(num));
				}
			}
			else if(view.action==3) {
				view.func3();
				break;
			}
			else if(view.action==1234) {
				// 관리자 모드
				while(true) {
					view.admin_func1();
					
					if(view.action==1) {
						view.admin_func2();
						ProductVO vo = new ProductVO();
						vo.setName(view.admin_func3()); // 이름 등록
						vo.setPrice(view.admin_func4()); // 가격 등록
						vo.setCnt(view.admin_func5()); // 재고 등록
						if(model.insert(vo)) {
							view.admin_func6();
						}
						else {
							view.admin_func7();
						}
					}
					else if(view.action==2) {
						view.admin_func8();
						ProductVO vo = new ProductVO();
						view.func1(model.selectAll(vo));
						vo.setNum(view.admin_func9()+100); // 상품 번호 입력
						vo.setCnt(view.admin_func5()); // 재고 추가
						if(model.update(vo)) {
							view.admin_func6();
						}
						else {
							view.admin_func7();
						}
					}
					else if(view.action==3) {
						view.admin_func10();
						ProductVO vo = new ProductVO();
						vo.setNum(view.admin_func9()+100);
						if(model.delete(vo)) {
							view.admin_func6();
						}
						else {
							view.admin_func7();
						}
					}
					else if(view.action==4) {
						view.func3();
						break;
					}
				}
			}
		}
	}
}
728x90

'Java > study' 카테고리의 다른 글

DDL / DML / DCL  (0) 2022.07.03
DBMS 활용을 위해 Eclips에 Oracle 연동하기  (0) 2022.07.01
DAO / VO / DTO  (0) 2022.06.29
MVC(Model, View, Controller) 패턴  (0) 2022.06.28
파일입출력  (0) 2022.06.27