Programming/JDBC

JDBC Driver설치. JDBC 기본코드와 동작원리.2021-08-25

최동훈1 2021. 8. 25. 16:58

모든 DBMS를 만드는 회사들은 각 DBMS의 연결 인등 문장실행 결과패치를 할수있게 해 주는 client를 제공한다. SQL DEVELOPER 처럼 말이다. 그런데 우리가 일반 사용자들에게 만들어서 제공하는 UI는 이런 기능을 제공해 주지 않는다. 또한 ORACLE, My SQL , MS SQL 등 다양한 DBMS 를 프로그램이 지원하는데 각각의 종류에 맞는 클라이언트를 그때마다 바꿔 쓸수도 없는 노릇이다.

즉, 기존에 SQL DEVELOPER 같은 DBMS 종속적인 클라이언트 들이 해줬던 연결/인증,문장실행, 결과패치 등을 우리가 대신 해 줘야 한다는 것이다. 또한 여러 DBMS에 범용적으로 적용시킬수 있는 기능도 필요하다.

이런 역할을 각 DBMS마다 최적화된 JDBC Driver가 해준다. JDBC 자체는 깡통(인터페이스) 이고, 각 DBMS의 특화된, 실질적인 쿼리를 실행하는 곳은 JDBC Driver 이다.

즉 JDBC는 DBMS의 종류에 독립적이지만, JDBC Driver 는 DBMS의 종류에 따라 새로 깔아줘야 한다.

**위 내용은 내가 앞전에 두번의 포스팅으로 자세하게 설명했기에 이만 줄임.

오라클 사이트에 접속해서 JDBC Driver 18c 버전을 다운로드 한다. 형광색 클릭.

클릭한 다음 ojdbc8.jar 버전을 클릭한다.

그 다음 이클립스를 열어서 새로운 자바 프로젝트를 만들었다.

처음에는 내가 생성한 프로젝트가 과연 어디에 저장되는 것일까? 이렇게 궁금했었는데 여기 디폴트 경로로 저장되는 것을 알았다.

그런다음 해당 프로젝트에 program 이라는 자바 클래스를 생성한 뒤, Connection 라이브러리를 import 해준다. 기본적으로 자바는 JDBC 라이브러리를 가지고 있기에 그냥 import가 가능하다.
그리고 앞으로 실질적인 기능을 수행하는 JDBC Driver jar 파일을 추가해 줘야 한다.

왼쪽 package Explorer 창에서 새롭게 jar 파일을 추가할 프로젝트에 오른쪽 마우스를 클릭한다.
그 다음, Build Path 항목에서 형광색으로 칠한 부분을 클릭한다.

JDBC Driver를 다운받은 경로를 기억해 놨다가, Add External JAR 부분을 클릭하여 내가 다운 받았던 오라클 전용 JDBC Driver를 추가해준다.
그럼 자바를 통해 DBMS랑 연결/인증, 문장실행, 결과집합 을 수행할 준비는 다 끝났다. 우선 어떤 매커니즘으로 돌아가는지 설명하겠다.
우선 자바 언어로 DBMS에 연결하기 위한 기반 코드는 정형화되어있다. 그냥 복사붙여넣기 해도 될 정도로 똑같다.
앞으로는 이 4줄을 그냥 외워서 써도 무방할거 같다.

Class.forName("oracle.jdbc.driver.OracleDriver"); 
Connection con = DriverManager.getConnection(url,"newlec","vdongv1620"); 
Statement st= con.createStatement(); 
ResultSet rs= st.executeQuery(sql);

첫번째는 JDBC Driver 객체를 생성한다. 이때 new 연산자가 아닌, 왜냐하면, DBMS에 접근할수 있는 실질적인 코드들은 다 JDBC Driver가 가지고 있기 때문이다. 호출이 끝난 다음, 오라클 DBMS 서버가 위치한 url과 사용자 계정, 비밀번호를 차례로 입력하여, DriverManager를 통해 연결/인증 절차를 끝낸다. 그런 다음, 연결을 하고 쿼리를 실행할수 있는 상태(statement)를 만들어 준다. 그런다음, statement 를 통해 문장을 실행하고, 서버에서 만들어진 결과집합을 "1 레코드씩" 담을수 있는 resultset을 생성한다.

jdbc Driver 객체를 써서 DB와 프로그램간의 onnection(연결) 한다. 


여기서 주의할 점은 서버에서 쿼리를 기반으로 만든 결과집합이랑, 그걸 프로그램상으로 1 레코드 씩 담을수 있는 ResultSet이랑은 별개의 집합이라는 것이다. 또한 서버에서 만든 결과집합을 1 레코드 별로 가리키는 포인터(커서)가 존재하는데, rs.next()란 메서드를 활용해서 이 포인터가 가리키는 1레코드씩 결과집합으로 이동시키는 역할을 한다.

서버가 만들어진 결과집합에서 1레코드씩 프로그램의 result set으로 받아오는 모습.

 

import java.sql.Connection;
import java.sql.DriverManager; 
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class program { 
static String url="jdbc:oracle:thin:@localhost:1521/xepdb1"; 
public static void main(String[] args) throws ClassNotFoundException, SQLException
{
// TODO Auto-generated method stub 
String sql ="SELECT * FROM NOTICE";
Class.forName("oracle.jdbc.driver.OracleDriver"); 
Connection con = DriverManager.getConnection(url,"newlec","vdongv1620"); 
Statement st= con.createStatement(); 
ResultSet rs= st.executeQuery(sql);
rs.next(); String title = rs.getString("title"); 
System.out.println(title);
rs.close(); 
st.close(); 
con.close(); 
}
}

그래서 이클립스에 내 오라클의 url과 사용자 계정 pwd를 입력한 기본 코드4줄을 입력한 뒤 실행해 보았다.

rs.next를 통해 가져온 첫번째 레코드의 "title" 필드 값을 출력함.

출력이 됬다!!! rs.getString("title") 이란 코드는 가져온 레코드의 title 칼럼의 값을 출력한다.




공부시간 3시간.
순공시간 1시간 30분.

감격스러웠다. 프로그래밍을 요양원에서 공부한지 1년 5개월 만에 백엔드의 첫 출력을 성공했다 !