본문 바로가기

TIL

2025.9.29 - JDBC

JDBC(Java Data Base Connectivity)

- 자바에서 DBMS와 연동하기 위한 저수준 API

     - 저수준 API : 개발자가 원하는 시점에 DB 작업 가능함(세세한 제어가 가능)

- java.sql에서 제공

- Driver loading 방식 : Driver만 제공되면 모든 DBMS와 연동 가능


Driver

- DB vender사에서 제공하는 bytecode

- .jar로 배포

- DB Server에 접속하기 위한 DB Client를 bytecode로 제작한 것 

- java에서는 windows OS용 JDBC-ODBC Bridge Driver만 제공

- JDBC-ODBC Bridge Driver, Native Driver, Netwrok Protocol Driver, Native Protocol Driver

JDBC-ODBC Bridge Driver
- Windows에서만 사용할 수 있는 Driver
- DBMS와 연동은 OS에서 설정하고, Java에서 연결
- 거치는 단계가 많으므로 속도가 느림
- Java는 windows에서 서비스 잘 안함 => 사용 안함
Native Driver
- Driver를 제작한 언어가 Java와 다른 언어로 된 Driver
- 빠른 성능과 안정성을 제공
- Driver를 사용하기 위해서 별도의 프로그램 설치 필요
- Middleware에서 주로 사용 
Netwrok Protocol Driver
- applet에서 DBMS와 연동하기 위한 Driver
Native Protocol Driver(ojdbc8.jar)
- JDBC에서 가장 많이 사용하는 Driver
- Native Driver를 기반?하기 때문에 빠른 성능과 안정성을 제공
- Driver를 제작한 언어가 Java임
- 자바프로그램에서 데이터를 주고 받을 때 문제가 거의 발생하지 않음.

JDBC 개발에 사용되는 객체들

- java.lang.Class : DB vender사에서 제작하여 배포하는 Driver(ojdbc8.jar) 내 특정 클래스(OracleDriver.class)를 객체화하여 JVM에 instance로 올림 

- java.sql.DriverManager : JVM에 로딩된 드라이버를 사용하여 DBMS와 연결

- java.sql.Connection : DBMS 연결 유지(commit(), close()), Transaction 처리, 쿼리문 생성객체 얻기

    - java.sql.Statement : 쿼리문을 실행할 때마다 생성하여 처리(SQLInjection 공격에 취약)   

    - java.sql.PreparedStatement : 쿼리문을 미리 생성하고 값을 나중에 넣어서 실행(값이 들어가는 위치를 설정하는 bind 변수사용 필요)

    - java.sql.CallableStatement : Procedure를 호출할 때 사용하는 객체(PL/SQL)

- java.sql.ResultSet : 조회 결과를 사용하기 위해 데이터형을 변환

- java.sql.ResultSetMetaData : DD가 없어도 테이블의 MetaData(컬럼명, 데이터형, 크기, null 허용여부) 정보를 얻을 때 사용

- java.sql.Types : Procedure에서 처리한 결과를 그 값을 임시로 저장하기 위해 사용하는 데이터 형을 가짐

    - 바인드 변수 선언 : var 변수명 데이터형(크기) > 프로시저 실행 : exec 프로시저명(값, 바인드 변수명)

    - Java에서는 Oracle에 bind 변수를 선언할 수 없기 때문에 그 일을 대신 해주는 Types 클래스 제공
- java.sql.Clob : 자바에서 Clob 데이터형을 처리

JDBC 코딩 순서
1. 드라이버 로딩(Class) 
- eclipse : build path로 Driver가 어디에 있는지 설정해주기 

Add External JARs에서 Driver가 있는 jar 추가

- dos(CUI)
env.bat에 추가 : set CLASSPATH=.;%DEV_HOME%\drivers\ojdbc8.jar
-> . : 하위 모든 클래스
-> ; : PATH 구분

env.bat
0.00MB
Class.forName("oracle.jdbc.OracleDriver");//예외처리 필요
//객체화 가능하지만 한개만 생성하여 관리하기 힘듬 
OracleDriver od = new OracleDriver();//예외처리 필요없음

 

2. 커넥션 얻기(DriverManager, Connection)
String url = "jdbc:oracle:thin:@디비서버위치:포트:SID";
//디비서버위치(자신 컴퓨터) : Localhost, 127.0.0.1
//디비서버위치(다른 컴퓨터) : 해당 컴퓨터의 IP 주소
//포트 : 1521
//SID : orcl
String id ="아이디";
//SCOTT
String pass = "비밀번호";
//tiger
Connection con = DriverManager.getConnection(url, id, pass);//예외처리 필요
//DB서버에서 인증을 거쳐서 Connection 생성

3. 쿼리문 생성객체 얻기(Statement, PreparedStatement, CallableStatement)
//Statement
Statement stmt = con.createStatement(); //쿼리문의 정보가 없어 SQL문을 알지 못함
//PreparedStatement
String sql = "select empno from emp";
PreparedStatement pstmt = con.prepareStatement(sql); //쿼리문의 정보를 가짐
//CallableStatement
CallableStatement cstmt = con.prepareCall("{call 프로시저명(값,,,,,)}");

4. 쿼리문 수행 후 결과 얻기
//Statement
stmt.executeXXX(String sql); //실행될 때마다 계속 생성함
//PreparedStatement
pstmt.executeXXX(); //실행될 때마다 생성하지 않음
empno
5. 연결 끊기

 


DBMS와 JVM 연동

Quantum Database Utility에서 다운로드

압축 풀어서 eclipse에 있는 이름이 같은 폴더에 넣기 

 

eclipse 수정

window > show view > other > QuantumDB > Database bookmarks

Database bookmarks 창에서 우클릭 > new bookmark > add driver > external jar > ojdbc8.jar 선택 > next > 로그인하기

'TIL' 카테고리의 다른 글

2026.2.10 ~ 13 - DevOps(Docker)  (0) 2026.02.10
2026.1.27 - Spring Interceptor  (1) 2026.01.27