Java - 18

하승·2022년 7월 11일
0

웹 개발반 - Java

목록 보기
18/19
post-thumbnail

종합 예제

MainView 만들기.

package view;

import java.util.Scanner;

import dao.ProductDAO;
import dao.ProductDAO;
import dao.Session;

public class MainView {
	public MainView() {
		Scanner sc = new Scanner(System.in);
		ProductDAO pdao = new ProductDAO();
		
		while(true) {
			//우리가 만든 프로젝트는 무조건 main()부터 시작하는 프로그램이다.
			//즉 진입점이 한개이기 때문에 아래와 같은 코드를 생략 가능하다.
			//*웹 상이나 다른 프로그램에서는 진입점이 여러개일 수 있으므로
			//아래처럼 로그인 되어있는지를 먼저 검사해주는것이 필요하다.
			if(Session.get("login_id") == null) {
				System.out.println("로그인 후 이용하세요");
				break;
			}
			System.out.println("☆★☆★☆★☆★"+Session.get("login_id")+"님 어서오세요~☆★☆★☆★☆★\n"
					+ "1. 상품추가\n2. 상품수정\n3. 상품삭제\n"
					+ "4. 내 상품 보기\n5. 상품 검색\n6. 내 정보 수정\n7. 로그아웃");
			int choice = sc.nextInt();
			
			if(choice == 7) {
				//로그아웃
				System.out.println(Session.get("login_id")+"님 안녕히가세요~");
				//로그인한 정보를 담아주는 Session에서 login_id라는 KEY 와 쌍을 이루고 있는 값은
				//로그아웃을 했다면 없애주어야 한다. 따라서 null로 초기화 해주어야 한다.
				Session.put("login_id", null);
				break;
			}
			switch(choice) {
			case 1:
				//상품추가
				new AddProductView();
				break;
			case 2:
				//상품수정
				new ModifyProductView();
				break;
			case 3:
				//상품삭제
				//내 상품 목록 띄워주고 번호 입력받아서 삭제시키기
				System.out.println(pdao.getList());
				System.out.print("삭제할 상품 번호 : ");
				int prodnum = sc.nextInt();
				if(pdao.removeProduct(prodnum)) {
					System.out.println(prodnum+"번 상품 삭제 성공!");
				}
				else {
					System.out.println("알 수 없는 오류 / 다음에 다시 시도해 주세요.");
				}
				break;
			case 4:
				//내 상품 보기
				System.out.println("===========내가 올린 상품 목록===========");
				System.out.println(pdao.getList());
				System.out.println("===================================");
				break;
			case 5:
				//상품 검색
				System.out.print("검색어를 입력하세요 : ");
				sc = new Scanner(System.in);
				String keyword = sc.nextLine();
				
				System.out.println(pdao.search(keyword));
				break;
			case 6:
				//내 정보 수정
				new MyInfoView();
				break;
			}
			
		}
	}
}

상품 추가를 누른다면 AddProductView로 이동시켜 상품의 대한 내용을 입력 받고
ProductDAO의 addProduct 메소드를 호출하여 상품을 추가한다.

package view;

import java.util.Scanner;

import dao.ProductDAO;
import dao.Session;
import dto.ProductDTO;

public class AddProductView {
	public AddProductView() {
		//상품에 관련된 정보에 접근할 객체인 pdao 생성(상품 관련된 기능들이 선언되어 있다.)
		ProductDAO pdao = new ProductDAO();
		Scanner sc = new Scanner(System.in);
		
		System.out.print("상품 이름 : ");
		String prodname = sc.nextLine();
		System.out.print("상품 가격 : ");
		int prodprice = sc.nextInt();
		System.out.print("상품 재고 : ");
		int prodamount = sc.nextInt();
		System.out.print("상품 소개 : ");
		sc = new Scanner(System.in);
		String prodinfo = sc.nextLine();
		
		//지금 추가중인 상품의 상품번호는 현재 "추가되어 있는 마지막 상품의 번호"+1로 설정해 주어야 한다.
		//pdao에 getLastNum()을 만들어서 리턴받고 +1 해준 것을 상품 번호로 사용한다.
		ProductDTO product = new ProductDTO(pdao.getLastNum()+1, prodname, prodprice,
				prodamount, prodinfo, Session.get("login_id"));//올린 사람은 현재
		//								로그인 되어 있는 유저이므로 세션에서 아이디를 받아온 후 사용
		
		//포장이 끝났다면 pdao의 메소드에 객체 넘겨주기
		if(pdao.addProduct(product)) {
			System.out.println(prodname+" 상품 추가 완료!");
		}
		else {
			System.out.println("알 수 없는 오류 / 다음에 다시 시도해 주세요.");
		}
	}
}

상품 수정도 마찬가지로 ModifyProductView로 이동시켜서 유저의 상품 목록을 보여주고
수정할 상품 번호를 누르고 무엇을 수정할지와 새로운 내용을 입력하면
ProductDAO의 modifyProduct 메소드를 호출하여 수정을 완료한다.

package view;

import java.util.Scanner;

import dao.ProductDAO;

public class ModifyProductView {
	public ModifyProductView() {
		ProductDAO pdao = new ProductDAO();
		Scanner sc = new Scanner(System.in);
		//내가 올린 상품 목록 출력
		System.out.println(pdao.getList());
		System.out.print("수정할 상품 번호 : ");
		int prodnum = sc.nextInt();
		System.out.println("1. 가격수정\n2. 재고수정\n3. 설명수정");
		int choice = sc.nextInt();
		System.out.print("새로운 정보 : ");
		sc = new Scanner(System.in);
		String newData = sc.nextLine();
		
		//세가지 입력받은 데이터를 DAO에 넘겨주기(행, 열, 새로운 데이터)
		if(pdao.modifyProduct(prodnum,choice,newData)) {
			System.out.println(prodnum+"번 상품이 정상적으로 수정되었습니다.");
		}
		else {
			System.out.println("알 수 없는 오류 / 다음에 다시 시도해 주세요.");
		}
	}
}

상품 삭제는 따로 페이지 이동이 없고 바로 우리가 ProductDAO에 만들어둔 getList 메소드를
호출하여 유저의 상품 목록을 보여주고 상품 번호를 입력받게하여 입력받은 상품번호를 가지고 있는
상품을 삭제시켜준다.

내 상품보기도 마찬가지로 유저의 상품 목록을 보여주기 때문에 페이지 이동없이 우리가 ProductDAO에 만들어둔 getList 메소드를 호출하여 유저의 상품 목록을 보여준다.

상품 검색도 페이지 이동 없이 검색어를 입력 받은 후 입력받은 키워드를 가지고 그 키워드가 포함된 상품명을 찾아 목록을 띄워준다.

내 정보보기를 선택한다면 MyInfoView로 이동시켜 무엇을 수정할 것 인지 와 수정할 내용을 입력 받은 뒤 각각 알맞은 메소드를 호출하여 수정시켜 준다.

package view;
import java.util.Scanner;
import dao.ProductDAO;
import dao.UserDAO;
public class MyInfoView {
	public MyInfoView() {
		Scanner sc = new Scanner(System.in);
		UserDAO udao = new UserDAO();
		ProductDAO pdao = new ProductDAO();
		System.out.println(udao.myInfo());
		System.out.println("1. 비밀번호 수정\n2. 핸드폰 번호 수정\n3. 주소 수정\n4. 수정 취소\n5. 회원탈퇴");
		int choice = sc.nextInt();
		if(choice == 4) {
			System.out.println("메인으로 돌아갑니다.");
		} else if(choice == 5) {
			System.out.print("비밀번호 재입력 : ");
			String userpw = sc.next();
			//비밀번호 검사를 위해 udao의 checkPw() 호출
			if(udao.checkPw(userpw)) {
				//회원탈퇴 진행
				//탈퇴 진행 시 현재 탈퇴를 하려는 회원이 올린 모든 상품들도 삭제 혹은 사용불가 처리를 해주어야 한다.
				//후에 삽입될 데이터와 충돌이 발생할 수 있기 때문이다. 상품을 관리할 pdao를 통해 removeAll()을
				//먼저 진행해준다. *실제 DB 환경에서도 상품 삭제가 먼저 되어야지만 회원을 탈퇴 시킬 수 있다.
				pdao.removeAll();
				//상품까지 깨끗하게 처리되었으므로 실제 회원 데이터 삭제 진행
				if(udao.leaveId()) {
					System.out.println("그동안 이용해 주셔서 감사합니다...☆");
				}
			}
			//비밀번호 검사 실패
			else {
				System.out.println("비밀번호 오류");
			}
		}
		//무언가 회원 정보를 수정하려고 선택했을 때
		else {
			System.out.print("새로운 정보 : ");
			sc = new Scanner(System.in);
			String newData = sc.nextLine();
			boolean check = false;
			switch(choice) {
			case 1:
				check = udao.modifyUser(1,newData);
				break;
			case 2: case 3:
				check = udao.modifyUser(choice+2,newData);
				break;				
			}
			if(check) {
				System.out.println("정보 수정 완료!");
			}
			else {
				System.out.println("정보 수정 실패");
			}
		}
	}
}

ProductDAO

package dao;

import java.util.ArrayList;
import java.util.HashSet;

import dto.ProductDTO;

public class ProductDAO {
	DBConnection conn = null;
	
	public ProductDAO() {
		conn = new DBConnection("database/ProductTable.txt");
	}
	
	public int getLastNum() {
		String lastPK = conn.lastPK();
		if(lastPK == null) {
			return 0;
		}
		else {
			return Integer.parseInt(lastPK);
		}
	}
	
	public boolean addProduct(ProductDTO product) {
		return conn.insert(product.toString());
	}

	public String getList() {
		//상품 테이블의 6번 열 에는 상품의 주인이 누구인지 아이디로 담겨있다.
		//select()를 통해 6번 열에서 세션의 아이디로 검색을 해온다.(세션이 올린 모든 상품이 담겨온다)
		HashSet<String> rs = conn.select(6,Session.get("login_id"));
		String result = "";
		//1. 구찌 지우개 : 10000원(재고 : 3개)
		//2. 루이비똥 연필 : 10000원(재고 : 3개) 
		
		//rs에서 한 줄씩 꺼내며 반복
		for(String line : rs) {
			//꺼내온 line을 split 해주면 데이터들이 담겨있는 배열로 리턴
			String[] datas = line.split("\t");
			//포매팅 한 후 result에 누적연결
			result += String.format("%s. %s : %s원(재고 : %s개)\n", datas[0],datas[1],datas[2],datas[3]);
		}
		//모든 문자열이 연결된 result 리턴
		return result;
	}

	public boolean removeProduct(int prodnum) {
		return conn.delete(prodnum+"");
	}

	public boolean modifyProduct(int prodnum, int choice, String newData) {
		//상품의 어떤 정보를 수정할 것인지가 choice에 담겨있는데, 그 수정되어야 하는 열 번호는
		//choice+1번 열이다. 따라서 update()에 상품번호와 열 번호, 새로운 정보 세가지를 넘겨주며 수정시킨다.
		return conn.update(prodnum+"", choice+1, newData);
	}

	public void removeAll() {
		HashSet<String> rs = conn.select(6,Session.get("login_id"));
		for(String line : rs) {
			conn.delete(line.split("\t")[0]);
		}
	}

	public String search(String keyword) {
		HashSet<String> rs = conn.select();
		ArrayList<String> result = new ArrayList<String>();
		for(String line : rs) {
			String[] datas = line.split("\t");
			if(datas[1].contains(keyword)) {
				result.add(line);
			}
		}
		
		//"지우개"로 검색된 결과
		String resultMsg = "\""+keyword+"\"로 검색된 결과\n";
		if(result.size() == 0) {
			resultMsg += "해당하는 상품이 없습니다\n";
		}
		else {
			for(String line : result) {
				String[] datas = line.split("\t");
				//포매팅 한 후 result에 누적연결
				resultMsg += String.format("%s. %s : %s원(재고 : %s개) - %s\n", datas[0],
						datas[1],datas[2],datas[3],datas[6]);
			}
		}
		return resultMsg;
		
	}
}

ProductDTO

package dto;

public class ProductDTO {
	int prodnum;
	String prodname;
	int prodprice;
	int prodamount;
	String prodinfo;
	int likecnt;
	
	//어떤 유저가 올린 상품인지를 같이 저장해야 하므로 외부의 테이블과 연결이 필요하다.
	String userid;	//FK(Foreign Key)

	public ProductDTO(int prodnum, String prodname, int prodprice, int prodamount, String prodinfo,
			String userid) {
		this.prodnum = prodnum;
		this.prodname = prodname;
		this.prodprice = prodprice;
		this.prodamount = prodamount;
		this.prodinfo = prodinfo;
		this.likecnt = 0;
		this.userid = userid;
	}
	
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof ProductDTO) {
			ProductDTO target = (ProductDTO)obj;
			return target.hashCode() == this.hashCode();
		}
		return false;
	}
	
	@Override
	public int hashCode() {
		return prodnum;
	}
	
	@Override
	public String toString() {
		return prodnum+"\t"+prodname+"\t"+prodprice+"\t"+
	prodamount+"\t"+prodinfo+"\t"+likecnt+"\t"+userid;
	}
}

기능 추가해보기

상품 추가에서 자세히 볼 상품번호를 선택했다면 그 번호에 해당하는 상품 정보를 띄워주는 ProductInfoView 만들기!
//내부메뉴
//1. 좋아요 누르기
//2. 판매자 연락처 보기
//3. 돌아가기

case 5:
				//상품 검색
				System.out.print("검색어를 입력하세요 : ");
				sc = new Scanner(System.in);
				String keyword = sc.nextLine();
				System.out.println(pdao.search(keyword));
				System.out.print("자세히 볼 상품 번호 : ");
				int pro = sc.nextInt();
				new ProductInfoView(pro);				
				//자세히 볼 상품번호를 선택했다면 그 번호에 해당하는 상품 정보를 띄워주는 ProductInfoView 만들기!
				//내부메뉴
				//1. 좋아요 누르기
				//2. 판매자 연락처 보기
				//3. 돌아가기
				break;

ProductInfoView

package view;

import java.util.Scanner;

import dao.ProductDAO;
import dao.UserDAO;

public class ProductInfoView {
	public ProductInfoView(int pro) {
		Scanner sc = new Scanner(System.in);
		ProductDAO pdao = new ProductDAO();
		UserDAO udao = new UserDAO();
		
		System.out.println("1. 좋아요 누르기/n2. 판매자 연락처 보기/n3. 돌아가기");
		int choice = sc.nextInt();
		
		if(choice == 3) {
			System.out.println("메인으로 돌아갑니다.");
		}else {
			
			switch (choice) {
			case 1:
				if(pdao.likecntUp(pro)) {
					System.out.println("좋아요 누르기 성공~!");
					System.out.println("좋아요는 많이많이 눌러주세요");
				}
				else {
					System.out.println("좋아요 누르기 실패");
				}
				break;
			case 2:
				String userid = pdao.getUserId(pro);
				System.out.println(udao.getPone(userid));
				break;
			}
		}
		
	}
}

좋아요 누르기

public boolean likecntUp(int pro) {
		//기존에 있는 좋아요 개수에서 +1을 해주는 것 이기 때문에 기존의 좋아요 수 부터 구해야한다 
		HashSet<String> like = conn.select(0, pro+"");
		
		String result = "";
		
		for(String line : like) {
			String [] datas = line.split("\t");
			result += datas[5];
		}
		int likecnt = Integer.parseInt(result) + 1;
		
		return conn.update(pro+"", 5, likecnt+"");
	}

판매자 연락처 보기는 상품번호로 판매자의 아이디를 찾아 return으로 넘긴다음
UserDAO에서 그 판매자의 아이디를 받아 판매자의 번호를 찾아 return 시켜준다.

public String getUserId(int pro) {
		HashSet<String> str = conn.select(0,pro+"");
		
		String result = "";
		
		for(String line : str) {
			String [] datas = line.split("\t");
			result += datas[6];
		}
		return result;
	}
public String getPone(String userid) {
		HashSet<String> str = conn.select(0, userid);
		String result = "";
		
		for(String line : str) {
			String [] datas = line.split("\t");
			
			result += "판매자 연락처 : "+datas[4];
		}
		return result;
	}
profile
화이팅!

0개의 댓글