웹_프론트_백엔드/단과

[단과_JAVA_심화반] 2020.09.29

shine94 2020. 10. 1. 06:01

1. MVC 모델 2

   Model : 데이터에 대응
   View : 보여지는 화면
   Controller : 흐름 제어

 


2. MVC 모델 1
 : View, Controller가 함께 있는 것

 


3. DAO(Data Access Object) - dao
 : 데이터에 접근하기 위한 객체,
   데이터를 관리하는 여러 메소드들이 정의되어 있다.

 


4. DTO(Data Transfer Object) / VO(Value Object) - dto
 : 양쪽으로 전송되어 오고가는 데이터 객체,
   데이터 포장 객체

 

 

5. MVC 모델 1을 이용한 쇼핑몰 만들기

** com.lec.java.dto > UserDTO.java

package com.lec.java.dto;

public class UserDTO {
	private static int seq;
	
	private int num;
	private String userid;
	private String userpw;
	private String name;
	private String gender;
	
	public UserDTO() {;}
	
	// 회원가입시 사용할 생성자
	public UserDTO(String userid, String userpw, String name, String gender) {
		this.num = ++seq;
		this.userid = userid;
		this.userpw = userpw;
		this.name = name;
		this.gender = gender;
	}

	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}

	public String getUserid() {
		return userid;
	}
	public void setUserid(String userid) {
		this.userid = userid;
	}

	public String getUserpw() {
		return userpw;
	}
	public void setUserpw(String userpw) {
		this.userpw = userpw;
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	
	// hashCode(), equals()를 재정의해줘야
	// 주소 비교가 아니라 num(회원번호)으로 비교를 한다.
	@Override
	public int hashCode() {
		return this.num;
	}
	@Override
	public boolean equals(Object obj) {
		UserDTO user = null;
		if(obj instanceof UserDTO) {
			user = (UserDTO)obj;
			if(this.num == user.num) {
				return true;
			}
		}
		return false;
	}
}


** com.lec.java.dto > ProductDTO.java

package com.lec.java.dto;

public class ProductDTO {
	private static int seq;
	
	private int num;
	private String name;
	private int count;
	private String userid;
	private int price;
	
	public ProductDTO() {;}
	
	public ProductDTO(String name, int count, String userid, int price) {
		this.num = ++seq;
		this.name = name;
		this.count = count;
		this.userid = userid;
		this.price = price;
	}

	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 getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count = count;
	}

	public String getUserid() {
		return userid;
	}
	public void setUserid(String userid) {
		this.userid = userid;
	}

	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	
	// hashCode(), equals()를 재정의해줘야
	// 주소 비교가 아니라 num(상품번호)으로 비교를 한다.
	@Override
	public int hashCode() {
		return num;
	}
	@Override
	public boolean equals(Object obj) {
		ProductDTO prd = null;
		if(obj instanceof ProductDTO) {
			prd = (ProductDTO)obj;
			if(this.num == prd.num) {
				return true;
			}
		}
		return false;
	}
	
	// toString()을 재정의해줘야
	// 주소가 아니라 상품 정보가 출력이 된다.
	@Override
	public String toString() {
		return "올린사람 : " + userid + "\n상품번호 : " + num + "\t상품 이름 : "
				+ name + "\n상품 가격 : " + price + "\t상품 개수 : " + count + "\n=============";
	}
}

 

** com.lec.java.dao > Connection.java

package com.lec.java.dao;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map.Entry;

import com.lec.java.dto.ProductDTO;
import com.lec.java.dto.UserDTO;

// 원래는 DB를 사용해야하는데 이 수업에서는 배우기 전이기 때문에 
// HashMap을 이용하여 데이터 베이스처럼 사용했다.
public class Connection {
	// UserDAO, ProductDAO에서 new를 통해 conn 객체를 만들기 때문에
	// static으로 선언하지 않으면 두 객체가 서로 다른 DB를 사용하게 된다.
	static HashMap<UserDTO, ArrayList<ProductDTO>> DB = new HashMap<>();
	
	// 상품추가
	void insert(UserDTO user,ProductDTO product) {
		ArrayList<ProductDTO> arProduct = DB.get(user);
		arProduct.add(product);
	}
	
	// 회원추가
	boolean insert(UserDTO user) {
		ArrayList<ProductDTO> arProduct = new ArrayList<>();
		DB.put(user, arProduct);
		return true;
	}
	
	// 상품삭제
	void delete(UserDTO user,ProductDTO product) {
		ArrayList<ProductDTO> arProduct = DB.get(user);
		arProduct.remove(product);
	}
	
	// 상품수정
	void update(ProductDTO product,int price) {
		product.setPrice(price);
	}
	
	// 선택한 회원의 모든 상품 불러오기
	ArrayList<ProductDTO> selectAll(UserDTO user) {
		ArrayList<ProductDTO> arProduct = DB.get(user);
		return arProduct;
	}
	
	// 로그인을 위한 회원 검색
	UserDTO select(String userid, String userpw) {
		// DB에 있는 key(User)들을 iterator 타입으로 불러오고
		Iterator<UserDTO> iter = DB.keySet().iterator();
		// iter 다음 것이 있으면
		while(iter.hasNext()) {
			// 그때의 user 임시저장
			UserDTO user = iter.next();
			// 그 user의 아이디가 넘겨준 아이디와 같다면
			if(user.getUserid().equals(userid)) {
				// 비밀번호 비교
				if(user.getUserpw().equals(userpw)) {
					// 로그인 성공시 오는 곳
					return user;
				}
			}
		}
		// 그 외에는 null 리턴
		return null;
	}
	
	// 검색할 키워드에 관한 상품들 불러오기
	HashSet<ProductDTO> select(String keyword) {
		// 중복을 제거하기 위해 HashSet을 사용
		HashSet<ProductDTO> resultSet = new HashSet<>();
		Iterator<Entry<UserDTO, ArrayList<ProductDTO>>> iter = DB.entrySet().iterator();
		
		while(iter.hasNext()) {
			// entry에는 유저와 그 유저의 상품 목록이 담겨 있다(key : 유저, value : 상품 목록)
			Entry<UserDTO, ArrayList<ProductDTO>> entry = iter.next();
			
			if(entry.getKey().getUserid().equals(keyword)) {
				for(ProductDTO product : entry.getValue()) {
					resultSet.add(product);
				}
			} else {
				for(ProductDTO product : entry.getValue()) {
					if(product.getName().contains(keyword)) {
						resultSet.add(product);
					}
				}
			}
		}
		return resultSet;
	}
}

 

** com.lec.java.dao > UserDAO.java

package com.lec.java.dao;

import com.lec.java.dto.UserDTO;

// DAO(Data Access Object) - dao
// 데이터에 접근하기 위한 객체
// 데이터를 관리하는 여러 메소드들이 정의되어 있다.

// User에 관련된 메소드만 모아놓는 곳
public class UserDAO {
	UserDTO session = null;
	Connection conn = null;
	
	public UserDAO() {
		conn = new Connection();
	}
	
	// 회원가입
	boolean join(String userid, String userpw, String name, String gender) {
		boolean check = false;
		// 받아온 데이터들을 가지고 DTO 객체 생성(포장으로 생각하면 편함)
		UserDTO user = new UserDTO(userid, userpw, name, gender);
		// DB 가입된 그 DTO 데이터 추가하기
		check = conn.insert(user);
		// 추가 성공시 true 리턴
		return check;
	}
	
	// 로그인
	boolean login(String userid, String userpw) {
		UserDTO user = null;
		// 어떠한 UserDTO 객체가 반환이 되었다면,
		// 로그인 성공을 의미하고
		// null로 그대로 남아있다면 로그인 실패를 의미한다.
		user = conn.select(userid, userpw);
		
		if(user != null) {
			// 다른곳(회원정보 수정, 상품추가 등등)에서 
			// 쓰일 session 아이디를 로그인 성공한 그 유저로 설정해둔다.
			session = user;
			return true;
		}
		return false;
	}
	
	// 비밀번호 수정
	void modify(String newPw) {
		if(session != null) {
			session.setUserpw(newPw);
		}
	}
	
	// 로그아웃
	void logout() {
		session = null;
	}
}


** com.lec.java.dao > ProductDAO.java

package com.lec.java.dao;

import java.util.ArrayList;
import java.util.Set;

import com.lec.java.dto.ProductDTO;
import com.lec.java.dto.UserDTO;

// DAO(Data Access Object) - dao
// 데이터에 접근하기 위한 객체
// 데이터를 관리하는 여러 메소드들이 정의되어 있다.

// Product에 관련한 메소드만 모아놓은 곳
public class ProductDAO {
	Connection conn = null;
	UserDTO session =null;
	
	// 넘겨준 세션아이디를 받아서 pdao의 세션에도 설정해준다.
	public ProductDAO(UserDTO user) {
		conn = new Connection();
		session = user;
	}
	
	// 상품추가
	boolean add(String name, int count, String userid, int price) {
		ProductDTO product = new ProductDTO(name, count, userid, price);
		conn.insert(session, product);
		return true;
	}
	
	// 상품삭제
	boolean remove(int pNum) {
		boolean flag = false;
		ArrayList<ProductDTO> myProduct = conn.selectAll(session);
		for(ProductDTO product : myProduct) {
			if(product.getNum() == pNum) {
				flag=true;
				conn.delete(session, product);
				break;
			}
		}
		return flag;
	}
	
	// 상품수정
	boolean modify(int pNum,int price) {
		boolean flag = false;
		ArrayList<ProductDTO> myProduct = conn.selectAll(session);
		for(ProductDTO product : myProduct) {
			if(product.getNum() == pNum) {
				flag = true;
				conn.update(product, price);
				break;
			}
		}
		return flag;
	}
	
	// 상품검색
	Set<ProductDTO> search(String keyword){
		return conn.select(keyword);
	}
	
	// 내 목록 가져오기
	ArrayList<ProductDTO> getList() {
		ArrayList<ProductDTO> myProduct = conn.selectAll(session);
		return myProduct;
	}
}

 

** com.lec.java.dao > Controller.java

package com.lec.java.dao;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;

import com.lec.java.dto.ProductDTO;

// MVC모델1이기 때문에 View단이 Controller와 함께 존재한다.
public class Controller {
	public Controller() {
		// 아래의 보이는 화면 View단 코드이다.
		Scanner sc = new Scanner(System.in);
		int choice = 0;
		System.out.println("UMS 프로그램입니다.");
		
		// User에 관한 흐름을 제거하기 위한 DAO
		UserDAO udao = new UserDAO();
		// Product에 관한 흐름을 제어하기 위한 DAO
		// 로그인 성공시에만 생성되기 때문에 초기값을 null로 설정해 놓는다.
		ProductDAO pdao = null;
		
		while(true) {
			System.out.println("1.회원가입\n2.로그인\n3.나가기");
			choice = sc.nextInt();
			
			if(choice == 3) {break;}
			
			else if(choice == 1) {
				// 회원가입
				System.out.println("회원가입 창입니다.");
				System.out.print("아이디 : ");
				String userid = sc.next();
				System.out.print("비밀번호 : ");
				String userpw = sc.next();
				System.out.print("이름 : ");
				String name = sc.next();
				System.out.print("성별 : ");
				String gender = sc.next();
				
				// DAO에 있는 join 메소드 사용
				if(udao.join(userid, userpw, name, gender)) {
					// return값이 true이면 수행
					System.out.println(userid + "님 회원가입 성공!");
				}
			} else if(choice == 2) {
				// 로그인
				System.out.println("로그인 창입니다.");
				System.out.print("아이디 : ");
				String userid = sc.next();
				System.out.print("비밀번호 : ");
				String userpw = sc.next();
				
				// DAO에 있는 login 메소드 사용
				if(udao.login(userid, userpw)) {
					System.out.println(userid + "님 로그인 성공!");
					while(true) {
						pdao = new ProductDAO(udao.session);
						ArrayList<ProductDTO> myList = pdao.getList();
						int pNum = 0;

						System.out.println("1.상품 추가\n2.상품 검색\n3.상품 수정\n4.상품삭제\n"
								+ "5.내 상품 보기\n6.내 정보 수정\n7.로그아웃");
						choice = sc.nextInt();
						
						if(choice == 7) {
							// 로그아웃
							udao.logout();
							break;
						}
						
						switch(choice) {
						case 1:
							// 상품추가
							System.out.println("상품 추가 창입니다.");
							System.out.print("상품명 : ");
							String name = sc.next();
							System.out.print("상품개수 : ");
							int count = sc.nextInt();
							System.out.print("상품가격 : ");		
							int price = sc.nextInt();
							
							if(pdao.add(name, count, userid, price)) {
								System.out.println("상품 추가 성공!");
							}
							break;
						case 2:
							// 상품검색
							String keyword = "";
							System.out.print("검색하실 키워드를 입력하세요 : ");
							keyword = sc.next();
							
							Set<ProductDTO> rs = pdao.search(keyword);
							Iterator<ProductDTO> iter = rs.iterator();
							while(iter.hasNext()) {
								System.out.println(iter.next());
							}
							break;
						case 3:
							// 상품수정(가격만 가능)
							for(ProductDTO product : myList) {
								System.out.println(product);
							}
							
							System.out.println("수정할 상품 번호를 입력하세요 : ");
							pNum = sc.nextInt();
							System.out.println("새로운 가격을 입력하세요 : ");
							price = sc.nextInt();
							
							pdao.modify(pNum, price);
							break;
						case 4:
							//상품삭제
							for(ProductDTO product : myList) {
								System.out.println(product);
							}
							
							System.out.println("삭제할 상품 번호를 입력하세요 : ");
							pNum = sc.nextInt();
							
							if(pdao.remove(pNum)) {
								System.out.println(pNum + "번 상품이 삭제되었습니다.");
							}
							break;
						case 5:
							// 내 상품 보기
							for(ProductDTO product : myList) {
								System.out.println(product);
							}
							break;
						case 6:
							// 내 정보 수정
							System.out.print("비밀번호 확인 : ");
							String pw = sc.next();
							if(udao.session.getUserpw().equals(pw)) {
								System.out.print("새로운 비밀번호를 입력하세요 : ");
								String newPw = sc.next();
								udao.modify(newPw);
							}else {
								System.out.println("비밀번호 확인 실패");
							} 
							break;
						}
					}
				} else {
					System.out.println("아이디나 비밀번호를 다시 확인해주세요.");
				}
			} else {
				System.out.println("잘못 입력했습니다.");
			}
		}
	} // end Controller()
} // end class


** com.lec.java.ums > Index.java

package com.lec.java.ums;

import com.lec.java.dao.Controller;

public class Index {
	public static void main(String[] args) {
		// 컨트롤러 생성 -> 프로그램의 시작
		new Controller();
	}
}