AWS CLOUD FRAMEWORK/Java

[Day21] product

JWJ_Hub 2023. 4. 12. 00:01

Main

package product;

import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

// 전체목록	(고유번호 순으로 출력이 기본값, 정렬되면 다른 순서로 출력)
// 검색		(이름으로 검색, 포함된다면 모두 출력)
// 추가 		(상품등록)
// 수정		(상품수량 및 가격 수정)
// 삭제		(등록된 상품 코드 제거)
// 정렬		(날짜순 정렬, 고유번호 순 정렬, 수량 기준 정렬)
// 종료

public class Main {
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		ProductDAO dao = new ProductDAO();
		ProductDTO tmp = null;
		ArrayList<ProductDTO> list;
		int menu, row, idx;
		String keyword, key, value;
		
		HashMap<String, String> map = new HashMap<String, String>();
		map.put("상품번호", "idx");
		map.put("상품이름", "name");
		map.put("상품가격", "price");
		map.put("유통기한", "expiryDate");
		map.put("상품설명", "memo");
		
		String order = map.get("상품번호");
		boolean desc = false;
		
		
		while(true) {
			System.out.println("1. 전체목록");
			System.out.println("2. 검색");
			System.out.println("3. 추가");
			System.out.println("4. 수정");
			System.out.println("5. 삭제");
			System.out.println("6. 정렬");
			System.out.println("0. 종료");
			System.out.print("선택 >>> ");
			
			menu = Integer.parseInt(sc.nextLine());
			
			switch(menu) {
			case 1:
				list = dao.selectAll(order, desc);
				list.forEach(dto -> System.out.println(dto));
				break;
				
			case 2:
				System.out.print("검색어를 입력 : ");
				keyword = sc.nextLine();
				
				// select * from product where name like '%keyword%'
				list = dao.select(keyword);
				list.forEach(dto -> System.out.println(dto));
				break;
				
			case 3:
				// dao.insert(idx, name, price, expiryDate, memo);
				System.out.println("신규 상품을 생성합니다");
				tmp = useBean(sc);
				row = dao.insert(tmp);
				System.out.println(row != 0 ? "추가 성공" : "추가 실패");
				break;
				
			case 4:	
				System.out.println("기존 상품을 수정합니다");
				tmp = useBean(sc);
				row = dao.update(tmp);
				System.out.println(row != 0 ? "수정 성공" : "수정 실패");
				break;
				
			case 5:	// 상품의 번호를 입력받아서 해당 상품을 삭제하기
				System.out.print("삭제할 상품의 번호 입력 : ");
				idx = Integer.parseInt(sc.nextLine());
				row = dao.delete(idx);
				System.out.println(row != 0 ? "삭제 성공" : "삭제 실패");
				break;
				
			case 6:
				System.out.println(new ArrayList<>(map.keySet()));
				System.out.print("정렬 기준 선택 : ");
				key = sc.nextLine();
				value = map.get(key);
				if(value != null) {
					order = value;
				}
				System.out.print("내림차순? ");
				desc = Boolean.parseBoolean(sc.nextLine());
				break;
				
			case 0:
				sc.close();
				return;
			}
		}	// end of while
	
	}	// end of main
	
	// 추가에서도 활용하고, 수정에서도 활용한다 (코드의 재활용, 함수)
	static ProductDTO useBean(Scanner sc) {
		
		ProductDTO dto = new ProductDTO();
		
		System.out.print("상품 번호 : ");
		dto.setIdx(Integer.parseInt(sc.nextLine()));
		
		System.out.print("상품 이름 : ");
		dto.setName(sc.nextLine());
		
		System.out.print("상품 가격 : ");
		dto.setPrice(Integer.parseInt(sc.nextLine()));
		
		try {
			// <input type="date" value="2023-04-11">
			System.out.print("유통기한 (yyyy-MM-dd) : ");
			
			// java.util.Date <-> java.lang.String
			// String result = sdf.format(date);
			// Date result = sdf.parse(string);
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			
			String inputDate = sc.nextLine();	// 문자열로 입력받는다
			java.util.Date date = sdf.parse(inputDate);	// 문자열에서 서식에 맞는 java.util.Date로 변환
			dto.setExpiryDate(new Date(date.getTime()));// java.util.Date의 long을 추출하여 sql.Date로 변환
			
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		System.out.print("상품 설명 : ");
		dto.setMemo(sc.nextLine());
		
		return dto;
	}
	
	
}	// end of class

ProductDAO

package product;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import oracle.jdbc.driver.OracleDriver;

public class ProductDAO {	// Database Access Object
	
	private Connection conn;
	private PreparedStatement pstmt;	// Statement의 subclass
	private ResultSet rs;
	
	private String url = "jdbc:oracle:thin:@192.168.1.100:1521:xe";
	private String user = "c##itbank";
	private String password = "it";
	
	private String className = OracleDriver.class.getName();
	
	public ProductDAO() {
		try {
			Class.forName(className);
		} catch(ClassNotFoundException e) {
			System.err.println("DAO 생성자 예외 발생 : " + e);
		}
	}
	
	public ArrayList<ProductDTO> selectAll(String order, boolean desc) {
		ArrayList<ProductDTO> list = new ArrayList<ProductDTO>();
		String sql = "select * from product order by " + order;
		if(desc) {
			sql += " desc";
		}
		System.out.println("SQL > " + sql);
		// conn -> pstmt -> rs -> while -> list.add(ob) -> close -> return
		
		try {
			conn = DriverManager.getConnection(url, user, password);
			pstmt = conn.prepareStatement(sql);	// sql을 미리 넣어둔다
			rs = pstmt.executeQuery();	// 미리 넣었으니 여기서는 sql을 지정하지 않는다
			
			while(rs.next()) {
				ProductDTO dto = new ProductDTO();
				dto.setIdx(rs.getInt("idx"));
				dto.setName(rs.getString("name"));
				dto.setPrice(rs.getInt("price"));
				dto.setExpiryDate(rs.getDate("expiryDate"));
				dto.setMemo(rs.getString("memo"));
				list.add(dto);
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try { if(rs != null) 	rs.close(); 	} 	catch(Exception e) {}
			try { if(pstmt != null) pstmt.close(); 	} 	catch(Exception e) {}
			try { if(conn != null) 	conn.close(); 	} 	catch(Exception e) {}
		}
		return list;
	}
	
	
	public ArrayList<ProductDTO> select(String keyword) {
		ArrayList<ProductDTO> list = new ArrayList<ProductDTO>();
//		String sql = "select * from product where name like '%" + keyword + "%'";
		String sql = "select * from product where name like '%%%s%%'";
		sql = String.format(sql, keyword);	// printf에서 %를 출력하고 싶으면 %%를 사용한다
		
		try {
			conn = DriverManager.getConnection(url, user, password);
			pstmt = conn.prepareStatement(sql);	// sql을 미리 넣어둔다
			rs = pstmt.executeQuery();	// 미리 넣었으니 여기서는 sql을 지정하지 않는다
			
			while(rs.next()) {
				ProductDTO dto = new ProductDTO();
				dto.setIdx(rs.getInt("idx"));
				dto.setName(rs.getString("name"));
				dto.setPrice(rs.getInt("price"));
				dto.setExpiryDate(rs.getDate("expiryDate"));
				dto.setMemo(rs.getString("memo"));
				list.add(dto);
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try { if(rs != null) 	rs.close(); 	} 	catch(Exception e) {}
			try { if(pstmt != null) pstmt.close(); 	} 	catch(Exception e) {}
			try { if(conn != null) 	conn.close(); 	} 	catch(Exception e) {}
		}
		return list;
	}

	public int insert(ProductDTO dto) {
		int row = 0;
		String sql = "insert into product values (?, ?, ?, ?, ?)";
		try {
			conn = DriverManager.getConnection(url, user, password);
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, dto.getIdx());		// 1번째 물음표에 idx를 설정한다. 숫자이므로 따옴표가 없다
			pstmt.setString(2, dto.getName());	// 2번째 물음표에 name을 설정한다. 문자열이므로 따옴표를 작성해준다
			pstmt.setInt(3, dto.getPrice());
			pstmt.setDate(4, dto.getExpiryDate());
			pstmt.setString(5, dto.getMemo());
			row = pstmt.executeUpdate();	// executeQuery()는 ResultSet을 반환한다 (select)
											// executeUpdate()는 int를 반환한다 (insert, update, delete)
		} catch (SQLException e) {
			e.printStackTrace();
			
		} finally {
			try { if(rs != null) 	rs.close(); 	} 	catch(Exception e) {}
			try { if(pstmt != null) pstmt.close(); 	} 	catch(Exception e) {}
			try { if(conn != null) 	conn.close(); 	} 	catch(Exception e) {}
		}
		return row;
	}

	public int update(ProductDTO tmp) {
		int row = 0;
		String sql = "update product set name=?, price=?, expiryDate=?, memo=? where idx=?";
		try {
			conn = DriverManager.getConnection(url, user, password);
			pstmt = conn.prepareStatement(sql);
			
			// pstmt.set???(1, tmp.get???);
			pstmt.setString(1, tmp.getName());
			pstmt.setInt(2, tmp.getPrice());
			pstmt.setDate(3, tmp.getExpiryDate());
			pstmt.setString(4, tmp.getMemo());
			pstmt.setInt(5, tmp.getIdx());
			
			row = pstmt.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try { if(rs != null) 	rs.close(); 	} 	catch(Exception e) {}
			try { if(pstmt != null) pstmt.close(); 	} 	catch(Exception e) {}
			try { if(conn != null) 	conn.close(); 	} 	catch(Exception e) {}
		}
		return row;
	}

	public int delete(int idx) {
		int row = 0;
		String sql = "delete product where idx=?";
		try {
			conn = DriverManager.getConnection(url, user, password);
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, idx);
			
//			conn.setAutoCommit(false);	// 해당 연결의 자동 커밋을 수행하지 않게 한다
										// jdbc의 오토 커밋 기본값은 true이다
			
			row = pstmt.executeUpdate();
//			conn.commit();				// conn에서 커밋을 수행하거나 롤백을 수행할 수도 있다
//			conn.rollback();
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try { if(rs != null) 	rs.close(); 	} 	catch(Exception e) {}
			try { if(pstmt != null) pstmt.close(); 	} 	catch(Exception e) {}
			try { if(conn != null) 	conn.close(); 	} 	catch(Exception e) {}
		}
		return row;
	}

}

ProductDTO

package product;

import java.sql.Date;
/*
  		create table product (
  			idx 		number,
  			name		varchar2(100),
  			price		number,
  			expiryDate	date,
  			memo		varchar2(2000)
  		);
 */
public class ProductDTO {
	
	// java.util.Date : 자바에서 사용하는 기본 날짜 타입 (super)
	// java.sql.Date : 오라클 및 다른 DB에서 불러오는 날짜 타입 (sub)
	// java.sql.Date extends java.util.Date
	
	private int idx;
    private String name;
    private int price;
    private Date expiryDate;
    private String memo;
    
    @Override
    public String toString() {
    	return String.format("%s) %s, %,d, %s, %s", 
    			idx, name, price, expiryDate, memo); 
    }
    
	public int getIdx() {
		return idx;
	}
	public void setIdx(int idx) {
		this.idx = idx;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	public Date getExpiryDate() {
		return expiryDate;
	}
	public void setExpiryDate(Date expiryDate) {
		this.expiryDate = expiryDate;
	}
	public String getMemo() {
		return memo;
	}
	public void setMemo(String memo) {
		this.memo = memo;
	}
	
}