재밌고 어려운 IT를 이해해보자~!

MVC Pattern Practice 2 본문

코리아IT핀테크과정

MVC Pattern Practice 2

언제나즐거운IT 2023. 12. 14. 18:30

재고변경이 아닌 재고추가기능

메뉴검색과 메뉴가격변경 [관] 기능 추가 !

 

재고 추가는 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