[Spring] 3.JDBC:자바와 DB의 연동
JDBC 코딩
이번 장에서는 [Deployment_Tool] 4.GCP(Google Cloud Platform) 에서 생성한 mysql 서버에 있는 db와 Spring을 연동해보겠습니다!
java와 db는 JDBC(Java Database Connectivity)를 이용해서 연결할 수 있습니다~
JDBC를 이용해 좀 있다가 스프링에 있는 자바코드로 mysql 서버에 있는 db에 쿼리도 날려보겠습니다!
재밌겠죠??
먼저, 세팅해야할 것과 알아야할 것이 몇 개 있습니다!
Mysql 연결테스트와 jUnit
java를 이용해서 JDBC 연결이 정상적으로 이루어지는지 테스트를 해봐야하는데, 그 역할을 하는 것이 jUnit입니다!
jUnit은 애플리케이션 테스트할 때 제대로 배울 것이기에 연결을 테스트 해준다 정도만 기억하셔도 됩니다!
<jUnit 관련 애노테이션>
@Test : 테스트해야 하는 내용을 메소드 안에 작성하고 메소드 위에 @Test 애노테이션을 추가하면 jUnit은 해당 메소드를 테스트용 코드로 간주하고 테스트를 진행
@Before : 모든 테스트 작업에 앞서 준비되어야 하는 내용을 작성해서 메소드에 추가하는 애노테이션이고 @Test 전에 실행되기에 테스트를 위한 준비 작업을 할 때 사용
@After : 테스트 작업이 끝난 후 자동으로 실행되는 메소드에 추가하는 애노테이션
MySQL 테스트 관련 라이브러리
Mysql을 테스트 하려면 Mysql의 JDBC 연결을 위한 드라이버인 MySQLConnector/J 라는 JDBC 라이브러리가 필요합니다!
전 장에서 배운 maven을 통해 자동으로 다운받아볼까요??
pom.xml 파일에 다음과 같은 내용을 추가합니다.
<!-- http://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
또 jUnit의 버전도 4.12로 수정해줍니다~
<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
또 프로젝트에 JUit 라이브러리를 직접 추가해줍니다!
JDBC 연결 테스트 코드 만들기
jUnit을 이용한 JDBC 연결 코드 작성은 src/test/java 밑에 MYSQLConnectionTest로 작성합니다!
package io.github.kookyungmin;
import java.sql.Connection;
import java.sql.DriverManager;
import org.junit.Test;
public class MYSQLConnectionTest {
private static final String DRIVER = "com.mysql.jdbc.Driver"; //Connection을 구현한 클래스의 이름
private static final String URL = "JDBC:MYSQL://35.200.109.72:3306/testdb?useSSL=false"; //mysql 서버 주소
private static final String USER = "root"; //계정
private static final String PW = "비~밀"; // 비밀번호
@Test //jUnit이 테스트함
public void testConnection() throws Exception{
Class.forName(DRIVER); //DRIVER라는 이름을 가진 클래스를 찾음
//DB 계정과 연결된 객체를 Connection 클래스의 인스턴스인 con에 담음
try(Connection con = DriverManager.getConnection(URL,USER,PW)){
System.out.println(con); //연결된 계정 출력
}catch(Exception e) { //연결이 되지 않은 예외처리
e.printStackTrace();
}
}
}
와우 제대로 연결되었네요!!
INSERT 문 날리기
JDBC를 이용해 DB계정과 연결했으니 이제 직접 자바코드에서 INSERT문을 날려보겠습니다!
일단 제 mysql 서버 계정에는 Test 테이블이 있으며, 데이터는 없는 상태입니다!
그러면 아까 정의한 MYSQLConnectionTest 클래스에서 INSERT 메서드를 다음과 같이 구현하겠습니다!
import com.mysql.jdbc.PreparedStatement;
//INSERT 문을 날리는 메서드 (id는 db에서 자동으로 생성하기에 넣을 필요 없음, 반환값은 넣은 행의 개수)
private int insert(Connection con, String name, String remark) {
final String SQL= "INSERT INTO TEST(name,remark) VALUES (?,?)"; //sql 쿼리
//PreparedStatement에서 해당 SQL을 미리 컴파일함
try(PreparedStatement pstml = (PreparedStatement) con.prepareStatement(SQL)) {
pstml.setString(1, name); //1번째 물음표에 name 삽입
pstml.setString(2, remark); //2번째 물음표에 remark 삽입
return pstml.executeUpdate(); //쿼리실행 반환 값 삽입한 행의 개수
}catch(Exception e){ //예외처리
e.printStackTrace();
System.out.println("테이블에 행 삽입 실패");
return 0;
}
}
전체코드입니다~
package io.github.kookyungmin;
import java.sql.Connection;
import java.sql.DriverManager;
import org.junit.Test;
import com.mysql.jdbc.PreparedStatement;
public class MYSQLConnectionTest {
private static final String DRIVER = "com.mysql.jdbc.Driver"; //Connection을 구현한 클래스의 이름
private static final String URL = "JDBC:MYSQL://35.200.109.72:3306/testdb?useSSL=false"; //mysql 서버 주소
private static final String USER = "root"; //계정
private static final String PW = "비~밀"; // 비밀번호
@Test //jUnit이 테스트함
public void testConnection() throws Exception{
Class.forName(DRIVER); //DRIVER라는 이름을 가진 클래스를 찾음
try(Connection con = DriverManager.getConnection(URL,USER,PW)){ //DB 계정과 연결하여 연결된 객체를 Connection 클래스의 인스턴스인 con에 담음
int num=insert(con,"koo","JDBC 테스트");
System.out.println(num+"개 행 삽입 완료");
}catch(Exception e) {
e.printStackTrace();
}
}
//INSERT 문을 날리는 메서드 (id는 db에서 자동으로 생성하기에 넣을 필요 없음, 반환값은 넣은 행의 개수)
private int insert(Connection con, String name, String remark) {
final String SQL= "INSERT INTO TEST(name,remark) VALUES (?,?)"; //sql 쿼리
//PreparedStatement에서 해당 SQL을 미리 컴파일함
try(PreparedStatement pstml = (PreparedStatement) con.prepareStatement(SQL)) {
pstml.setString(1, name); //1번째 물음표에 name 삽입
pstml.setString(2, remark); //2번째 물음표에 remark 삽입
return pstml.executeUpdate(); //쿼리실행 반환 값 삽입한 행의 개수
}catch(Exception e){ //예외처리
e.printStackTrace();
System.out.println("테이블에 행 삽입 실패");
return 0;
}
}
}
와우 1개행이 무사히 들어갔다고 하네요! mysql 서버의 db를 확인해볼까요?
제대로 들어간 것을 볼 수 있습니다.
SELECT 문
이번에는 SELECT문을 날려보겠습니다~!
// SELECT 문을 날리는 메서드
private static final String SQL2 = "select name from TEST where id = ?;"; // sql 쿼리
public String selectName(Connection con, Integer id) throws Exception {
String result = null;
try (PreparedStatement pstmt = con.prepareStatement(SQL2)) {
pstmt.setString(1,id.toString());
ResultSet rs = pstmt.executeQuery(); // 쿼리 실행
if (rs.next()) // 다음행이 있는지 확인
result = rs.getString("name"); // name column을 가져옴
} catch (Exception e) {
throw e;
}
return result;
}
전체코드입니다~
package io.github.kookyungmin;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.junit.Test;
public class MYSQLConnectionTest {
private static final String DRIVER = "com.mysql.jdbc.Driver"; // Connection을 구현한 클래스의 이름
private static final String URL = "JDBC:MYSQL://35.200.109.72:3306/testdb?useSSL=false"; // mysql 서버 주소
private static final String USER = "root"; // 계정
private static final String PW = "1234"; // 비밀번호
@Test // jUnit이 테스트함
public void testConnection() throws Exception {
Class.forName(DRIVER); // DRIVER라는 이름을 가진 클래스를 찾음
try (Connection con = DriverManager.getConnection(URL, USER, PW)) {
int id = 1;
String name = selectName(con,id);
System.out.println("id가 "+id+"인 행의 name 은 " + name);
} catch (Exception e) {
e.printStackTrace();
}
}
// SELECT 문을 날리는 메서드
private static final String SQL2 = "select name from TEST where id = ?;"; // sql 쿼리
public String selectName(Connection con, Integer id) throws Exception {
String result = null;
try (PreparedStatement pstmt = con.prepareStatement(SQL2)) {
pstmt.setString(1,id.toString());
ResultSet rs = pstmt.executeQuery(); // 쿼리 실행
if (rs.next()) // 다음행이 있는지 확인
result = rs.getString("name"); // name column을 가져옴
} catch (Exception e) {
throw e;
}
return result;
}
}
아까 삽입한 행을 올바르게 select 해서 가져왔네요!
DELETE문
이번에는 행을 지워보겠습니다!
// DELETE 문을 날리는 메서드
private static final String SQL3 = "delete from TEST where id = ?;"; // sql 쿼리
public int delete(Connection con, Integer id) throws Exception {
int result = 0;
try (PreparedStatement pstmt = con.prepareStatement(SQL3)) {
pstmt.setString(1,id.toString());
result = pstmt.executeUpdate(); // 쿼리 실행
} catch (Exception e) {
throw e;
}
return result;
}
전체코드입니다~
package io.github.kookyungmin;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import org.junit.Test;
public class MYSQLConnectionTest {
private static final String DRIVER = "com.mysql.jdbc.Driver"; // Connection을 구현한 클래스의 이름
private static final String URL = "JDBC:MYSQL://35.200.109.72:3306/testdb?useSSL=false"; // mysql 서버 주소
private static final String USER = "root"; // 계정
private static final String PW = "1234"; // 비밀번호
@Test // jUnit이 테스트함
public void testConnection() throws Exception {
Class.forName(DRIVER); // DRIVER라는 이름을 가진 클래스를 찾음
try (Connection con = DriverManager.getConnection(URL, USER, PW)) {
int id = 1;
int num = delete(con,id);
System.out.println(num+"개의 행이 삭제되었습니다.");
} catch (Exception e) {
e.printStackTrace();
}
}
// DELETE 문을 날리는 메서드
private static final String SQL3 = "delete from TEST where id = ?;"; // sql 쿼리
public int delete(Connection con, Integer id) throws Exception {
int result = 0;
try (PreparedStatement pstmt = con.prepareStatement(SQL3)) {
pstmt.setString(1,id.toString());
result = pstmt.executeUpdate(); // 쿼리 실행
} catch (Exception e) {
throw e;
}
return result;
}
}
mysql 서버에서도 제대로 지워졌는지 확인해볼까요?