본문 바로가기
programming_kr/java

JDBC, DBCP 그리고 JNDI

by JSsunday 2022. 12. 9.
728x90

Connection과 Connection pool

DriverManager.getConnection()실제 자바프로그램과 데이터베이스를 네트워크상에서 연결해주는 메소드입니다.

- Connection은 네트워크상의 연결 자체를 의미하며 Connection Pool의 Connection 객체 각각을 직접 웹 애플리케이션에서 이용하면 체계적인 관리가 힘듭니다.

- Connection 과정은 부담되는 작업이며, 불필요한 연결에 의한 서버 자원의 낭비가 발생하게 됩니다.

- Connection 객체를 프로그램이 실행될 때마다 생성하는 것이 아니라 웹 애플리케이션이 서비스되기 전에 웹서버에 미리 생성하여 준비한 다음 필요할 때 준비된 Connection을 가져다 사용함으로써 JDBC 프로그래밍 문제점들을 개선할 수 있습니다.

 

 

Datasource

- javax.sql.DataSource라는 인터페이스는 Connection Pool을 관리하는 목적으로 사용되는 객체입니다.

- Application에서는 이 Datasource 인터페이스를 통해서 Connection을 얻어오고 반납하는 등의 작업을 구현해야 합니다.

- Connection Pool을 어플리케이션단에서 어떻게 관리할지를 구현하는 인터페이스가 Datasource라고 생각하면 됩니다.

- 기존의 DriverManager를 이용한 방식은 내부적으로 static한 필드를 사용 -> 스레드 환경에서 바람직하지 않음 -> 되도록 DataSource를 이용

 


JDBC (Java DataBase Connectivity)

- JDBC는 데이터베이스를 조작하는 표준 SQL 인터페이스 API입니다. 즉, JDBC는 databsase connection 인터페이스입니다.

일반적인 JDBC는 데이터베이스풀 방식을 사용하지 않고 DB에서 정보를 가져올때마다 매번 디비연결을 열고 닫기 때문에

상용 서버에는 JDBC 방식을 사용하는 경우가 거의 없습니다.

매우 비효율적이기 때문입니다.


DBCP (Database Connection Pool)

- 기본적인 원리는 어플리케이션을 시작할 때 원하는 만큼 커넥션 객체를 만들어 놓고 pool에 넣어놓았다가 필요할때마다 갖다 쓰고 pool에 반납하는 방식으로 운영을 하게 됩니다.

- 데이터베이스커넥션 풀(Connection Pool)을 어플리케이션 소스단에 설정합니다.(Timeout, max pool size 등등)

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

- JDBC방식 보다는 일반적인 경우 이러한 Pool 방식을 사용합니다.

 


JNDI (Java Naming and Directory Interface)

- JNDI는 DBCP처럼 어플리케이션 소스단에 설정하는 방식이 아닌 WAS에 데이터베이스 커넥션 객체를 미리 네이밍 해두는 방식입니다.

- 예를 들어, 톰캣을  서버로 사용하게 되는 경우 server.xml 파일에 네이밍을 설정해 놓고 사용하게 됩니다.

 


* JDBC와의 차이

- 하드코딩하지않아도 됩니다.

- JNDI는 재활용을 하기 위한 코드로 부하가 발생하지 않게 하기 위해 JNDI를 써야합니다.

JNDI 장점

1. DB설정정보를 파악하기 쉽다.
소스레벨에서 DB설정정보등 DB커넥션에 필요한 정보들을 설정해놓으면 소스 개발자 외에는 DB설정정보를 찾기 어렵습니다.
​그러나 JNDI를 사용하여 WAS단에 설정정보를 저장해놓으면 디비가 몇개 붙었는지, DB설정정보를 파악하기 쉽습니다.

2. DB커넥션풀을 효율적으로 사용할 수 있다.
보통 서버단에서 어플리케이션 컨테이너는 하나이더라도 내부 어플리케이션 소스는 홈페이지 하나 이상이 될 수 있습니다.
관련있는 어플리케이션을 디렉토리서비스나 서브도메인을 사용하여 서비스하는 경우가 그런것인데,
같은 어플리케이션이거나 관련있는 어플리케이션은 보통 DB와 네임스페이스 등 같은 DB, 계정을 사용합니다.

이럴 경우, DBCP를 사용하면 각 어플리케이션마다 DB Pool이 각각 생성이되어 풀이 많아져 효율이 떨어질 수 있고
DB Pool은 비용이 비싼 자원입니다.
어플리케이션 구동시 JDBC작업에서 커넥션하는 부분은 시간과 리소스를 가장 많이 사용하게 됩니다.

그러나 WAS단에서 DB Pool을 하나로 관리하면 효율이 좋아지며 WAS에 static 객체를 생성 후에 쉽게 가져다가 쓸 수 있기 때문입니다.
JNDI객체를 공유객체라고 생각하면 됩니다.

DBCP방식이 안좋은것은 아니며 컨테이너에 하나의 어플리케이션만 올라간다면 서버설정을 건드릴 필요 없이 소스단에서 DB Pool을 만들면 관리가 쉬워질 수 있습니다.

 

실제로 실무에서 DBCP를 사용하는 경우를 본 적이 없습니다.

위와 같은 장점 때문에 더더욱 그런 것 같습니다.

위 내용은 해당 블로그를 참조하며 공부한 것을 기록하기 위해 작성했습니다.

 

참조
https://inpa.tistory.com/entry/DB-%F0%9F%93%9A-JDBC-DBCP-JNDI-%EC%A0%95%EB%A6%AC
728x90

'programming_kr > java' 카테고리의 다른 글

JAVA EE란?  (0) 2023.01.28
JAVA 8 함수형 인터페이스  (0) 2022.11.12
열거형(enum)  (0) 2022.10.29
JAVA8 STREAM(1)  (1) 2022.10.15
제네릭(generic)  (1) 2022.09.24

댓글