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();
}
}
'웹_프론트_백엔드 > 단과' 카테고리의 다른 글
[단과_JAVA_심화반] 2020.10.08 (0) | 2020.10.12 |
---|---|
[단과_JAVA_심화반] 2020.10.06 (0) | 2020.10.07 |
[단과_JAVA_심화반] 2020.09.24 (0) | 2020.09.26 |
[단과_JAVA_심화반] 2020.09.22 (0) | 2020.09.25 |
[단과_JAVA_심화반] 2020.09.18 (0) | 2020.09.21 |