Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- 생성자주입
- @RequestMapping
- 유효성검사
- 서비스레이어
- Java
- produces
- @ResponseBody
- gradle
- 의존주입
- AOP
- @
- @Valid
- .xml
- springmvc
- 어노테이션
- frontController
- jointpoint
- springjdbc
- SpringBoot
- spring
- PointCut
- 바인딩변수
- MVC
- Model
- after-throwing
- 비즈니스레이어
- application.properties
- c:if
- @RequestParam
- 스프링
Archives
- Today
- Total
메모장
[실습문제] 회원 상품구매 MVC패턴 2 본문
728x90
반응형
저번시간에 이어서
- 로그인, 로그아웃
- 마이페이지
- 회원탈퇴
항목을 추가 하였다 !
client 부분은 고정이기때문에 model 부분 중 Member DAO 부분과 controller 부분, client view 부분을 추가 하였다 !
Model - Member DAO
package model;
import java.util.ArrayList;
// 구현할 기능
// 회원목록출력
// 회원가입,로그인,로그아웃,마이페이지,회원탈퇴
public class MemberDAO {
private ArrayList<MemberVO> datas;
public MemberDAO() {
datas=new ArrayList<MemberVO>();
datas.add(new MemberVO("admin","1234","관리자")); // 아이디, 비밀번호,
datas.add(new MemberVO("coding_helper","timo","작은 티모"));
}
public ArrayList<MemberVO> selectAll(MemberVO mVO){
return datas; // 내가 가진 현재 회원목록 반환 하면 된다
}
public MemberVO selectOne(MemberVO mVO){
// 받은 값이 내 리스트에 있어 ?
for(MemberVO v : datas) { // 전체를 쭉 훑어 봤을때
if(mVO.getMid().equals(v.getMid())) {// 내가 받은 값이 배열에 있어 ? // 혹시 내가 받은값이 datas에 있어 ?
if(mVO.getMpw().equals(v.getMpw())) {//비밀번호 확인해보기
return v; //걔 반환해
}
System.out.println(" 로그: MemberDAO: selectOne(): 비밀번호가 일치하지않습니다!");
return null; // 비밀번호가 일치하지 않을때
}
}
System.out.println(" 로그: MemberDAO: selectOne(): 해당 아이디가 없습니다!");
return null; // 아이디가 등록 된 것이 없을때
}
public boolean insert(MemberVO mVO) { // C -> M 정보로 회원가입 가능 ?
//mVO 가 의미하는것 == 회원가입할 정보 <--- 로직에 들어갈 내용 //mVO -> 나 회원가입 시켜줘
//mVO를 내가가진 datas 에 넣어줄 예정
//PK 중복검사를 해야하고, 성공하면 add()
// 중복 검사를 꼭 하자 !!!
// 회원가입 시켜주세요 ~~ 하면 -> 일단 아이디 중복 검사 부터 해
// 내가 갖고있는걸 이거인지 저거인지 다 ~~~ 살펴봐야 아는 상황 --> flag 로직을 써야한다
// if(혹시 PK가 중복되었어?) {
// return false; //실패하면 false 반환
// }
// datas에 mVO정보를 저장 add() // 중복검사가 통과가 되면
// return true;
boolean flag = false; // 처음부터 끝까지 돌면서 나와같은 아이디가 있는지 체크하겠습니다
for(MemberVO data : datas) { // 아이디가 같은지 볼려면 데이터를 다 봐야한다. for문으로 데이터 다 ~ 보기
if(data.equals(mVO)) { //객체비교는 equals //오버라이딩 하러 가자 //data == mVO<--- 객체비교를 연산자로 하고 있음 xx
// 하나라도 회원가입한 정보랑 같아 ?
flag = true;
System.out.println(" 로그: MemberDAO: insert(): 아이디 중복"); // 로그 달아줌
break;
}
}
if(flag) { // PK가 중복 되었어? // 중복검사를 일단 하고
return false;
}
//if를 들어가지 않아 잘 내려왔다면
//datas 에 새로운 사람을 추가 하게 되고 // 새로운 아이디, 새로운 비번, 새로운 닉네임
datas.add(new MemberVO(mVO.getMid(),mVO.getMpw(),mVO.getName())); // 객체 new 써주고 객체
//새로운사람을 만들적에(인자였던 mVO에서 추출);
return true;
//datas 에 mVO정보를 저장 add() // 중복검사 성공하면 저장을 해
//mVO 를 datas 에 넣어줄 예정
// 인자였던 mVO 순으로 꺼내면 됨
/* 51 번라인 설명
*1) datas.add(new MemberVO());
* -> datas DB공간에 new 새로운 데이터를 추가 // new 객체
*2) MemberVO(데이터1,데이터2,데이터3)
-> 데이터들을 mVO에서 추출하면됨
*/
}
public boolean update(MemberVO mVO) {
// 정보를 입력받아서 새로운 비밀번호로 바꿔줘
// 전체를 돌려봤을때 입력한 정보와 내가 입력한 번호가 같으면
// 새로운 비밀번호로 바꿔줘
for (int i = 0; i < datas.size(); i++) {
if(datas.get(i).equals(mVO)) { // 새로운 것으로 변경
datas.get(i).setMpw(mVO.getMpw()); // 기존것을 다시 설정
return true;
}
}
return false;
}
public boolean delete(MemberVO mVO) {
for (int i = 0; i < datas.size(); i++) {
if(datas.get(i).equals(mVO)) { //전체를 돌렸을때 입력한 정보와 내가 가진 정보의 인덱스가 일치하면
datas.remove(i); // 삭제 한다.
return true;
}
}
return false; // 그렇지 않을시 false이다.
}
}
View - ClientView
package view;
import java.util.ArrayList;
import java.util.Scanner;
import model.MemberVO;
import model.ProductVO;
// 회원가입C,로그인R,로그아웃R,마이페이지U,회원탈퇴D
// 목록출력,목록검색_이름,목록검색_가격
public class ClientView {
private static Scanner sc=new Scanner(System.in);
public int printClientMenu01() { // 로그인 모드
// 로그인 하지 않은 사용자는 상품을 구매할 수 없다.
System.out.println();
System.out.println("=== 프 로 그 램 모 드 ===");
System.out.println("1. 회원가입");
System.out.println("2. 로그인");
System.out.println("3. 프로그램 종료");
System.out.print("입력) ");
return sc.nextInt();
}
public MemberVO signUp() { // 회원가입할 시에 안내 해줘야 하는것
System.out.println();
System.out.println("=== 회 원 가 입 ===");
System.out.print("아이디입력) ");
String mid=sc.next();
System.out.print("비밀번호입력) ");
String mpw=sc.next();
System.out.print("이름입력) ");
String name=sc.next(); // 아이디 비밀번호 이름 까지 입력해서
return new MemberVO(mid,mpw,name); // 그것을 전달 하는것 까지
// vo는 단순 자료형이다 ~ view에서 활용가능, DAO는 view에서 호출 안됨
}
public void signUpTrue() {
System.out.println();
System.out.println("회원가입 성공!");
}
public void signUpFalse() {
System.out.println();
System.out.println("회원가입 실패...");
}
public String getMpw() { // 비밀번호를 입력 받는다 // 회원탈퇴시 한번더 비밀번호 확인을 위해서
System.out.println();
System.out.println("=== 비 밀 번 호 확 인 ===");
System.out.print("비밀번호입력) ");
String mpw=sc.next();
return mpw;
}
public String printMpw(MemberVO mVO) { // 입력값을 mVO로 받으면 밑에서 mVO를 사용할 수 있다!
System.out.println();
System.out.println("=== 마 이 페 이 지 ===");
System.out.println(mVO.getName()+"님의 현재 비밀번호는 ["+mVO.getMpw()+"]입니다.");
while(true) { // 올바른 비밀번호를 입력 할때 까지
System.out.print("새 비밀번호입력) ");
String mpw=sc.next();
if(!mpw.equals(mVO.getMpw())) { // 전 비밀번호와 일치하지 않을때 !
return mpw;
}
}
}
public void printFalse() {
System.out.println();
System.out.println("비밀번호 불일치...");
}
public void printMemberDeleteTrue() {
System.out.println();
System.out.println("회원탈퇴 성공!");
}
public void printMemberDeleteFalse() {
System.out.println();
System.out.println("회원탈퇴 실패...");
}
public void printMemberUpdateTrue() {
System.out.println();
System.out.println("비밀번호 변경 성공!");
}
public void printMemberUpdateFalse() {
System.out.println();
System.out.println("비밀번호 변경 실패!");
}
public MemberVO signIn() {
System.out.println();
System.out.println("=== 로 그 인 ===");
System.out.print("아이디입력) ");
String mid=sc.next();
System.out.print("비밀번호입력) ");
String mpw=sc.next();
return new MemberVO(mid,mpw,null);
}
public void signInTrue() {
System.out.println();
System.out.println("로그인 성공!");
}
public void signInFalse() {
System.out.println();
System.out.println("로그인 실패...");
}
public void printClientEnd01() {
System.out.println();
System.out.println("=== 프 로 그 램 종 료 ===");
}
public int printClientMenu02(MemberVO mVO) { // 로그인 하면 들어오는 상태
System.out.println();
System.out.println("=== 사 용 자 모 드 ===");
System.out.println(" 현재 로그인한 사용자이름 ["+mVO.getName()+"]");
System.out.println("1. 로그아웃(사용자모드 종료)");
System.out.println("2. 마이페이지");
System.out.println("3. 회원탈퇴(사용자모드 종료)");
System.out.println("4. 상품목록출력");
System.out.println("5. 상품목록검색_이름으로 검색");
System.out.println("6. 상품목록검색_가격으로 검색");
System.out.println("7. 상품검색_최고가 검색"); // 하나를 검색
System.out.println("8. 상품검색_최저가 검색");
System.out.print("입력) ");
return sc.nextInt();
}
public ProductVO getSearchFilter() { // 최저부터 최고 까지 두개를 입력받음
System.out.println();
System.out.println("=== 가 격 으 로 검 색 ===");
System.out.print("최저가격입력) ");
int minPrice = sc.nextInt();
System.out.print("최고가격입력) ");
int maxPrice = sc.nextInt();
// 인자가 두개를 반환하는 행위는 못하기 때문에
//pVO에 담아서 넘겨준다.
// 안쓰는 공간을 활용하여 minPrice랑 maxPrice 를 두개 한번에 넘겨준다.
ProductVO pVO=new ProductVO(0,"필터검색",minPrice,maxPrice);
// searchCondition
return pVO;
}
public String getSearchContent() {// 그렇다면 검색어 넣으렴
System.out.println();
System.out.println("=== 이 름 으 로 검 색 ===");
System.out.print("검색어입력) ");
String name=sc.next();
return name;
}
public void printProduct(ProductVO pVO) {
System.out.println();
if(pVO==null) {
System.out.println("=== 출 력 할 상 품 없 음 ===");
return;
}
System.out.println("=== 상 품 출 력 ===");
System.out.println(pVO);
}
public void printProductList(ArrayList<ProductVO> pdatas) {//내가 목록을 출력하고 싶은 사람이야 //목록이 있어야 보여줄것 아니냐 목록을 받아야 보여준다.
System.out.println();
if(pdatas.isEmpty()) { // 혹시 비어있니 ? // 사용자편의성고려(UI/UX)
System.out.println("=== 출 력 할 상 품 없 음 ===");
return;
}
System.out.println("=== 상 품 목 록 출 력 ===");
for(ProductVO data:pdatas) {
System.out.println(data); // .toString()은 자동호출됩니다!
}
}
public void logout() {
System.out.println();
System.out.println("=== 로 그 아 웃 ===");
}
public void printClientEnd02() {
System.out.println();
System.out.println("=== 사 용 자 모 드 종 료 ===");
}
}
Controller - ProductController
package ctrl;
import java.util.ArrayList;
import model.MemberDAO;
import model.MemberVO;
import model.ProductDAO;
import model.ProductVO;
import view.AdminView;
import view.ClientView;
public class Ctrl { // DAO ,view 두개
private MemberDAO mDAO; // 회원가입한 사용자
private ProductDAO pDAO; // 상품
private AdminView admin;
private ClientView client;
private MemberVO member; // 현재 로그인한 회원정보 // 멤버변수로 관리 해볼수 있다.
// private CommonView common;// 두개를 다 이용할때 common 을 붙임
public Ctrl() {
mDAO=new MemberDAO();
pDAO=new ProductDAO();
admin=new AdminView();
client=new ClientView();
member=null; // 자동로그인을 해제하면 이게 초기화가 된다
// 세션 로그인 데이터 라고 부름 ~ 나중에 웹가서 배우기
// 프로그램을 실행한다고 해서 , 갑자기 로그인 되지는 않기 때문에 null 로 초기화
}
public void startApp() {
while(true) {
int action=client.printClientMenu01();
if(action==1234) { // 관리자 모드 진행 1234야?
while(true) { // 관리자 모드 진입
action=admin.printAdminMenu();
if(action==1) { // 회원목록 출력
//1. 사용자가 관리자인 상황
//if(action==1) // 2. 관리자가 회원목록볼래~
//model.selectAll(); // 모델.회원목록줘();
// 3. V가 C한테 말합니다. 회원목록보겠다는데?
// 4. C가 아, 회원목록데이터가 필요하구나? ㅇㅋ
// 5. M한테 회원목록 좀 줘~
// 6. M이 selectAll()합니다.
ArrayList<MemberVO> mdatas=mDAO.selectAll(null); //selectAll하려면
//인자가 있어야 하는데 넘겨줄 인자가 우리에겐 없기 때문에 그냥 null로 한다.
// 7. AL<MVO>가 반환되고 C는 그걸-
//view.회원 목록 출력(datas);
admin.printMemberList(mdatas); // view 목록
// 8. -V한테 줍니다.
// 줄인 코드
//admin.printMemberList(mDAO.selectAll(null));
}
else if(action==2) { // 관리자 모드 종료
admin.printAdminEnd();
break;
}
}
}
else if(action==1) { // 회원가입
// int action=client.printClientMenu01();
// 1. 사용자가 CONSOLE에 회원가입 할래 1번 입력
//2. V는 입력한 값을 C한테 전달 -> 전달된값 action
// else if(action==1)
// 3. C는 아 회원가입 하고 싶구나 ? ㅇㅋ
// 아이디,비밀번호, 이름 입력까지 해서 그것을 전달 하는 것 까지
MemberVO mVO = client.signUp(); // 정보들을 mVO에 담는다.
//회원가입 정보 = view.회원가입화면(); 뷰야 회원가입 화면 (); 띄워야지
// 그러면 회원가입 정보를 받아와야지
//4.C는 V한테 회원가입할 정보를 입력받아오라고 지시 // client.signup
//5.V는 사용자한테 회원가입 창 보여줌 // 회원가입 입력을 받도록 세팅
//6.사용자는 정보를 입력 // 사용자가 입력을 완료
//7.V는 사용자가 입력한 정보를 C한테 전달 signup에서 수행한 것들 mVO에 담음 // 회원가입 정보
// 회원가입이니까 mDAO가 맞다.
boolean flag = mDAO.insert(mVO); // true로 해놓은 상태 // 회원가입이니까 mDAO와 pDAO 둘중 ---> mDAO가 맞다.
//boolean 성공실패여부 = mDAO.insert(a);
//8.C는 이 정보를 M한테 전달 // model아 회원가입 정보좀 줘야겠다. // model.회원가입(a); // 회원가입은 == insert에 해당
//9.M은 회원가입을 수행 ---> model insert쪽에서 기능 수행
// boolean 성공실패 여부 = model.insert(a);
//10.M은 insert()가 잘 되었는지 아닌지를 T,F 반환 ---> boolean
if(flag) {//성공했어 ?
client.signUpTrue();//view.성공화면();
}else {
client.signInFalse();// view.실패화면();
}
//11.C는 결과에 따라 맞는 V화면을 보여줄수 있도록 지시
//12.사용자는 V가 보여주는 화면에 보게됨
// 코드를 줄이면 이렇게 변함
// if(mDAO.insert(client.signUp())) {
// client.signUpTrue();
// }
// else {
// client.signUpFalse();
// }
}
else if(action==2) { // 로그인
// 아이디입력해봐! 라고 V가 사용자에게 요청
// 비밀번호도 같이 입력해
MemberVO mVO = client.signIn(); //로그인 할거야 // 아이디랑 비번 입력하는 메서드
// 회원가입 할때도 썼던 메서드
member=mDAO.selectOne(mVO); // model을 실행 시켜야 할 때
// 있는지 없는지 좀 알려줘 // 등록된 정보에 있는 애인지 알려줘
// member에는 유효한 사용자 정보 or null
// 유효한 사용자 정보 == "현재 로그인한 회원"---> member // 반환된 애가 현재 로그인 한 애
// C는 이 정보가 있는지, 그리고 맞는지(==유효한지)
// 위의 여부를 M한테 판단을 부탁함
// --->> selectOne() // 로그인할때 등록된 아이디 인지 아닌지
if(member==null) { //없는 아이디랑 비번이면 // 로그인이 안된것
//null을 반환 == 없거나, 비밀번호가 틀림!
// -> 로그인 실패 V
// => 프로그램 모드에 계속 있어야함...
client.signInFalse();
continue;
// 프로그램 모드에 계속 존재
}
//로그인 성공
client.signInTrue(); // 로그인이 된것
// M은 VO를 반환 == 존재하는 회원
// -> 로그인 성공 V
// => 다음 스텝으로 이동
// 새로운 루프 시작
while(true) { // 로그인을 정상적으로 진행 됐다면 // 사용자 모드로 진입
action=client.printClientMenu02(member); // 로그인된 사용자의 정보를 넘겨 받았다.
if(action==1) { // 로그아웃
// 현재 로그인한 회원 이기 때문에
// 사용자가 로그아웃을 원하면,
//C에 mdata가 현재 존재하는데, 이걸
//제거하고
//로그아웃이 되었음을 사용자에게 알려주자 !
//만약 DB가 건드려 진다면 v->c->m->c->v 이지만
//로그아웃은 M을 부르는 일이 없다 .
//로그아웃은 DB를 건드리지 않고 m부분을 건드리지 않기 때문에 V->C->V로 진행
client.logout(); // 로그아웃합니다
client.printClientEnd02(); // 사용자 모드 종료
break;
}
else if(action==2) { // 마이페이지
// 마이페이지
//사용자가 마이페이지를 원하여 action으로 들어온다.
// 뷰가 비번을 입력받음
//client.printMpw(); // 이걸 받아서 어디다 저장하고 넘겨야지 !
String mpw = client.printMpw(member);
// String 으로 반환 했으니 무조건 String에 담아
//v에서 변경할 정보를 입력받는다.
//(비밀번호 변경 시 비밀번호를 입력받는 메서드 활용)
//뷰가 비번을 c에게 전달. 객체 하나 생성
MemberVO mdata = new MemberVO(member.getMid(),mpw,null);
// c는 이걸 m에게 묶어서 보낼건데
// 일단 객체 공간에 담는다.
// 전달만 할때
boolean flag=mDAO.update(mdata); // model을 실행 시켜야 할때
//c->model로 묶어서 보낸 정보를 m.update()수행해달라고 부탁함
//m-> c 로 다시 전달해준다.
if(flag) { // 성공하면 //비밀번호 변경 성공 !
client.printMemberUpdateTrue();
}
else {//비밀번호 변경 실패 !
client.printMemberUpdateFalse();
}
}
//c에서 성공시 비밀번호 변경 성공 !
//실패시 비밀번호 변경 실패 띄우기 .
else if(action==3) { // 회원탈퇴
// 현재 로그인 한 상황 -> 이미 멤버에 들어가있는 상황
// String mpw = view.비밀번호 입력해봐 (); // 비밀번호를 입력 하면
String mpw = client.getMpw(); // view에게 비밀번호만 다시 입력받도록 값을 받는다.
if(!member.getMpw().equals(mpw)) { // !flag인 상황 // 같은지 아닌지 체크
// 현재 로그인한 사람의 비밀번호와 사용자가 입력한 비밀번호를 확인하는 로직
// 같은 비밀번호가 아니라고 했을시
// 비밀번호가 불일치 한다고 생각 하고 not! 을 붙임
//비밀번호 불일치
client.printFalse(); // 비밀번호 실패 메세지 띄움
continue; // 비밀번호가 일치 않았다면 ~ continue
}
// if 에 안들어갔다면 일치! 이제 삭제 진행
// mDAO.delete(member) << 이거 자체가 if문에서 수행되어버리기때문에
// boolean flag=mDAO.delete(member);
// if(flag) 와 동일하기때문에 수행됩니다
if(!mDAO.delete(member)) { // !flag 인 상황 //model.delete(지금 로그인 한 사람)이 잘 안됐다면 false
//회원 정보 삭제가 안됐다면
client.printMemberDeleteFalse(); // 회원 탈퇴 실패
continue; // 의문 : false가 나올확률이 있을까 ? 굉장히 희박
// 근데 혹시나 해커가 뚫을 수도 있을경우를 대비해 유효성을 만들자
}
client.printMemberDeleteTrue(); // 회원 탈퇴 성공
client.printClientEnd02(); //사용자 모드 종료
break;
}
// 잘됐으면 true
// 비밀번호를 한번더 확인 하는 로직이 있으면 더 좋다 // 회원탈퇴를 하려면 비밀번호를 입력해
// 비밀번호가 불일치 (본인이 아닐수 있을때) -> 회원탈퇴x
// 비밀번호 일치 시
// -> 로그인이 되어있는 회원을
// 전체 회원 목록에서 제거
else if(action==4) { // 상품목록출력 // 상품은 그냥 보여주기만 하면됨
// M에서 받아서 C 출력
ArrayList<ProductVO> pdatas=pDAO.selectAll(null);
client.printProductList(pdatas); // 회원목록출력이랑 맥락이 같다.
}
else if(action==5) { // 상품목록검색_ 이름으로 검색 // 검색은 상품의 이름을 입력받아서 보여줘야 된다는 차이점이 있다.
String name = client.getSearchContent(); // 검색어를 뷰로 부터 받아오기
// 검색어를 뭘 받아올래 ?
// 그 검색어를 모델 한테 넘겨주기
ProductVO pVO = new ProductVO (0,name,0,0); // 우리는 이름만 필요하니까
pDAO.selectAll(pVO);
ArrayList<ProductVO> pdatas = pDAO.selectAll(pVO);
client.printProductList(pdatas);
}
else if(action==6) { // 상품목록검색_가격으로 검색
//사용자가 V에서 검색을 하고싶다고 말하면서 버튼을 누른다.
// 무엇을 검색으로 받아올래 ? price
// C가 V한테 검색할 것을 받아오라고 한다
// V는 사용자에게 검색에 대해 가격을 입력받아온다.
// V가 가격을 받아와 C에게 전달한다.
ProductVO pVO=client.getSearchFilter();
// C는 M에게 넘겨서 이 가격에 대해 가장 비싼 상품검색해줘라고 전달한다
pDAO.selectAll(pVO);
// M은 가격을 입력받아 그 가격에 대한 정보를 검색한다.
// M에서 검색한 정보를 C에게 전달한다.
ArrayList<ProductVO> pdatas=pDAO.selectAll(pVO);
// C는 V에게 검색한 정보를 전달한다.
// V는 사용자에게 보여준다.
client.printProductList(pdatas);
// C는 View 검색완료 안내멘트를 띄운다.
}
else if(action==7) { // 상품검색_최고가 검색
ProductVO pVO=new ProductVO(0,"최고가",0,0);
ProductVO data=pDAO.selectOne(pVO);
client.printProduct(data);
}
else if(action==8) { // 상품검색_최저가 검색
ProductVO pVO = new ProductVO(0,"최저가",0,0);
ProductVO data = pDAO.selectOne(pVO);
client.printProduct(data);
}
}
}
else if(action==3) { // 프로그램종료
client.printClientEnd01();
break;
}
}
}
}
728x90
반응형
'JAVA > [실습문제]' 카테고리의 다른 글
| [실습 문제] 지니뮤직 웹크롤링 해보기 ! (1) | 2024.04.08 |
|---|---|
| [실습문제] 회원 상품구매 MVC패턴 (0) | 2024.04.08 |
| [실습문제] 자판기프로그램 MVC패턴 (0) | 2024.04.08 |
| [실습문제] 포켓몬(추상클래스, private) (0) | 2024.04.08 |
| [실습문제] 상속 (응용문제) (0) | 2024.04.08 |