티스토리 뷰

JDBC 3번째 시간이다. 이번에도 동일하게 문제를 하나 가져왔다.


◎Problem

JDBC 활용_2 에서 풀었던 문제와 거의 동일한 형태의 문제를 가지고 왔다. 이미지 파일들을 활용한다는 점을 제외하곤 완전 동일한 문제라고 봐도 될 거 같다. 

마찬가지로 엑셀 파일의 정보를 읽어와서 객체화한 뒤, DB에 저장하여 활용하여 구현해야한다. 


◎best_sandwiches_list_chicago_price_address.xls

따로 자세한 데이터 흐름 설명은 필요하지 않을 거 같다. 바로 코드로 갑시다.


○MealInfo.java : 엑셀 파일에 있는 데이터를 String값으로 받아 각각 형변환을 실행하고 저장하여 가지고 있는 객체

package com.choonham.data;

public class MealInfo {

	private int rank;
	private String cafe;
	private String menu;
	private float price;
	private String address;
	private String imgName;

	public MealInfo() {
		// TODO Auto-generated constructor stub
	}

	public MealInfo(String rank, String cafe, String menu, String price, String address, String imgName) {
		this.rank = Integer.parseInt(rank);
		this.cafe = cafe;
		this.menu = menu;
		this.price = Float.parseFloat(price);
		this.address = address;
		this.imgName = imgName;
	}

	public int getRank() {
		return rank;
	}

	public String getCafe() {
		return cafe;
	}

	public String getMenu() {
		return menu;
	}

	public float getPrice() {
		return price;
	}

	public String getAddress() {
		return address;
	}

	public String getImgName() {
		return imgName;
	}

}

○DataClass.java : 객체화 여부를 체크하고, MealInfo 객체의 ArrayList를 가지고 있는 데이터 모음집 객체

package com.choonham.data;

import java.util.ArrayList;
import java.util.List;

public class DataClass {
	
	public static List<MealInfo> mealList = new ArrayList<>();
	
	public DataClass() {
		
	}
	
	public static void checkData() {
		for(MealInfo m : mealList) {
			System.out.println(m.getRank() + " | " + m.getCafe() + " | " + m.getImgName());
		}
	}
}

○JDBC_Interface.java : JDBC를 사용하려는 메서드들을 선언해놓은 인터페이스

package com.choonham.util;

public interface JDBC_interface {
	/** 객체화된 DATA를 DB에 넣는 메서드 **/
	public void putDataInto();

	/** DB에 있는 DATA를 꺼내와 HTML Tags를 만드는 메서드 **/
	public String makeTags();
	
	/** DB에 이미 데이터가 들어가 있는 상태인지 확인하기 위한 메서드**/
	public int countDB();
}

○JDBC.java : JDBC를 사용하려는 메서드들을 정의한 클래스

 

 1) JDBC.putDataInto(): ArrayList<MealInfo>형태로 저장되어 있는 정보들을 DB 내부로 옮기기 위한 메서드

@Override
	public void putDataInto() {
		List<MealInfo> meal = DataClass.mealList;
		try {
			Class.forName(this.oracleDriverPath);
			System.out.println("Oracle driver has been loaded!");
			
			System.out.println("We are now in!!");
			
			for(int i = 0; i < meal.size(); i++) {
				String query = "INSERT INTO BEST_SANDWICHES VALUES (?, ?, ?, ?, ?, ?)";
				this.pstmt = conn.prepareStatement(query);
				this.pstmt.setInt(1, meal.get(i).getRank());
				this.pstmt.setString(2, meal.get(i).getCafe());
				this.pstmt.setString(3, meal.get(i).getMenu());
				this.pstmt.setFloat(4, meal.get(i).getPrice());
				this.pstmt.setString(5, meal.get(i).getAddress());
				this.pstmt.setString(6, meal.get(i).getImgName());
				this.pstmt.executeUpdate();
			}
			
			System.out.println("Put Data in DB!!");
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	

 

 2) JDBC.makeTags(): DB에 있는 정보들을 꺼내서 Tags로 만들어 Tags를 반환하는 메서드(제일 헤맸다...)

@Override
	public String makeTags() {
		String query = "SELECT * FROM BEST_SANDWICHES";
		String tags = "";
		tags += "<!doctype html>";
		tags += "<html>\r\n" + 
				"<head><title>Best Sandwiches in Chicago</title></head>\r\n" + 
				"<body>\r\n" ;
		tags += "<table border=1>";
		tags += "<tr>";
		try {
			this.stmt = this.conn.createStatement();
			this.rs = this.stmt.executeQuery(query);
			int n = 5;	
			while(this.rs.next()) {
				if(n==0) {
					tags += "</td>";
					tags += "<tr>";
					n = 5;
				}
				n--;
				tags += "<td>";  
				tags += "<table>" ;
				tags += "<tr><th>" + this.rs.getInt(1)+ "." + this.rs.getString(2) + "</th></tr>";
				tags += "<tr><td>" + this.rs.getString(3) + "</td></tr>";
				tags += "<tr><td><img src='../../filetest/sandwichs/images/" + this.rs.getString(6)+ "' width='100' height='100' /></td></tr>";
				tags += "<tr><td>$"+ this.rs.getFloat(4) +"</td></tr>";
				tags += "<tr><td>"+ this.rs.getString(5)+ "</td></tr> ";
				tags += "</table>" ;
			}
			tags += "</td>";
			tags += "</table>" ;
			tags += "</body>\r\n" + "</html>";
			System.out.println("태그 생성 완료~!");
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return tags;
	}

다른 작업들은 이젠 많이 익숙해져서 빠르게 진행할 수 있었는데, HTML tag를 사용하는 게 왜이리 서툰지....

테이블 안에 여러 테이블을 만들어 5행 10열짜리 테이블을 만들었어야 했는데, 연산이 잘못됐는지 계속 깨져서 시간을 좀 많이 갈았다...ㅜ

 

3) JDBC.countDB(): 프로그램을 여러번 실행했을 때, 같은 데이터가 중복으로 들어가는 것을 방지하기 위한 메서드

@Override
	public int countDB() {
		String query_count = "SELECT * FROM BEST_SANDWICHES ORDER BY RANK ASC";
		try {
			this.stmt = this.conn.createStatement();
			this.rs = this.stmt.executeQuery(query_count);
			
			if(this.rs.next())
				return rs.getInt(1);
			
		} catch(Exception e) {
			e.printStackTrace();
		}
		return 0;
	}

○Methods_Interface.java : 나머지 필요 메서드들을 선언해놓은 인터페이스

package com.choonham.util;

public interface Methods {
	
	/** Excel File을 읽어와 객체화시키는 메서드 **/
	public void readExcel(String uri);

	
	
	/** Tags를 인자로 받아 HTML파일을 만드는 메서드 **/
	public void makeHTML(String uri, String tags);
}

○MethodsClass.java : 나머지 필요 메서드들을 정의한 클래스

 

 1) MethodsClass.readExcel(): 엑셀 파일을 읽어와서 객체화시키기 위한 메서드

	@Override
	public void readExcel(String uri) {
		File file = new File(uri);
		Workbook wb = null;
		List<String> tempArray = new ArrayList<>();

		String imgUri = "../../filetest/sandwichs/images";
		File imageFolder = new File(imgUri);
		File[] images = imageFolder.listFiles();

		try {
			wb = Workbook.getWorkbook(file);
			Sheet sheet = wb.getSheet(0);
			Cell cell = null;
			int n = 1;
			while (true) {
				try {
					for (int i = 0; i < 5; i++) {
						cell = sheet.getCell(i, n);
						tempArray.add(cell.getContents());
					}
					DataClass.mealList.add(new MealInfo(tempArray.get(0), tempArray.get(1), tempArray.get(2),
							tempArray.get(3), tempArray.get(4), images[n - 1].getName()));
					tempArray.clear();
					n++;
				} catch (Exception e) {
					break;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

 2) MethodsClass.makeHTML(String tags): Tags값을 인자로 받아 HTML을 생성하는 메서드

@Override
	public void makeHTML(String tags, String uri) {
		FileWriter fw = null;
		try {
			fw = new FileWriter(uri);
			fw.write(tags);
			fw.close();
			System.out.println("HTML 파일 생성 완료!");
		} catch (IOException e) {
			System.out.println(e.getMessage());
		} finally {
			try {
				fw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

○MainClass.java

package com.choonham;

import com.choonham.data.DataClass;
import com.choonham.util.JDBC;
import com.choonham.util.MethodsClass;

public class MainClass {

	public static void main(String[] args) {
		MethodsClass mc = new MethodsClass();
		JDBC db = new JDBC();

		int count = db.countDB();

		if (count < 1) {
			mc.readExcel("../../filetest/sandwichs/best_sandwiches_list_chicago_price_address.xls");
			DataClass.checkData();
			db.putDataInto();
			String tags = db.makeTags();
			mc.makeHTML(tags, "../../filetest/sandwichs/sandwiches.HTML");
		}
		else {
			System.out.println("데이터 이미 있음~");
		}
	}
}

◎ Output.HTML

Tag를 생성하는 게 왜이리 힘든지...아무튼 모든 작업을 끝내면, 위와 같은 결과를 확인할 수 있다.

 

 

프로젝트의 Git:

github.com/Choonham/Choonham-2020.03.10-Spring-Class/tree/master/best_sandwiches/src/com/choonham

 

Choonham/Choonham-2020.03.10-Spring-Class

Contribute to Choonham/Choonham-2020.03.10-Spring-Class development by creating an account on GitHub.

github.com

 

 

끝!!

반응형

'Database' 카테고리의 다른 글

<Database> SQL Sequence  (0) 2021.04.12
<Database> SQL 집합 연산자  (0) 2021.04.12
<Database> DML - SELECT  (0) 2021.04.06
<Database> SQL의 DDL, DML, DCL 정리  (0) 2021.04.05
<Database> 오라클의 자료형(Data Type) 정리  (0) 2021.04.05
Comments