반응형
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 코딩을 시작하여야 한다.!!★★★★★
반응형
'JAVA' 카테고리의 다른 글
Jsoup을 이용한 웹 크롤링 (1) (0) | 2022.07.13 |
---|---|
[JAVA] MVC 학생부 프로그램 실습 (0) | 2022.07.04 |
[JAVA] 시험 오답풀이 (For-each문) (0) | 2022.06.27 |
[JAVA] 파일 입출력 (FileInputStream , FileOutputStream) (0) | 2022.06.27 |
[JAVA] 예외 처리 (try, catch, finally) (0) | 2022.06.27 |