본문 바로가기

순이코딩/Java

[Java]JDBC(Java DateBase Connectivity)

728x90
반응형


 

JDBC(Java DateBase Connectivity)란 Java에서 DB에 접속하기 위해 만들어 놓은 API를 의미합니다.

애플리케이션 서버에서 DB에 연결하기 위해서는 1) 커넥션 연결 2) SQL 전달 3) 결과 응답 의 동작이 필요합니다. 

 

DB회사마다 1), 2), 3)의 방법이 모두 다르기 때문에 만약 DB 1 회사의 서버를 사용하다가 DB 2 회사의 서버로 교체하게 되면 큰 문제가 발생합니다. 이러한 문제를 해결할 수 있는 것이 JDBC입니다.

Java에서는 인터페이스를 제공하고 그 인터페이스에 따라 DB회사에서는 자신에게 맞도록 구현해서 라이브러리로 제공합니다. 이것을 JDBC 드라이버라고 합니다. JDBC드라이버가 통역을 해주는 역할인 셈입니다.

그래서 DB 회사를 교체하더라도 제공되는 드라이버를 사용하면 DB에 연결하기 위한 방법이 회사마다 다르더라도 문제가 발생하지 않습니다.

 


 

저는 오라클을 통해 실습을 진행했습니다. 그렇기 때문에 JDBC드라이버는 ojdbc11.jar을 불러왔습니다.

 

JDBC 연결순서는 4단계로 이루어져 있습니다.

 

1) 동적로딩

자바에서는 동적 로딩을 지원하기 때문에 실행 시에 모든 클래스가 로딩되지 않고 필요한 시점에 클래스를 로딩하여 사용할 수 있습니다.

Class.forName("oracle.jdbc.driver.OracleDriver");

위와 같은 코드를 이용해 오라클드라이버를 로딩합니다.

 

2) DB 연결

DB에 연결하기 위해서는 Connection 객체를 생성하여 연결합니다.

			Connection conn = null;

			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String db_id = "SERVICE";
			String db_pw = "12345";

			conn = DriverManager.getConnection(url, db_id, db_pw);

연결하기 위해서는 주소, id, pw가 필요합니다.

코드가 길어지는 것을 막기 위해 Connection 객체를 선언하고 주소, id, pw를 따로 변수에 담았습니다.

 

3) SQL문 작성 및 전송

3단계에서는 PreparedStatement 객체를 생성하여 전송합니다.

 

먼저 오라클에 MEMBER라는 테이블이 생성되어 있습니다. 4개의 쿼리가 있는데 'ID', 'PW', 'NAME'이라는 3개의 쿼리는 문자 데이터타입을 가지고 있고, 'AGE'는 숫자 데이터 타입입니다.

여기서 먼저 쿼리문은 오라클에서와 동일하게 작성하면 됩니다.


ID : SeeUSoon93
PW : 1234
NAME : 김군순
AGE : 31


위와 같은 데이터를 MEMBER테이블에 추가하고자 할 때 오라클에서는 INSERT문을 사용합니다.

insert into MEMBER values('SeeUSoon93','1234','김군순',31);

이와 같은 SQL문을 그대로 Java에서도 사용합니다. 이 SQL문을  PreparedStatement 객체에 담아 전송합니다.

		PreparedStatement psmt = null;
    		String sql = "insert into MEMBER values('SeeUSoon93','1234','김군순',31)";
		psmt = conn.prepareStatement(sql);

전송한 후에는 다음의 코드에 값을 반환합니다.

psmt.executeUpdate();

예를 들어, 1개의 튜플이 추가되었다면 1, 모두 실패했다면 0 이런 식입니다.

 

4) 자원 반납

위의 과정이 다 마무리된 후, DB와 연결되어 열렸던 통로를 닫아주는 것입니다. 닫는 것은 열린 순서의 역순으로 진행되어야 합니다.

				psmt.close();
				conn.close();

DB에 연결한 후, SQL문을 전송했으니 닫을 때는 반대로 진행했습니다.

 

이렇게 오라클에서 MEMBER 테이블을 불러오면 정상적으로 추가돼있는 걸 볼 수 있습니다.

 

물론 이렇게 Java에서도 바로 확인할 수 있습니다.

package jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class Ex01Insert {

	public static void main(String[] args) {

		// JDBC 연결 순서 (4단계)
		// 선행작업 -> ojdbc11.jar 추가
		Scanner sc = new Scanner(System.in);
		Connection conn = null;
		PreparedStatement psmt = null;
		int cnt = 0;
		// 사용자의 id, pw, name, age 입력받기
		System.out.println("==== 회원가입 ====");
		System.out.print("ID : ");
		String id = sc.next();
		System.out.print("PW : ");
		String pw = sc.next();
		System.out.print("이름 : ");
		String name = sc.next();
		System.out.print("나이 : ");
		int age = sc.nextInt();

		try {
			// 1. 동적로딩 Class.forName();
			Class.forName("oracle.jdbc.driver.OracleDriver");

			// 2. DB 연결(Connection 객체 생성)
			// DB에 접근할 때 접근할 DB의 url, id, pw 필요
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String db_id = "SERVICE";
			String db_pw = "12345";

			conn = DriverManager.getConnection(url, db_id, db_pw);

			// 3. SQL문 작성 및 전송(PreparedStatement 객체)
			String sql = "insert into MEMBER values(?, ?, ?, ?)"; // 바인딩 변수 : ?
			psmt = conn.prepareStatement(sql);

			psmt.setString(1, id);
			psmt.setString(2, pw);
			psmt.setString(3, name);
			psmt.setInt(4, age);

			// excuteUpdate() => insert, update, delete
			// excuteQuery() => select
			cnt = psmt.executeUpdate();

		} catch (ClassNotFoundException e) {
			System.out.println("동적 로딩 실패");
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("SQL 실패");
		} finally {
			// 4. 통로 닫아주기, 자원 반납하기
			try {
				psmt.close();
				conn.close();
			} catch (SQLException e) {
				System.out.println("SQL 실패");
			}

		}
		if (cnt > 0) {
			System.out.println("회원가입 성공!!!!!");
		} else {
			System.out.println("회원가입 실패.....");
		}
	}

}
728x90
반응형