본문 바로가기

JAVA

[JAVA] MVC 자판기 프로그램 실습 (CRUD 개념)

반응형

CRUD란?

대부분의 컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 

Create(생성),Read(읽기),Update(갱신), Delete(삭제)를 묶어서 일컫는 말이다.

사용자 인터페이스가 갖추어야 할 기능(정보의 참조/검색/갱신)을 가리키는 용어로서도 사용된다.

 

 

MVC 자판기 프로그램 

[설계]
- MODEL - 
VO : 데이터 정의
             PK (똑같은 상품이 있을수도 있으니)
             제품이름
             가격
             재고
DAO : 비즈니스 메서드(핵심로직, CRUD)
            VO를 가지고 어떤 동작을 할지
            (C)관리자 >> 새로운 음료를 추가하는 행위
            (R)음료들을 보여주는 행위 [서비스](음료 검색은 하지않음XXX)
            (U)관리자 >> 음료의 재고를 추가하는 행위
            (R)음료를 구매하는 행위 [서비스]
             (D)관리자 >> 기존의 음료 메뉴를 삭제하는 행위

- VIEW - 
User Flow 사용자의 편의성을 도모
                  사용자가 입력한 값을 유효성 검사
                 ---사용자모드---
                  1) 전체메뉴
                  === 자판기 ===
                  1. 메뉴확인 2. 구매 3. 종류
                  2) 1번을 눌렀을때 사용자에게 제공될 화면
                  현재 DB(음료들을 N개 저장할 객체 : 컬렉션-배열리스트)에 존재하는 메뉴들을 출력
                  3) 2번을 눌렀을때 사용자에게 제공될 화면(1)
                  ㅁㅁ 구매완료되었습니다!
                  4) 2번을 눌렀을때 사용자에게 제공될 화면(2)
                  ㅁㅁ 재고가없습니다.
                  => 애초에 눌렀을때부터 구매가 안되는 상황 선택을 했을때 재고 없다고 보이게 해도됨
                  5) 3번을 눌렀을때 사용자에게 제공될 화면 프로그램이 종료됩니다.

                 ---관리자모드---
                 1. 음료주가 2.재고추가 3. 음료삭제 4. 관리자모드 종료

- CONTROLLER -
M-V 연결다리 역할 
                  사용자모드 
                  관리자모드 

<MODEL 파트 VO부분> 

데이터 정의, 특정 정보를 객체화 하는 부분 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package model;
 
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 + "]";
    }
}
 
cs

<MODEL 파트 DAO부분> 

 VO가 데이터를 정의하는 곳이면, DAO는 데이터를 사용할 수 있도록 로직 만드는 구간
 핵심 로직, 비즈니스 메서드, CRUD

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package model;
 
import java.util.ArrayList;
 
// CRUD
public class ProductDAO {
    // DB를 대체하는 컬렉션(배열리스트)
    ArrayList<ProductVO> datas;
    private int pk=101; //초기 PK값을 101로 설정
 
    public ProductDAO() { // 생성자 
        datas=new ArrayList<ProductVO>(); //멤버변수 초기화 
        // 초기 데이터
        // 샘플 데이터
        ProductVO vo = new ProductVO();
        vo.setName("홍길동");
        vo.setNum(pk++);
        vo.setPrice(1000);
        vo.setCnt(5);
        datas.add(vo);       
    }
 
    // 관리자
    // 새로운 음료 추가
    // 음료 재고 추가
    // 기존 음료 삭제
 
    // 사용자(서비스)
    // 음료 출력 // 출력은 v에서 해야함 
    // 음료 구매
    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 (datas.get(i).getNum()==vo.getNum()) {
                System.out.println("로그: "+ datas.get(i)+"반환");
                return datas.get(i);
            }
        }
        System.out.println("로그 : 반환xxx -> 확인필요!");
        return null// 못찾으면 
    }
    
    // 1. 결재하면 -1 
    // 2. 결재하면 -n 
    // 3. 결재완료 시 총 금액 => c에서 update마치고 selectone 
    // 4. 재고추가 + N 
    public boolean  update(ProductVO vo) { //셋팅 성공여부 
        for (int i = 0; i < datas.size(); i++) {
        }
        for (ProductVO data : datas) {
            if (data.getNum()==vo.getNum()) {
                data.setCnt(data.getCnt()+vo.getCnt());
                return true;
            }
        else if(vo.getCnt()==0) { //재고가 없는 경우 
            System.out.println("로그:" + vo.getNum()+"재고가 없습니다.");
            return false;
        }
        }
        return false;    
    }
 
    public boolean insert(ProductVO vo) { //새로운 메뉴 추가 
        try {
            vo.setNum(pk++);
            datas.add(vo);
            System.out.println("로그 : 메뉴추가성공!");
        }catch(Exception e) {
            System.out.println("로그 : 메뉴추가실패 : 확인이필요한 예외발생");
            e.printStackTrace();
            return false;
        }
        return true;
    }    
    // 사용자가 pk 입력
    // pk에 해당하는 음료를 출력 
    // 음료의 재고 --; 
 
    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;
    }
}
 
cs

<VIEW  파트> 

UI/UX
User Flow 
사용자의 편의성, 1차적인(기본적인) 유효성 검사를 하는 구간 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package view;
 
import java.util.ArrayList;
import java.util.Iterator;
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));
        }
 
        //action+=100; -> c에서 해도됨  
    }
    public void func2(ArrayList<ProductVO> datas) { //전체메뉴출력후 원하는메뉴받기 
        
            for (int i = 0; i < datas.size(); i++) {
                System.out.println(datas.get(i).getNum()+"번 메뉴");
                if (datas.get(i).getCnt()==0) {
                    System.out.println("x");
                    continue;
                }
                System.out.println((i+1)+"번메뉴"+datas.get(i));
            }
            while(true) {
            System.out.print("메뉴입력) ");
            action=sc.nextInt();
            if (1<=action &&action<=datas.size()) {
                break;
            }
            System.out.println("상품번호 확인후 다시입력해주세요!");
        }
    }
    public void funcT() {
        System.out.println("구매완료");
    }
    public void funcF() {
        System.out.println("재고가 없습니다...");
    }
    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_fun1() { // 1~4 메뉴를 보여주는 출력문구 
        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_fun2() { // 음료추가
        System.out.println("음료추가 메뉴입니다.");
    }
    public String admin_fun3() { //음료이름입력
        System.out.println("음료 이름을 입력)");
        String name=sc.next();
        return name;
    }
    public int admin_fun4() { //음료가격입력
        System.out.println("음료 가격을 입력)");
        int price=sc.nextInt();
        return price;
    }
    public int admin_fun5() { //음료재고입력
        System.out.println("음료 재고를 입력)");
        int cnt=sc.nextInt();
        return cnt;
    }
    public void admin_fun6() { //수행완료
        System.out.println("수행완료");
    }
    public void admin_fun7() { //수행실패
        System.out.println("수행실패");
    }
    public void admin_fun8() { //음료재고추가
        System.out.println("음료재고추가 메뉴입니디.");
    }
    public int admin_fun9() { //번호입력
        System.out.println("번호입력 입력)");
        int num=sc.nextInt();
        return num;
    }
    public void admin_fun10() { //음료삭제
        System.out.println("음료삭제 메뉴입니디.");
    }
}
 
cs

 <CONTROLLER 파트> 

M-V 연결다리 역할

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
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] 
                //c에서는 사용자가 입력한 메뉴의 번호를 view.action으로 참조가능
                //M은 pk를 입력받으면 상품객체를 줄 준비가 되어있습니다. 
                int num=view.action+100//v에서 사용자가 입력한 메뉴번호 pk
                vo.setNum(num);
                ProductVO data =model.selectOne(vo);
                if (data==null) {
                    continue;
                }
                vo.setCnt(-1); //하나씩 구매하기 위해서 
                System.out.println("로그1:"+vo);
                boolean flag=model.update(vo);
                //pk를 넣으면 해당하는 상품을 반환하는 M의 selectOne()메서드
                ProductVO data2=model.selectOne(vo);
                int cnt=vo.getCnt();
                // 구매한 개수 
                int price=data2.getPrice();
                int total=cnt*price*-1// cnt가 -이기때문에 -1 곱해준다
                System.out.println("로그 : 총 결제 금액은"+total+"원");
                //m은 반환받은(==사용자가선택한) 객체의 재고를 -- 
                //위내용을 한번에 적을때는 아래처럼 
                //                model.update(model.selectOne(view.action+100));
                if (flag) {
                    view.funcT();
                }else {
                    view.funcF();
                }
 
            }else if (view.action==3) {
                view.func3();
                break;
            }else if (view.action==1234) {
                // 1. ====관리자 모드 ===
                // 1)음료추가
                // 2) 음료재고추가
                // 3) 음료삭제
                // 2. 추가할음료의 정보를 입력하세요
                // 3. 추가할 음료의 번호와 개수를 입력하세요
                // 4. 삭제할 음료의 번호를 입력하세요. 
                while(true) {
                    view.admin_fun1();
                    if (view.action==1) { //음료추가 
                        view.admin_fun2();
                        String name=view.admin_fun3();
                        int price=view.admin_fun4();
                        int cnt=view.admin_fun5();
                        ProductVO vo = new ProductVO();
                        vo.setName(name); //제품이름 set
                        vo.setPrice(price); //제품가격 set
                        vo.setCnt(cnt); // 재고 set
                        boolean flag = model.insert(vo);
                        if(flag) {
                            view.admin_fun6();
                        }else {
                            view.admin_fun7();
                        }
                    }else if (view.action==2) { //음료재고추가 
                        view.admin_fun8();
                        ProductVO vo = new ProductVO();
                        view.func1(model.selectAll(vo));
                        int num=view.admin_fun9();
                        num+=100;
                        int cnt=view.admin_fun5();
                        //추가될 재고개수
                        vo.setCnt(cnt);
                        vo.setNum(num);
                        boolean flag = model.update(vo);
                        if (flag) {
 
                            view.admin_fun6();
                        }else {
                            view.admin_fun7();
                        }
 
                    }else if (view.action==3) { //음료삭제 
                        view.admin_fun10();
                        int num=view.admin_fun9();
                        ProductVO vo = new ProductVO();
                        vo.setNum(num);
                        if (vo==null) {
                            System.out.println("로그 : 해당"+num+"음료가 존재하지 않습니다.");
                            view.admin_fun7();
                        }
                        boolean flag = model.delete(vo);
                        if (flag) {
                            view.admin_fun6();
                        }else {
                            view.admin_fun7();
                        }
                    }else if (view.action==4) {
                        view.func3();
                    }break;
                }
            }
        }
    }
}
 
 
cs

<CLIENT 파트> 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package client;
 
import controller.ProductController;
 
 
public class Client {
    public static void main(String[] args) {
        
        ProductController app =new ProductController();
        
        
        app.startApp();
        
    }
}
 
cs

** 주의사항

먼저 설계도를 구성하고 MVC 코딩을 시작하여야 한다.!!★★★★★

 

 

 

 
 

 

 

 

 

반응형