잡지식

JAVA JDBC/DBCP/JNDI

엉으니 2017. 6. 6. 13:04

JDBC, DBCP, JNDI 이 세가지는 JAVA에서 DB커넥션 할 때 사용하는 방법이다.

세 방법의 차이점을 알아보려고 한다.


그런데 비교가 가능한 것인가? 같은 비교선상에 놓을 수 있는 것 인지 먼저 생각해보아야 한다.

왜냐하면 JDBC는 자바에서 제공하는 API이고

DBCP, JNDI는 실질적으로 소스개발 시 사용하는 DB커넥션 방법론이기 때문이다.


결론부터 말하면 

JDBC는 데이터베이스 커넥션 인터페이스 이다.

DBCP는 DB커넥션을 어플리케이션 소스 내에서 제어하면서 DB풀을 가진다.

JNDI는 DB커넥션을 WAS단에서 제어하면서 서버에서 하나의 커넥션 풀을 가진다.


-------------------------------------------------------------------------------------------------------------

1. JDBC

JDBC는 앞에서 말했듯이 데이터베이스 커넥션 인터페이스이다.

Java Doc문서의 설명을 발췌한다.

The Java Database Connectivity (JDBC) API provides universal data access from the Java programming language. 

자바 데이터베이스 연결(JDBC) API는 Java프로그래밍언어의 일반적인 데이터 액세스를 제공한다.

Using the JDBC API, you can access virtually any data source, from relational databases to spreadsheets and flat files. 

JDBC API를 사용함으로써, 당신은 데이터베이스에서 스프레드 시트와 플랫파일에 이르기까지 사실상 모든 데이터 소스를 액세스 할 수 있다.

JDBC technology also provides a common base on which tools and alternate interfaces can be built.

JDBC기술은 툴과 대체 인터페이스를 빌드할 수 있는 공통기반 또한  제공한다.

The JDBC API is comprised of two packages:

JDBC API는 두개의 패키지로 구성되었다.

You automatically get both packages when you download the Java Platform Standard Edition (Java SE) 8.

두 패키지 모두 Java 플랫폼 기본 에디션(Java SE)8을 다운로드 받을 때 자동으로 받는다.

To use the JDBC API with a particular database management system, you need a JDBC technology-based driver to mediate between JDBC technology and the database. 

특별한 데이터베이스 관리 시스템을 JDBC API를 사용하려면, JDBC기술과 데이터베이스를 중개하는 JDBC기술 기반의 드라이버가 필요하다.

Depending on various factors, a driver might be written purely in the Java programming language or in a mixture of the Java programming language and Java Native Interface (JNI) native methods. 

다양한 요인에 의해서,  드라이버는 순전히 Java프로그래밍언어로 작성되거나 또는 자바프로그래밍 언어와 Java 동적 인터페이스(JNI)고유 메소드가 혼합되어

작성될 수 있다.

To obtain a JDBC driver for a particular database management system, see JDBC Data Access API.

특별한 데이터베이스 관리 시스템에 대한 JDBC드라이버를 얻으려면 JDBC 데이터 액세스 API를 보세요.

링크> http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136101.html


다음 설명과 같이 데이터베이스를 액세스하는데는 JDBC API가 필수이다.


그렇다면 JDBC와 DBCP가 같은 선상에서 비교할 수 없음이 증명이 된 것인데,

왜 사람들은 JDBC '방식'이라고 부르며 DBCP와 비교를 하려는 것일까?


흔히 JDBC는 데이터베이스풀 방식을 사용하지 않고 DB에서 정보를 가져올 때마다 매번

디비연결을 열고 닫는 방식을 말한다.

디비풀을 사용하지도 않고, 각 페이지에 데이터베이스 통신이 필요한 부분이 있으면 무조건

디비객체 생성, 커넥션 연결, 커넥션종료 등 반복하기 때문에 효율이 매우 떨어진다.

MVC1, MVC2패턴을 사용하는것과는 다르다.


따라서 가장 기본이 되지만 상용 어플리케이션에는 JDBC방식을 사용하는 경우는 거의 없다.

보통은 풀(Pool)방식을 사용한다.

그렇기때문에 필요한 용어가 DBCP(Database Connection Pool)이며

기본적인 원리는 어플리케이션을 시작할 때 원하는 만큼 커넥션 객체를 만들어 놓고 pool에 넣어놓았다가

필요할때마다 갖다 쓰고 pool에 반납하는 방식으로 운영한다.

다중스레드를 스레드풀로 관리하는것과 비슷한 방식이다.


데이터베이스 커넥션 풀을 이용하는 방식도 여러가지 패턴이 있다.

그 중 DBCP와 JNDI방식이 있다.

사실상 DBCP방식이라고 하면 관례적으로 데이터베이스 커넥션 풀을 어플리케이션 소스단에 설정해놓은 방식

이라는 인식이 있다.

그래서 DBCP방식과 JNDI방식을 비교하는 것이다. (사실상은 같은 선상에서 비교할 수 없다.)


JNDI는 DBCP처럼 어플리케이션 소스단에 설정하는 방식이 아닌

WAS단에 데이터베이스 커넥션 객체를 미리 네이밍 해두는 방식이다.

WAS단에 데이터베이스 풀을 미리 네이밍 해 두면 이점이 있다.


1. DB설정정보를 파악하기 쉽다.

소스레벨에서 DB설정정보등 DB커넥션에 필요한 정보들을 설정해놓으면

소스 개발자 외에는 DB설정정보를 찾기 어렵다.


어플리케이션은 하나이더라도 여러 DB를 끌어와 쓸 수 있다는 점에서

DB설정정보를 소스단에 심어놓으면 DB가 얼마나 붙어서 돌아가는 시스템인지

파악하기 힘들다.

파악하더라도 소스분석에 걸리는 시간이 오래걸릴 수 있다.


그러나 JNDI를 사용하여 WAS단에 설정정보를 저장해놓으면

디비가 몇개 붙었는지, DB설정정보를 파악하기 쉽다.


2. DB커넥션풀을 효율적으로 사용할 수 있다.

보통 서버단에서 어플리케이션 컨테이너는 하나이더라도 내부 어플리케이션 소스는 홈페이지 하나 이상이 될 수 있다.

관련있는 어플리케이션을 디렉토리서비스나 서브도메인을 사용하여 서비스하는 경우가 그런것인데,

같은 어플리케이션이거나 관련있는 어플리케이션은 보통 DB와 네임스페이스 등 같은 DB,계정을 사용하기 마련이다.


이럴 경우, DBCP를 사용하면 각 어플리케이션마다 DB Pool이 각각 생성이되어 풀이 많아져 효율이 떨어질 수 있다.

DB Pool은 비용이 비싼 자원이다.

어플리케이션 구동시 JDBC작업에서 커넥션하는 부분은 시간과 리소스를 가장 많이 잡아먹는다.

그러나 WAS단에서 DB Pool을 하나로 관리하면 효율이 좋아진다.

WAS에 스태틱 객체를 생성 후에 쉽게 가져다가 쓸 수 있기 때문이다.

JNDI객체를 공유객체라고 생각하면 쉽다.


DBCP방식이 안좋은것은 아니다.

컨테이너에 하나의 어플리케이션만 올라간다면 서버설정을 건드릴 필요 없이

소스단에서 DB Pool을 만들면 관리가 쉬워질 수 있다.


어떤 방식이든 장점과 단점이 있다는것을 잊으면 안된다.


참고 :::

http://soul0.tistory.com/286

반응형