카테고리 없음
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();
}
}
}
}