[Java] Maven JDBC 프로젝트 생성하기
카카오뱅크 코딩테스트 문제로 나왔던 문제를 해결하기 위해서 Maven을 처음 사용해봤다. Java 프로그래밍이 과제였는데 단순히 소스코드를 제출하는 것이 아니라 Maven 프로젝트를 제출하는 것이어서 부랴부랴 준비해서 사용해봤다. 프로그래밍을 하면서 별도의 IDE를 사용해본 적이 없어서 리눅스 bash
와 vim
만을 이용했다.
프로젝트 생성 및 의존성 관리
다음 명령으로 프로젝트를 생성한다.
mvn archetype:generate \
-DgroupId=net.oboki.kakaobank \
-DartifactId=codingtest-p4 \
-Dpackage=net.oboki.kakaobank.recruit
아래 값들은 인터넷에 찾아보니 다음과 같은 역할을 한다고 하는데 java 프로젝트를 제대로 해본 적이 없어서 잘은 모르겠다.
- groupId
- 생성할 프로젝트 식별을 위한 고유한 값
- artifactId
- 빌드 이후 생성되는 jar파일의 이름
- package
프로젝트 생성 명령 수행 결과 생성되는 codingtest-p4
디렉토리로 이동해서 이후의 모든 작업들을 진행한다.
jdbc를 이용해서 mysql 데이터베이스에 접근할 것인데 아래와 같이 pom.xml
파일에 다음과 같이 mysql jdbc 드라이버에 대한 의존성을 추가한다.
vi pom.xml
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
</dependencies>
아래 명령을 수행해주게 되면 target/dependency
경로에 pom.xml
에서 기재한 mysql jdbc 드라이버가 다운로드 된다.
mvn dependency:copy-dependencies
채점시에 어떤 버전의 드라이버가 사용되는지 몰라서 바로 실행할 수 있도록 의존성을 전부 다운로드 시켰다. 굳이 안해도 되는 부분 어쨋든 이런식으로 프로젝트마다 버전 관리를 할 수 있고 Maven repository 에서 편하게 라이브러리 다운로드가 가능하다는 점이 maven을 사용하는 장점인 것 같다.
프로그램 작성
src/main/java/net/oboki/kakaobank/recruit
경로에 java 프로그램을 생성하고 작성한다. 해당 경로에 App.java
라는 파일이 이미 만들어져있는데 해당 클래스명으로 사용할 게 아니기때문에 삭제하고 새로운 문서를 열어 코드를 작성한다.
응시했던 코딩 테스트 문제 내용이 유출될 수 있는 SQL이나 알고리즘은 모두 제거하고 jdbc 프로젝트에 필요한 클래스들에 대한 템플릿만 작성
vi src/main/java/net/oboki/kakaobank/recruit/ProgName.java
package net.oboki.kakaobank.recruit;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class ProgName {
static String result = null;
static Connection conn = null;
static Statement stmt = null;
static PreparedStatement pstmt = null;
public static void main(String[] argv) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
return;
}
try {
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/DATABASE_NAME?serverTimezone=UTC", "USERNAME", "PASSWORD");
} catch (SQLException e) {
e.printStackTrace();
return;
}
try {
stmt = conn.createStatement();
String sql = "DROP TABLE IF EXISTS TEMP_TAB";
stmt.executeUpdate(sql);
sql = "CREATE TABLE IF NOT EXISTS TEMP_TAB(";
sql += " TCOL1 VARCHAR(128),";
sql += " TCOL2 VARCHAR(128),";
sql += " TCOL3 DOUBLE";
sql += " )";
stmt.executeUpdate(sql);
sql = "SELECT COL1,COL2,COL3 FROM TAB";
pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
sql = "INSERT INTO TEMP_TAB VALUES(?, ?, ?)";
pstmt = conn.prepareStatement(sql);
while (rs.next()) {
String col1 = rs.getString("COL1");
String col2 = rs.getString("COL2");
Double col3 = rs.getDouble("COL3");
pstmt.setString(1,col1);
pstmt.setString(2,col2);
pstmt.setDouble(3,col3);
pstmt.addBatch();
pstmt.clearParameters();
}
pstmt.executeBatch();
pstmt.clearBatch();
//conn.commit();
sql = "SELECT TCOL1,TCOL2,TCOL3 FROM TEMP_TAB";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while (rs.next()) {
String tcol1 = rs.getString("TCOL1");
String tcol2 = rs.getString("TCOL2");
String tcol3 = rs.getString("TCOL3");
result += tcol1+tcol2+tcol3+"\n";
}
sql = "DROP TABLE IF EXISTS TEMP_TAB";
stmt.executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
pstmt.close();
stmt.close();
conn.close();
} catch (SQLException e){
e.printStackTrace();
}
}
FileWriter fwriter = null;
try{
File file = new File("output_file_name.csv");
fwriter = new FileWriter(file,true);
fwriter.write(result);
fwriter.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fwriter.close();
} catch (IOException e){
e.printStackTrace();
}
}
}
}
빌드 및 실행
아래 명령으로 빌드하고
mvn package
아래 명령으로 프로그램을 실행한다.
java -cp target/codingtest-p4-1.0-SNAPSHOT.jar:target/dependency/* net.oboki.kakaobank.recruit.ProgName