쌍용교육센터 - 26일

개발자가 되고 싶어요 ㅣ 2024. 3. 25. 19:20

2024.03.25

Table

-- 상품 정보 --
CREATE TABLE SITEM (
	item_num NUMBER PRIMARY KEY,			-- 상품번호
	item_name VARCHAR2(30) NOT NULL,		-- 상품명
	item_price NUMBER(9) NOT NULL,			-- 상품가격
	item_date DATE DEFAULT SYSDATE NOT NULL -- 상품등록일
);
CREATE SEQUENCE SITEM_SEQ;

-- 회원 정보 --
CREATE TABLE CUSTOMER (
	cust_id VARCHAR2(30) PRIMARY KEY,		-- 회원id
	cust_name VARCHAR2(30) NOT NULL,		-- 회원명
	cust_address VARCHAR2(90) NOT NULL,		-- 회원주소
	cust_tel VARCHAR2(20) NOT NULL,			-- 회원전화번호
	cust_date DATE DEFAULT SYSDATE NOT NULL -- 회원가입일
);

-- 주문 정보 --
CREATE TABLE SORDER(
	order_num NUMBER PRIMARY KEY,					   -- 주문번호
	cust_id VARCHAR2(30) REFERENCES customer(cust_id), -- 회원 id
	item_num NUMBER REFERENCES sitem(item_num),		   -- 상품 번호
	order_date DATE DEFAULT SYSDATE NOT NULL		   -- 주문일
);
CREATE SEQUENCE sorder_seq;

메서드

package kr.s39.jdbc.shop;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import kr.util.DBUtil;
import oracle.jdbc.proxy.annotation.Pre;

public class ShopDAO {
	//관리자 상품 등록
	public void insertItem(String item_name, int item_price) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		String sql = null;
		try {
		 	conn = DBUtil.getConnection();
		 	sql = "INSERT INTO SITEM (ITEM_NUM,ITEM_NAME,ITEM_PRICE) VALUES (SITEM_SEQ.NEXTVAL,?,?)";
		 	pstmt = conn.prepareStatement(sql);
		 	pstmt.setString(1, item_name);
		 	pstmt.setInt(2, item_price);
		 	int count = pstmt.executeUpdate();
		 	System.out.println(count+"개의 상품을 등록했습니다.");
		}catch (Exception e) {
			e.printStackTrace();
		} finally {
			//자원 정리
			DBUtil.executeClose(null, pstmt, conn);
		}
	}
	//관리자,사용자 상품 목록
	public void selecteItems() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = null;
		try {
			conn = DBUtil.getConnection();
			sql = "SELECT * FROM SITEM ORDER BY ITEM_NUM DESC";
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery();
			
			if(rs.next()) {
				System.out.println("상품번호\\t상품명\\t상품가격\\t상품등록일");
				do {
					System.out.print(rs.getInt("item_num")+"\\t");
					System.out.print(rs.getString("item_name")+"\\t");
					System.out.printf("%,d\\t",rs.getInt("item_price"));
					System.out.print(rs.getDate("item_date")+"\\n");
				} while(rs.next());
			} else {
				System.out.println("표시할 상품이 없습니다.");
			}
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			//자원 정리
			DBUtil.executeClose(rs, pstmt, conn);
		}
	}
	//관리자 회원 목록
	public void selectCustomers() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		String sql = null;
		ResultSet rs = null;
		try {
			conn = DBUtil.getConnection();
			sql = "SELECT * FROM CUSTOMER ORDER BY CUST_DATE DESC";
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery();
			
			System.out.println("-------------");
			if(rs.next()) {
				System.out.println("아이디\\t이름\\t전화번호\\t주소\\t가입일");
				do {
					System.out.print(rs.getString("cust_id")+"\\t");
					System.out.print(rs.getString("cust_name")+"\\t");
					System.out.print(rs.getString("cust_tel")+"\\t");
					System.out.print(rs.getString("cust_address")+"\\t");
					System.out.print(rs.getDate("cust_date")+"\\n");
				} while(rs.next());
			} else {
				System.out.println("회원이 없습니다.");
			}
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			DBUtil.executeClose(rs, pstmt, conn);
		}
	}
	//관리자 구매 목록
	public void selectOrders() {
		Connection conn = null;
		PreparedStatement pstmt =null;
		ResultSet rs = null;
		String sql = null;
		try {
			conn = DBUtil.getConnection();
			sql = "SELECT * FROM SORDER JOIN SITEM USING(ITEM_NUM) ORDER BY ORDER_NUM DESC";
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery();
			if(rs.next()) {
				System.out.println("번호\\t주문자ID\\t상품명\\t상품 가격\\t주문일");
				do {
					System.out.print(rs.getInt("order_num")+"\\t");
					System.out.print(rs.getString("cust_id")+"\\t");
					System.out.print(rs.getString("item_name")+"\\t");
					System.out.print(rs.getInt("item_price")+"\\t");
					System.out.print(rs.getDate("order_date")+"\\n");
				} while(rs.next());
			} else {
				System.out.println("구매목록이 없습니다.");
			}
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			DBUtil.executeClose(rs, pstmt, conn);
		}
	}
	//사용자 회원 등록
	public void insertCustomer(String cust_id, String cust_name, String cust_address, String cust_tel) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		String sql = null;
		try {
		 	conn = DBUtil.getConnection();
		 	sql = "INSERT INTO CUSTOMER (CUST_ID,CUST_NAME,CUST_ADDRESS,CUST_TEL) VALUES (?,?,?,?)";
		 	pstmt = conn.prepareStatement(sql);
		 	pstmt.setString(1, cust_id);
		 	pstmt.setString(2, cust_name);
		 	pstmt.setString(3, cust_address);
		 	pstmt.setString(4, cust_tel);
		 	
		 	pstmt.executeUpdate();
		 	System.out.println("회원 가입이 완료되었습니다.");
		}catch (Exception e) {
			e.printStackTrace();
		} finally {
			//자원 정리
			DBUtil.executeClose(null, pstmt, conn);
		}
	}
	//사용자 회원 상세
	public void selectDetailCustomer(String cust_id) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = null;
		try {
			conn = DBUtil.getConnection();
			sql = "SELECT * FROM CUSTOMER WHERE CUST_ID = ?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, cust_id);
			rs = pstmt.executeQuery();
			System.out.println("-----------------------");
			if(rs.next()) {
				System.out.println("아이디:"+rs.getString("cust_id"));
				System.out.println("이름:"+rs.getString("cust_name"));
				System.out.println("주소:"+rs.getString("cust_address"));
				System.out.println("전화번호:"+rs.getString("cust_tel"));
				System.out.println("등록일:"+rs.getDate("cust_date"));
			} else {
				System.out.println("검색된 회원 정보가 없습니다.");
			}
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			DBUtil.executeClose(rs, pstmt, conn);
		}
	}
	//사용자 상품 구매
	public void insertOrder(String cust_id, int item_num) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		String sql = null;
		try {
			conn = DBUtil.getConnection();
			sql = "INSERT INTO SORDER(ORDER_NUM,CUST_ID,ITEM_NUM) VALUES (sorder_seq.nextval,?,?)";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, cust_id);
			pstmt.setInt(2, item_num);
			
			int count = pstmt.executeUpdate();
			System.out.println(count+"개 상품 구매가 완료되었습니다.");
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			DBUtil.executeClose(null, pstmt, conn);
		}
	}
	//사용자 구매 내역
	public void selectOrdersBYId(String cust_id) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = null;
		try {
			conn = DBUtil.getConnection();
			sql = "SELECT * FROM SORDER JOIN SITEM USING(ITEM_NUM) JOIN CUSTOMER USING(CUST_ID) WHERE CUST_ID=? ORDER BY ORDER_NUM DESC";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, cust_id);
			rs = pstmt.executeQuery();
			System.out.println("--------------------");
			System.out.println(cust_id + "님의 구매내역 입니다.");
			if(rs.next()) {
				System.out.println("번호\\t주문자ID\\t이름\\t상품명\\t상품 가격\\t주문일");
				do {
					System.out.print(rs.getInt("order_num")+"\\t");
					System.out.print(rs.getString("cust_id")+"\\t");
					System.out.print(rs.getString("cust_name")+"\\t");
					System.out.print(rs.getString("item_name")+"\\t");
					System.out.print(rs.getInt("item_price")+"\\t");
					System.out.print(rs.getDate("order_date")+"\\n");
				} while(rs.next());
			} else {
				System.out.println("등록된 주문 정보가 없습니다.");
			}
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			DBUtil.executeClose(rs, pstmt, conn);
		}
	}
}

Admin 페이지

package kr.s39.jdbc.shop;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ShopAdminMain {
	//상품 등록
	//상품 목록
	//회원목록
	//구매 목록
	private BufferedReader br;
	private ShopDAO dao;
	public ShopAdminMain() {
		try {
			br = new BufferedReader(new InputStreamReader(System.in));
			dao = new ShopDAO();
			//메뉴 호출
			callMenu();
		} catch(Exception e) {
			
		} finally {
			//자원 저일
			if(br!=null) {try{br.close();}catch(Exception e) {}}
		}
	}
	
	//메뉴
	public void callMenu() throws IOException {
		while(true) {
			System.out.print("1.상품 등록,2.상품 목록 보기,3.회원 목록 보기,4.구매 목록 보기,5.종료>  ");
			
			try {
				int no = Integer.parseInt(br.readLine());
				
				if(no == 1) {//상품 목록
					System.out.print("상품명:");
					String item_name = br.readLine();
					System.out.print("가격:");
					int item_price = Integer.parseInt(br.readLine());
					
					dao.insertItem(item_name, item_price);
				} else if(no == 2) {//상품 목록 보기
					dao.selecteItems();
				} else if(no == 3) {//회원 목록 보기
					dao.selectCustomers();
				} else if(no == 4) {//구매 목록 보기
					dao.selectOrders();
				} else if(no == 5) {// 종료
					System.out.println("프로그램을 종료합니다.");
					break;
				} else {
					System.out.println("잘못 입력하셨습니다.");
				}
			} catch(NumberFormatException e) {
				System.out.println("숫자만 입력 가능");	
			}
		}
	}
	
	public static void main(String[] argrs) {
		new ShopAdminMain();
	}
}

User페이지

package kr.s39.jdbc.shop;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ShopUserMain {
	//상품 목록
	//회원 등록
	//회원 상세
	//상품 구매
	//구매 내역
	
	private BufferedReader br;
	private ShopDAO dao;
	//생성자
	public ShopUserMain() {
		try {
			br = new BufferedReader(new InputStreamReader(System.in));
			dao = new ShopDAO();
			//메뉴 호출
			callMenu();
			
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			//자원정리
			if(br!=null) {
				try {
					br.close();
				} catch(IOException e) {
					
				};
			}
		}
	}
	
	public void callMenu() throws IOException{
		while(true) {
			System.out.print("1.회원 가입,2.회원 정보,3.상품 구매,4.구매 내역,5.종료> ");
			try {
				int no = Integer.parseInt(br.readLine());
				if(no == 1) {//회원 가입
				 	System.out.print("아이디:");
				 	String cust_id = br.readLine();
				 	System.out.print("이름:");
				 	String cust_name = br.readLine();
				 	System.out.print("주소:");
				 	String cust_address = br.readLine();
				 	System.out.print("전화번호:");
				 	String cust_tel = br.readLine();
				 	
				 	dao.insertCustomer(cust_id, cust_name, cust_address, cust_tel);
				} else if(no == 2) {//회원 정보
					dao.selectCustomers();
					System.out.println("회원 아이디:");
					String cust_id = br.readLine();
					dao.selectDetailCustomer(cust_id);
				} else if(no == 3) {//상품 구매
					dao.selecteItems();
					System.out.println("---------------");
					System.out.print("구매할 상품의 번호:");
					int item_num = Integer.parseInt(br.readLine());
					System.out.print("아이디:");
					String cust_id = br.readLine();
					// 아이디가 등록되어 있는지 먼저 확인해야 시퀀스가 안망가짐
					
					dao.insertOrder(cust_id,item_num);
				} else if(no == 4) {//구매 내역
					System.out.print("아이디:");
					String cust_id = br.readLine();
					
					dao.selectOrdersBYId(cust_id);
				} else if(no == 5) {//종료
					System.out.println("프로그램을 종료합니다.");
					break;
				} else {
					System.out.println("잘못 입력했습니다.");
				}
			} catch(NumberFormatException e) {
				System.out.println("숫자만 입력하세요");
			}
		}
	}
	public static void main(String[] argrs) {
		new ShopUserMain();
	}
}

오늘의 Q&A

Q.

DAO에 자원들을 static으로 안 만드는 이유가 뭔가요?

A.

Connection Pool에 대해 공부해 볼 것

요약하자면 connection은 요청시에 객체를 생성하여 요청 종료시에 반납하는 것이 옳다.

Q.

자원들을 선언한게 분명한데 아래와 같이 null체크를 해주는 이유가 뭔가요?

혹시 로직 수행 중에 가비지 컬렉터에 의해 자원이 정리되는 그런 경우도 있나요?

if(br!=null) {try {br.close();} catch(IOException e) {};

A. 코드가 길거나 복잡한 경우 다른 로직 수행 중에 객체가 죽어버리게 되거나 변동이 생길 경우 에러가 나기 때문에 기본적으로 그런 부분들을 방지하기 위해 null체크를 해주는 것이 좋다.

Q.

자원들을 선언할 때 아래와 같이 바로 선언하지 않고 null로 먼저 선언해주는 이유가 뭔가요?

Connection conn = DBUtil.getConnection(); 

Connection conn = null;
try{
	conn = DBUtil.getConnection();
} catch(Exception e) {
}

A. try문에서 바로 선언해주면 지역변수 처리되어 finally 문에서 메서드의 매개변수로 사용할 수 없기 때문이다. 즉, 자원정리 메서드를 활용하기 위해 먼저 선언해준다.

'IT 국비 교육' 카테고리의 다른 글

쌍용교육센터 - 28일  (1) 2024.03.27
쌍용교육센터 - 27일  (1) 2024.03.26
쌍용교육센터 - 23~25일  (0) 2024.03.22
쌍용교육센터 - 22일  (0) 2024.03.19
쌍용교육센터 - 21일  (3) 2024.03.18