JAVA) JDBC, DBCP, JNDI 차이점
본문 바로가기
programming/Java

JAVA) JDBC, DBCP, JNDI 차이점

by 코딩하는 핑가 2020. 12. 31.
반응형

* 이 포스팅은 zunoxi.github.io/infra/2020/06/20/infra-db-jdbc/님의 깃을 학습한 뒤 추가로 공부한 후 재정리한 글입니다.

* 2차 가공 및 재배포를 금지합니다.

* 오탈자 및 잘못된 내용은 댓글달아주세요.

 

[참고글]

JDBC 동작 순서 및 SQL 전송에서 Statement, PreparedStatement 차이점 ( 소스코드 포함 )

 

* 차이점에 대해 알아보기 전 connection pool, datasource에 먼저 살펴보겠습니다.

 

* Connection pool

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

- Connection은 네트워크상의 연결 자체를 의미

- Connection Pool의 Connection 객체 각각을 직접 웹 애플리케이션에서 이용하면 체계적인 관리가 힘듦

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

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

 

* Datasource

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

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

- 즉, Connection Pool을 어플리케이션단에서 어떻게 관리할지를 구현하는 인터페이스

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

 

1. JDBC

* Java DataBase Connectivity

- 데이터베이스를 조작하는 표준 SQL 인터페이스 API

 

* 특징

- 인터페이스 기반으로 구축 ( 데이터베이스 커넥션 인터페이스 )

- 이론적으로 각 DBMS에 맞는 JDBC를 받아주게 되면 쉽게 DBMS 변경 가능

- 일반적인 JDBC는 Database Pool 방식을 사용하지 않고 DB에서 정보를 가져올 때마다 매번 디비연결을 열고 닫음

- 따라서 매우 비효율적이기 때문에 상용 어플에서 JDBC 방식을 사용하는 경우는 거의 없다.

 

2. DBCP

* Database Connection Pool

 

* 특징

- Application을 시작할 때 원하는 만큼 커넥션 객체를 만들어놓고 pool에 넣어 놓은 채 필요할 때마다 가져다 쓰고 다시 반납하는 방식

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

- 보통 Database Connection Pool을 Application 소스단에 설정해놓은 방식

 

3. JNDI

* Java Naming and Directory Interface

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

 

* 특징

- DB커넥션을 WAS단에서 제어하면서 서버에서 하나의 커넥션 풀을 가짐 ( 공유객체를 사용한다고 이해하면 됨 )

- Application이 DB에 직접 Connection을 요청하는 것이 아니라 JNDI lookup을 통해 Datasource 객체를 획득하고 그것을 Connection 요청

- 장점 1 : DB 설정 정보를 파악하기 쉽다 > WAS단에 설정정보를 통해 디비가 몇 개 붙어있는지 정보를 파악하기 수월

- 장점 2 : DB 커넥션 풀을 효율적으로 사용 가능

 

* JDBC와의 차이점 ( 중요 )

- 하드코딩하지않아도 됨

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

반응형

댓글