<Database> JDBC 활용_3 (문제 풀이)
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
끝!!