재밌고 어려운 IT를 이해해보자~!
MVC Pattern Practice 2 본문
재고변경이 아닌 재고추가기능
메뉴검색과 메뉴가격변경 [관] 기능 추가 !
재고 추가는 Controller에서 하는게 아닌 DAO에서 해줘야한다.
ProductDAO
package model;
import java.util.ArrayList;
public class ProductDAO2 {
private ArrayList<ProductDTO> datas; // DB
public ProductDAO2() {
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;
} 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).getPrice() >= productDTO.getPrice()) {
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.setCnt(productDTO.getCnt());
} else if (productDTO.getSearchConditon().equals("재고추가")) {
// productDTO.setCnt(productDTO.getCnt() + productDTO.getAddCnt());
} else if (productDTO.getSearchConditon().equals("가격변경")) {
// productDTO.setPrice(productDTO.getPrice());
} 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;
}
}
ProductDTO
package model;
public class ProductDTO {
private int num; // PK
private String name;
private int price;
private int cnt;
private int addCnt;
public int getAddCnt() {
return addCnt;
}
public void setAddCnt(int addCnt) {
this.addCnt = addCnt;
}
private String searchConditon; // JAVA 로직에서만 사용하는 변수
// 웹 개발에서는,
// 기본 생성자를 사용하는 것을 원칙으로 한다!!!!!
// : new할때 생성자의 인자로 넣는 값중에서,
// 어떤 값이 정말 유효한 값인지 파악하는 시간을 줄이기위함!
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 + "]";
}
}
VIEW
package model;
public class ProductDTO {
private int num; // PK
private String name;
private int price;
private int cnt;
private int addCnt;
public int getAddCnt() {
return addCnt;
}
public void setAddCnt(int addCnt) {
this.addCnt = addCnt;
}
private String searchConditon; // JAVA 로직에서만 사용하는 변수
// 웹 개발에서는,
// 기본 생성자를 사용하는 것을 원칙으로 한다!!!!!
// : new할때 생성자의 인자로 넣는 값중에서,
// 어떤 값이 정말 유효한 값인지 파악하는 시간을 줄이기위함!
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 + "]";
}
}
CTRL
package ctrl;
import java.util.ArrayList;
import model.ProductDAO2;
import model.ProductDTO;
import view.View2;
public class Ctrl2 {
private ProductDAO2 productDAO; // MODEL
private View2 view;
private int PK;
public Ctrl2() {
this.productDAO = new ProductDAO2();
this.view = new View2();
this.PK = 1003;
}
public void start() {
while (true) {
view.printMenu();
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();
ArrayList<ProductDTO> list = new ArrayList<ProductDTO>();
productDTO.setNum(num);
productDTO = productDAO.selectOne(productDTO);
if (productDTO == null) {
view.printNoData();
continue;
}
int cnt = view.inputAddCnt();
productDTO.setAddCnt(cnt);
productDTO.setSearchConditon("재고추가");
boolean flag = productDAO.update(productDTO);
if (flag) {
view.printTrue();
} else {
view.printFalse();
}
}
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.inputChangePrice();
productDTO.setPrice(price);
productDTO.setSearchConditon("가격변경");
boolean flag = productDAO.update(productDTO);
if (flag) {
view.printTrue();
} else {
view.printFalse();
}
}
}
} 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) {
while (true) {
view.printSearchMenu();
action = view.inputInteger();
if (action == 1) {
ProductDTO productDTO = new ProductDTO();
productDTO.setSearchConditon("이름검색");
String name = view.inputName();
productDTO.setName(name);
ArrayList<ProductDTO> datas = productDAO.selectAll(productDTO);
if (datas == null) {
view.printNoData();
continue;
}
view.printDatas(datas);
}
else if (action == 2) {
ProductDTO productDTO = new ProductDTO();
productDTO.setSearchConditon("가격검색");
int price = view.inputInteger();
productDTO.setPrice(price);
ArrayList<ProductDTO> datas = productDAO.selectAll(productDTO);
if (datas == null) {
view.printNoData();
continue;
}
view.printDatas(datas);
}
break;
}
}
}
}
}
한가지 특이한 점은 다음 부분을 주석처리해도 코드가 잘돌아간다. 그이유를 찾아보니..!!
public boolean update(ProductDTO productDTO) {
if (productDTO.getSearchConditon().equals("구매")) {
// productDTO.setCnt(productDTO.getCnt() - 1);
} else if (productDTO.getSearchConditon().equals("재고변경")) {
// productDTO.setCnt(productDTO.getCnt());
} else if (productDTO.getSearchConditon().equals("재고추가")) {
// productDTO.setCnt(productDTO.getCnt() + productDTO.getAddCnt());
} else if (productDTO.getSearchConditon().equals("가격변경")) {
// productDTO.setPrice(productDTO.getPrice());
} else {
return false;
}
return true;
}
다음 재고변경 로직을 보자.
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 실패 ...
}
PK값 (num)을 유저로부터 입력받아 selectOne메서드를 통해 원본 전체 리스트에서 같은 PK값을 가진 객체를 productDTO 객체에 대입해준다.
selectOne 메서드는 다음과 같다.
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);
}
즉 selectOne으로 부터 return받은 객체는 call by reference이기때문에
그 객체를 변경하면 원본 데이터도 같이 바뀌게 된다!!!
결론적으로, update 메서드가 실행되지 않아도 이미 바뀐값인데 앞으로 스프링에서 쓸걸 감안해서 저렇게 쓰도록 유도해주신 것 같다!
'코리아IT핀테크과정' 카테고리의 다른 글
MVC Pattern Practice 4 (0) | 2023.12.18 |
---|---|
MVC Pattern Practice 3 (0) | 2023.12.17 |
MVC Pattern Practice 1 (0) | 2023.12.13 |
DTO (Data Transfer Object) DAO (Data Access Object) (0) | 2023.12.12 |
MVC design pattern (0) | 2023.12.12 |
Comments