[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 라이브러리를 직접 추가해줍니다!


image



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();
		}
	}	
}




image



와우 제대로 연결되었네요!!


INSERT 문 날리기



JDBC를 이용해 DB계정과 연결했으니 이제 직접 자바코드에서 INSERT문을 날려보겠습니다!

일단 제 mysql 서버 계정에는 Test 테이블이 있으며, 데이터는 없는 상태입니다!


image



그러면 아까 정의한 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;
		}
	}
	
}




image



와우 1개행이 무사히 들어갔다고 하네요! mysql 서버의 db를 확인해볼까요?


image



제대로 들어간 것을 볼 수 있습니다.


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;
	}

}




image



아까 삽입한 행을 올바르게 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;
	}

}




image



mysql 서버에서도 제대로 지워졌는지 확인해볼까요?


image



아까 삽입한 행이 지워졌습니다~