Innovating today, leading tomorrow

OpenSQL_Technical Guide
[OpenSQL] (Interface) JDBC

[OpenSQL] (Interface) JDBC

JDBC 개요

JDBC란?

The PostgreSQL JDBC Driver allows Java programs to connect to a PostgreSQL database using standard, database independent Java code.
– PostgreSQL JDBC공식 문서 –

JDBC는 Java 프로그램이 PostgreSQL 데이터베이스에 연결할 수 있도록 해주는 API 입니다.

DBMS마다 연결에 필요한 Driver가 다릅니다. PostgreSQL은 PostgreSQL JDBC Driver를 사용합니다.

JDBC 버전 확인

ava 프로그램 개발 시 사용한 JDK 버전에 호환되는 JDBC 버전을 확인해야 합니다!
JDK 버전과 JDBC 버전의 호환성은 아래 표와 같습니다.

JDK 버전과 JDBC 버전 호환성

JDK 버전JDBC 버전
1.1JDBC 1
1.2, 1.3JDBC 2
1.3 + J2EEJDBC 2 EE
1.4, 1.5JDBC 3
1.6JDBC 4.0
1.7JDBC 4.1
1.8 이상JDBC 4.2

프로그램에 사용된 JDK 버전에 맞는 JDBC 버전을 확인 하셨다면, PostgreSQL JDBC Driver를 다운로드 받을 차례입니다!
https://jdbc.postgresql.org/download/

아래 처럼 Java 버전별로 다운로드가 나뉘어져 있고, JDBC 버전에 따라서 다운로드가 나뉘어져 있기 때문에 위에서 확인한 JDBC 버전 또는 JDK 버전으로 다운로드 받아주시면 됩니다.

PostgreSQL Driver 사용 방법

사용 실습 환경

아래와 같은 환경에서 PostgreSQL Driver를 사용하는 방법을 알려드리겠습니다!

OSCentOS 7.9
PostgreSQL VersionPostgreSQL 14.2
JDBC Driverpostgresql-42.2.27.jre7.jar
JDKOpenJDK 1.7

실습

  1. 실습 환경에 필요한 JDK를 설치합니다.

yum 패키지 매니저 사용을 위해 root 계정을 사용 하겠습니다.

[root@localhost ~]# yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel

2. 설치가 완료되었다면 아래와 같이 java 및 javac가 올바르게 설치 되었는지 확인 해줍니다.

[root@localhost ~]# java -version
java version "1.7.0_261"
OpenJDK Runtime Environment (rhel-2.6.22.2.el7_8-x86_64 u261-b02)
OpenJDK 64-Bit Server VM (build 24.261-b02, mixed mode)

[root@localhost ~]# javac -version
javac 1.7.0_261

3. 실습에 사용할 테이블과 데이터를 생성합니다. 접속할 대상 서버에서 테이블과 데이터를 생성 해줍니다. psql을 이용 하신다면 자동으로
Commit 됩니다!

postgres=# CREATE TABLE jdbc_table(id integer, first_name varchar(100), last_name varchar(100));
postgres=# INSERT INTO jdbc_table VALUES(1,'HW','LEE');
postgres=# INSERT INTO jdbc_table VALUES(2,'HANS','CHOI');

4. pg_hba.conf를 변경하여 java 프로그램이 JDBC를 통해 들어올 수 있도록 연결을 허용해줍니다. pg_hba.conf는 PostgreSQL의 data 디렉
토리에 있습니다.
저는 java 프로그램을 실행하는 서버와 데이터베이스 서버가 다르기 때문에, java 프로그램을 실행하는 서버의 host(192.168.123.123)를 적
어주었습니다.

vi pg_hba.conf

TYPE DATABASE USER ADDRESS METHOD
host all all 192.168.123.123/32 trust

5. java 테스트 파일을 생성합니다.

여기서 부터는 opensql 유저로 진행 하겠습니다.
실습에 사용할 java 파일을 생성합니다.

url, user, pwd 등 접속 정보를 변경해서 사용 해주세요!
실행할 쿼리는 pstmt 이며, 위에 생성한 실습 테이블을 불러오는 쿼리입니다.

vi postgresqljdbc.java

import java.sql.*;

public class postgresqljdbc{
public static void main(String[] args) {
Connection db = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
String url = “jdbc:postgresql:192.168.184.123.123:5432/postgres”; // 데이터베이스 URL jdbc:postgresql://host:port/database” 형식으로 작성합니다.
String user = postgres; // 데이터베이스 접속 계정을 설정합니다.
String pwd = pg1234; // 데이터베이스 접속 계정의 패스워드를 설정합니다.
Class.forName(“org.postgresql.Driver”); // PostgreSQL JDBC의 패키지안에 있는 Driver 클래스를 불러옵니다.
db = DriverManager.getConnection(url, user, pwd);
System.out.println(“Connection Ok”);

            pstmt = db.prepareStatement("SELECT id, first_name, last_name FROM jdbc_table"); // 실행할 SQL를 입력 받습니다.
rs = pstmt.executeQuery();

while(rs.next()){ // SQL문을 실행 결과 값을 출력하는 부분
System.out.println("id : " + rs.getString(1) + " / first_name : " + rs.getString(2) + " / last_name : " + rs.getString(3));
}
rs.close();
pstmt.close();
db.close();
}catch(Exception e){
System.out.println("e :"+e);
if(rs != null){
try{rs.close();} catch(Exception re){System.out.println("re : "+re);}
}
if(pstmt != null){
try{pstmt.close();} catch(Exception pe){System.out.println("pe : "+pe);}
}
if(db != null){
try{db.close();} catch(Exception de){System.out.println("de : "+de);}
}
}
finally{
System.out.println("nFinish");
}
}
}

6. postgresqljdbc.java 파일을 컴파일합니다.
JDBC Driver 파일이 있는 위치를 -cp 옵션을 사용하여 CLASSPATH로 지정해 주셔야 합니다!
완료가 되면 postgresqljdbc.class 파일이 생성됩니다.

[opensql@localhost:~]$ javac -cp .:/opensql/postgresql-42.2.27.jre7.jar postgresqljdbc.java -verbose
[parsing started RegularFileObject[postgresqljdbc.java]]
[parsing completed 33ms]
[search path for source files: .,/opensql/postgresql-42.2.27.jre7.jar]
[search path for class files: /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/jre/lib/resources.jar,/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/jre/lib/rt.jar,/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/jre/lib/sunrsasign.jar,/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/jre/lib/jsse.jar,/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/jre/lib/jce.jar,/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/jre/lib/charsets.jar,/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/jre/lib/rhino.jar,/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/jre/lib/jfr.jar,/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/jre/classes,/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/jre/lib/ext/dnsns.jar,/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/jre/lib/ext/localedata.jar,/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/jre/lib/ext/pulse-java.jar,/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/jre/lib/ext/sunec.jar,/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/jre/lib/ext/sunjce_provider.jar,/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/jre/lib/ext/sunpkcs11.jar,/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/jre/lib/ext/zipfs.jar,.,/opensql/postgresql-42.2.27.jre7.jar]
[loading ZipFileIndexFileObject[/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/lib/ct.sym(META-INF/sym/rt.jar/java/lang/Object.class)]]
[loading ZipFileIndexFileObject[/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/lib/ct.sym(META-INF/sym/rt.jar/java/lang/String.class)]]
[checking postgresqljdbc]

[loading ZipFileIndexFileObject[/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/lib/ct.sym(META-INF/sym/rt.jar/java/lang/StringBuffer.class)]]
[wrote RegularFileObject[postgresqljdbc.class]]

[opensql@localhost ~]$ ls -l
total 972
-rw-r–r–. 1 root root 984955 Feb 24 16:29 postgresql-42.2.27.jre7.jar
-rw-rw-r–. 1 opensql opensql 2152 Feb 24 17:06 postgresqljdbc.class
-rw-rw-r–. 1 opensql opensql 1973 Feb 24 17:06 postgresqljdbc.java

7. class 파일을 실행하여 데이터베이스 접속을 확인합니다.
컴파일 할 때와 마찬가지로 -cp 옵션을 사용하여 JDBC 드라이버의 위치를 지정해줍니다!

아래의 실행 결과 처럼 데이터가 정상적으로 출력 되는 것을 확인하실 수 있습니다!

[opensql@localhost ~]$ java -cp .:/opensql/postgresql-42.2.27.jre7.jar postgresqljdbc
Connection Ok
id : 1 / first_name : HW / last_name : LEE
id : 2 / first_name : HANS / last_name : CHOI

Finish

오류가 발생 한다면?

연결 오류

FATAL: no pg_hba.conf entry for host “192.168.123.123”, user “postgres”, database “postgres”, no encryption
오류가 발생해요!

답변 내용
PostgreSQL의 pg_hba.conf에 연결 허용 설정이 되어있지 않아서 그렇습니다! pg_hba.conf에 접속 정보를 추가 해주세요!

아래는 TCP 연결을 통해 192.168.123.123 호스트로 부터 온 연결 요청에 대해서 모든 데이터베이스 및 모든 유저로 접속이 가능하고 패스워드는 입력하지 않아도 접속이 가능 하도록 설정하는 예시 입니다.

# TYPE DATABASE USER ADDRESS METHOD
host all all 192.168.123.123/32 trust

java.lang.ClassNotFoundException: org.postgresql.Driver
오류가 발생해요!

답변 내용
JDBC Driver의 CLASSPATH가 정상적으로 설정되지 않아서 그렇습니다! java 파일명.class 실행 시에 -cp 옵션을 이용해서 클래스 패스를 지정 해주시기 바랍니다.

Tomcat 등 WAS를 통해 접속 한다면 JDBC 드라이버를 불러올 수 있도록 웹 프로그램이 참조하는 라이브러리 폴더에 저장이 되었는지 확인 해주시기 바랍니다!

지금까지 ‘PostgreSQL Java interface인 JDBC’에 관해 알아보았습니다

‘(Interface) psqlODBC’를 바로 이어서 확인해보세요!

광고성 정보 수신

개인정보 수집, 활용 목적 및 기간

(주)티맥스티베로의 개인정보 수집 및 이용 목적은 다음과 같습니다.
내용을 자세히 읽어보신 후 동의 여부를 결정해 주시기 바랍니다.

  • 수집 목적: 티맥스티베로 뉴스레터 발송 및 고객 관리
  • 수집 항목: 성함, 회사명, 회사 이메일, 연락처, 부서명, 직급, 산업, 담당업무, 관계사 여부, 방문 경로
  • 보유 및 이용 기간: 동의 철회 시까지

※ 위 개인정보 수집 및 이용에 대한 동의를 거부할 권리가 있습니다.
※ 필수 수집 항목에 대한 동의를 거부하는 경우 뉴스레터 구독이 제한될 수 있습니다.

개인정보의 처리 위탁 정보
  • 업체명: 스티비 주식회사
  • 위탁 업무 목적 및 범위: 광고가 포함된 뉴스레터 발송 및 수신자 관리
 

개인정보 수집 및 이용

개인정보 수집, 활용 목적 및 기간

(주)티맥스티베로의 개인정보 수집 및 이용 목적은 다음과 같습니다. 내용을 자세히 읽어보신 후 동의 여부를 결정해 주시기 바랍니다.

  • 수집 목적: 티맥스티베로 뉴스레터 발송 및 고객 관리
  • 수집 항목: 성함, 회사명, 회사 이메일, 연락처, 부서명, 직급, 산업, 담당업무, 관계사 여부, 방문 경로
  • 보유 및 이용 기간: 동의 철회 시까지

※ 위 개인정보 수집 및 이용에 대한 동의를 거부할 권리가 있습니다.
※ 필수 수집 항목에 대한 동의를 거부하는 경우 뉴스레터 구독이 제한될 수 있습니다.

개인정보의 처리 위탁 정보

  • 업체명: 스티비 주식회사
  • 위탁 업무 목적 및 범위: 광고가 포함된 뉴스레터 발송 및 수신자 관리
  •