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

MVC Pattern Practice 3 본문

코리아IT핀테크과정

MVC Pattern Practice 3

언제나즐거운IT 2023. 12. 17. 21:03

DTO가 Member, Product 2개인 MVC 패턴을 학습하였다.

일단..하나 꺠달은점은 

객체 생성후 초기상태와 null 값으로 초기화한 상태는 다르다는 것을 알았다. 객체 생성후 초기상태는 객체의 멤버변수들이 null값 or 0을 가지는 상태이고, 객체를 null로 초기화하면 객체 자체가 null이되어

setter를 통해 값을 변경하고자 할때 NullPointerException을 만난다.

다음 객체를 출력해보자.

출력값

와 같이된다.. 따라서 selectOne 함수를통해 null을 리턴받은걸 객체에 넣어서 조건을 확인하면

다시한번 객체를 생성해줘야한다!

 

MemberDTO

package model;

public class MemberDTO {
	// PK란? 시스템이 부여하는 값
	// 유일한 값이어야함!!!!!
	
	// ID의 경우, 사용자가 생성함
	// "ID 중복검사"
	private String mid; // PK
	private String mpw;
	private String name;
	private String mpwCheck;
	
	
	public String getMpwCheck() {
		return mpwCheck;
	}
	public void setMpwCheck(String mpwCheck) {
		this.mpwCheck = mpwCheck;
	}
	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 "[ID =" + mid + " PW =" + mpw + " 이름 =" + 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 < datas.size(); i++) {
				if (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 하는 이유 ? 원본이 변경되는것을 막기위함.
            //여기가 원래는 retrun this.datas.get(i); 여서 원본객체하나를 넘겨주고 
            //그것을 ctrl에서 조작하다보니 원본데이터가 call by reference로 인해 훼손되었다.
            //따라서 새로운객체를 생성해 거기에 찾은값을 담고 넘겨준다!!!!!!!!

		} else if (memberDTO.getSearchCondition().equals("로그인")) {

			boolean flag = false;
			int i;
			for (i = 0; i < 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; 

		} else if (memberDTO.getSearchCondition().equals("비밀번호변경")) {

			boolean flag = false;
			int i;
			for (i = 0; i < datas.size(); i++) {
				if (this.datas.get(i).getMid().equals(memberDTO.getMid())) {
					if (this.datas.get(i).getMpw().equals(memberDTO.getMpw())) {
						flag = true;
						break;
					}
				}
			}
			if (!flag) {
				return null;
			}
			MemberDTO data = new MemberDTO();
			data.setMpw(this.datas.get(i).getMpw());
			return data; // data를 new 하는 이유 ? 원
		}
		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) {
		if (memberDTO.getSearchCondition().equals("비밀번호변경")) {
			boolean flag = false;
			int i;
			for (i = 0; i < datas.size(); i++) {
				if (memberDTO.getMpwCheck().equals(memberDTO.getMpw())) {
					flag = true;
					break;
				}
			}
			if (!flag) {
				return false;
			}
			this.datas.get(i).setMpw(memberDTO.getMpw());
			System.out.println("로그!!!!!!!");
		}
		return true;
	}

	public boolean delete(MemberDTO memberDTO) {
		try {
			int i;
			for (i = 0; i < this.datas.size(); i++) {
				if (this.datas.get(i).getMid().equals(memberDTO.getMid())) {
					break;
				}
			}
			this.datas.remove(i);
		} catch (Exception e) {
			return false;
		}
		return true;
	}
}

 

Ctrl

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.view = new View4();
		this.PK = 1003;
		this.user = null;
		this.memberView = new MemberView();
		this.memberDAO = new MemberDAO();
	}

	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();
						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;
				}
			} 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.inputMemberPasswd();
				memberDTO.setMpw(mpw);
				String name = memberView.inputMembmerName();
				memberDTO.setName(name);
				memberDAO.insert(memberDTO);

				memberView.signUpTrue();

			} else if (action == 5) {
				if (user != null) {
					continue;
				}

				String mid = memberView.inputMemberID();
				String mpw = memberView.inputMemberPasswd();
				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.inputPresentPW();
				MemberDTO memberDTO = new MemberDTO();
				memberDTO.setMid(user.getMid());
				memberDTO.setMpw(mpw);
				memberDTO.setSearchCondition("비밀번호변경");
				memberDTO = memberDAO.selectOne(memberDTO);
				if (memberDTO == null) {
					continue;
				}

				memberDTO = new MemberDTO();
				memberDTO.setSearchCondition("비밀번호변경");
				mpw = memberView.inputNewPw();
				memberDTO.setMpw(mpw);
				String mpwCheck = memberView.inputNewPwAgain();
				memberDTO.setMpwCheck(mpwCheck);
				boolean flag = memberDAO.update(memberDTO);
				if (!flag) {
					memberView.printFalse();
				} else {
					memberView.printTrue();
				}

			}

			else if (action == 8) {
				if (user == null) {
					continue;
				}
			//	MemberDTO memberDTO = new MemberDTO();
			//	memberDTO.setMid(user.getMid());
				memberDAO.delete(user);
				user = null; // 로그아웃도 시켜주어야함!
				memberView.printTrue();
			}
		}
	}

}

 

*selectOne과 회원가입 과정에서 처음부터 유저에 없는 아이디로 생성하면 문제 없지만

sample로 저장되어있던 admin으로 가입을 시도하면 중복되어서 가입이 불가능 하다고 나온 후 그 이후에 새로운 아이디로 가입하려고하면 계속 중복으로 나왔던 이유!!

 

처음 admin을 입력하면 selectOne함수에 의해 admin을 가진 유저객체를 return 해준다.

그럼 그것이 Ctrl에서 새로생성한 memberDTO에 들어가게 되는데 이때 이 객체의 정보는 call by reference 이기에 지금부터 memberDTO에 들어간 값을 바꾸면 원본 datas가 같이 바뀐다.

따라서 두번째 아이디 입력을 datas에 없는 것 으로 하는과정 -> memberDTO.setMid(mid); 에서

유저에게 입력받은 ID가 원래 ID인 admin을 대체하게된다. 따라서 selectOne을 수행할때 

같은 아이디가 있는것으로 간주되어서 null을 return하지 못하고 함수가 끝난다.

 

public MemberDTO selectOne(MemberDTO memberDTO) {
		if (memberDTO.getSearchCondition().equals("ID중복검사")) {
			boolean flag = false;
			int i;
			for (i = 0; i < datas.size(); i++) {
				if (datas.get(i).getMid().equals(memberDTO.getMid())) {
					flag = true;
					System.out.println("null을...못넘겨주네!!!");
					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 this.datas.get(i); // data를 new 하는 이유 ?

 

				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.inputMemberPasswd();
				memberDTO.setMpw(mpw);
				String name = memberView.inputMembmerName();
				memberDTO.setName(name);
				memberDAO.insert(memberDTO);

				memberView.signUpTrue();

 

유저기능중... 비밀번호변경을 과제로 받았는데 쉽지않았다 @_@ 뭔가 코드정리가 매우 안된 기분이다.

그리고 비밀번호 변경중 변경할 비밀번호를 재확인 하는 과정에서 필요한 멤버변수가 아까운 기분이든다!

 

'코리아IT핀테크과정' 카테고리의 다른 글

MVC with Oracle 1  (0) 2023.12.19
MVC Pattern Practice 4  (0) 2023.12.18
MVC Pattern Practice 2  (0) 2023.12.14
MVC Pattern Practice 1  (0) 2023.12.13
DTO (Data Transfer Object) DAO (Data Access Object)  (0) 2023.12.12
Comments