JSP/JSP 공부

[jsp] 객체 흐름 (DB, Controller, VO, DAO, DBconnecter)

congs 2023. 5. 8. 16:57

product.pptx
0.04MB
객체 흐름.pptx
0.05MB

== DB에서(mysql, 명령프롬프트) ==

 

1. DB유저 생성

(mysql)
1. 내가 사용할 DB 생성 먼저:  create database javadb; 

2. mysql을 사용한다고 선언: use mysql;

3. 유저 생성: create user '유저명'@'localhost' identified by '비번' ;
                      예) create user 'javauser'@'localhost' identified by 'mysql' ;
  
4. 권한 설정: grant all privileges on javadb.* to 'javauser'@'localhost' with grant option;
                         ( javadb 하위에 있는 모든 테이블을 설정할 수 있는 권한 부여 )

5. 변경사항 적용 후 새로고침(부여된 권한 사용을 위해): flush privileges;

(명령프롬프트)
6. javauser의 mysql로 이동: mysql -ujavauser -pmysql;

7. 데이터 베이스에 javadb가 있는지 확인: show databases;

2. DB생성

- javadb으로 사용설정
use javadb;

- 테이블 생성
create table product(
pno int auto_increment,
pname varchar(50) not null,
price int not null,
regdate datetime default now(),
madeby varchar(50) not null,
primary key(pno));

 


== java에서 ==

 

3. vo class 생성 = 테이블 내용을 그대로 class화

- 테이블에 있는 내용을 그대로 class로 변환!!! ( 자료형 일치중요! ) 

- 생성자를 용도에 맞게 만들어놔야 이후에 편함

 

- vo,dto : 정보를 담아 이동하는 객체!

- vo :  객체 자체의 정보, 내 테이블 하나만 가져가는 경우

- dto: 여러 테이블의 정보를 가져와서 같이 가져가는 경우 (vo보다 더 큰 범위)

public class Product {
//VO (Value Object)
//pno, pname, price, regdate, madeby

private int pno; //db에서 자동증가
private String pname;
private int price;
private String regdate;//db에서 오늘 날짜 저장 (날짜는string형)
private String madeby;

//생성자
public Product() {}

//상품등록
public Product(String pname, int price, String madeby) {
this.pname = pname;
this.price = price;
this.madeby = madeby;
}

//상품리스트 (전체)
public Product(int pno, String pname, String redate) {
this.pno = pno;
this.pname = pname;
this.regdate = redate;
}

//상품상세 (전체)
public Product(int pno, String pname, int price, String redate, String madeby) {
this.pno = pno;
this.pname = pname;
this.price = price;
this.regdate = redate;
this.madeby = madeby;

}

//상품수정 (번호, 이름, 가격, 정보)
public Product(int pno, String pname, int price, String madeby) {
this(pname, price, madeby); //생성자 호출
this.pno = pno;
}

//getter,setter
public int getPno() {
return pno;
}

public void setPno(int pno) {
this.pno = pno;
}

public String getPname() {
return pname;
}

public void setPname(String pname) {
this.pname = pname;
}

public int getPrice() {
return price;
}

public void setPrice(int price) {
this.price = price;
}

public String getRegdate() {
return regdate;
}

public void setRegdate(String regdate) {
this.regdate = regdate;
}

public String getMadeby() {
return madeby;
}

public void setMadeby(String madeby) {
this.madeby = madeby;
}

//확인용 toString
@Override
public String toString() {
return "Product [pno=" + pno + ", pname=" + pname + ", price=" + price + 
", regdate=" + regdate + ", madeby="+ madeby + "]";
}

+ 메인

package JDBC;

public class Main {
      public static void main(String[] args) {
                     new ProductController();
      }
}

4. controller class생성 = manager역할

: mysql과 java class를 연결!

- 전체적인 컨트롤을 연결하는 역할

- controller <-> service (service = 구현체, interface)

 

1.  productController class생성 - class파일 우클릭 - build Path - configure.. 클릭

2.  Libraries - add External JARs.. - 다운로드한 mysql-connector-java열기 - 화면에 추가된것을 확인하고 apply and close!

 

  • 상품 등록, 전체출력, 상세출력, 수정, 삭제
  • db 연동한 후 컨트롤러에서 모든 메뉴를 분기처리
  • 컨트롤러 -> 서비스를 호출, 서비스 -> DAO 호출(DB구문 연결 호출)
    • controller -> service(interface) -> serviceimp1(구현체)

 

package JDBC;

import java.util.Scanner;

public class ProductController {
	//상품 등록, 전체출력, 상세출력, 수정, 삭제
	//db 연동한 후 컨트롤러에서 모든 메뉴를 분기처리
	//컨트롤러 -> 서비스를 호출, 서비스 -> DAO 호출(DB구문 연결 호출)
	//controller -> service(interface) -> serviceimp1(구현체)
	
	private Scanner scan;
	private Service svc; //인터페이스 Service
	private boolean flag; //종료변수 : (flag = false) == 종료
	
	public ProductController() {
		scan = new Scanner(System.in);
		svc = new ProductService(); //service 구현객체 (생성시 Service와 연결)
		flag = true;
		printMenu(); //메뉴 출력 메서드 호출
		
		
	}
	private void printMenu() {
		while(flag) {
			System.out.println("--상품관리시스템--");
			System.out.println("1.등록 | 2.목록 | 3.찾기");
			System.out.println("4.수정 | 5.삭제 | ect.종료");
			System.out.println("메뉴 선택 > ");
			
			int menu = scan.nextInt();
			
			switch(menu) {
			case 1: 
				System.out.println("--등록 register 메뉴--");
				register();
				break;
			case 2: 
				System.out.println("--목록 list 메뉴--");
				
				break;
			case 3: 
				System.out.println("--찾기 detail 메뉴--");
				
				break;
			case 4: 
				System.out.println("--수정 edit 메뉴--");
				
				break;
			case 5: 
				System.out.println("--삭제 remove 메뉴--");
				
				break;
			default:
				System.out.println("종료합니다.");
				flag = false;
				break;
			}
			
			
			
			
		}
	}
	 
	//각종 매뉴들 분기처리 
	
	//DAO의 메서드 명은 DB명 그대로 많이 사용
	// (컨트롤러, dao)
	//C(추가: register, insert, add..)
	//R(조회 :list, select..)
	//u(수정 : edit, update..)
	//D(삭제: remove, delete.. )
	 
	//등록 메뉴
	private void register() {
		
		System.out.println("상품명: ");
		String pname = scan.next();
		
		System.out.println(pname + " 가격: ");
		int price = scan.nextInt();
		
		scan.nextLine(); //위쪽 공백(엔터)를 하단 madeby가 등록하는 것을 막기위한 공백 날림기능
		System.out.println(pname + " 상세설명: ");
		String madeby = scan.nextLine(); //긴내용 - scan.next()필요
		
		//isOk변수 = DB에 등록 요청을 하고, 요청이 올바르게 이루어진 후 리턴 받는 값
		//0이 들어오면 실패, 1이 들어오면 성공 (1줄의 값이 잘 들어갔으면 1이 리턴, 못들어가면 0이 리턴)
		int isOk = svc.register(new Product(pname, price, madeby)); 
		//원래) 메서드를 만들고 메인에서 호출했지만 -> 현재) 메인에서 호출하면 메서드가 생성(메서드명, 매개변수 결정해서 생성)
		System.out.println("상품등록 " + (isOk>0 ? "성공":"실패"));
	
	}
	
	
	
}

6. Service : dao와 controller의 중간 다리

- controller <-> service (service = 구현체, interface)

- service <-> DAO(구현체, interface)

package JDBC;

public interface Service {

	int register(Product product);

}
package JDBC;

public class ProductService implements Service {

	//service -> DAO 요청
	private DAO dao;
	
	public ProductService() {
		dao = new ProductDAO();
	}
	
	@Override
	public int register(Product product) {
		// 실제 DAO에 요청처리되는 로직
		System.out.println("register service 진입");
		return dao.insert(product);
	}

}

7. Dao(Data Access Object) 생성 = 데이터베이스 접근 객체

: DB 테이블 하나당 하나의 DAO를 작성

- CRUD 수행

  • Create 쓰기
  • Read 읽기
  • Update 변경
  • Delete 삭제

- dAO <-> DBConnection : DB와 연동을 함!

   = DB연결 구문 작성필요!

   7-1. DataBaseConnector (DB와 연결)

package JDBC;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DatabaseConnector {
	
	private static DatabaseConnector dbc = new DatabaseConnector();
	private Connection conn = null;
	private String jdbcDriver = "com.mysql.cj.jdbc.Driver"; //항상 동일
	private String jdbcUrl = "jdbc:mysql://localhost:3306/javadb"; //javadb는 3306의 이름
	
	//생성자 private로 생성
	private DatabaseConnector() {
		try {
			Class.forName(jdbcDriver); //드라이버를 로드하기위해 사용되는 메서드
			//connection 하기위한 정보: url, user, password
			conn = DriverManager.getConnection(jdbcUrl, "javauser", "mysql");  
		}catch(ClassNotFoundException e) {
			System.out.println("드라이버를 찾을 수 없습니다");
			e.printStackTrace();
		}catch(SQLException e) {
			System.out.println("연결정보가 올바르지 않습니다");
			e.printStackTrace();
		}
	}
	
	public static DatabaseConnector getInstance() {
		return dbc;
	}
	
	public Connection getConnection() {
		return conn;
	}
	
}