Programming Language/Java

[Java] JDBC, DBCP, JNDI 이해하기

장쫄깃 2022. 6. 18. 20:08
728x90


Connection과 Connection Pool


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

 

보통 Connection 하나당 트랜잭션 하나를 관리한다.

트랜잭션은 하나 이상의 쿼리에서 동일한 Connection 객체를 공유하는 것을 의미한다.

 

Connection Pool이란 클라이언트의 요청 시점에 Connection을 연결하는 것이 아니라 미리 일정수의 Connection을 만들어놓고 필요한 어플리케이션에 전달하여 이용하는 방법이다. JDBC Framework에서 close가 이루어지면 Connection을 Connection Pool에 반납하게 된다.

 

Connection Pool의 Connection 객체 각각을 직접 어플리케이션에서 이용하면 체계적인 관리가 힘들다. Connection 과정은 부담되는 작업이며, 불필요한 연결에 의해 서버 자원의 낭비가 발생할 수 있기 때문이다. 그래서 Connection 객체를 로직이 실행될 때마다 생성하는 것이 아니라 어플리케이션이 서비스되기 전에 서버에서 미리 생성하여 준비한 다음, 필요할 때 준비된 Connection을 가져다 사용함으로써 JDBC 프로그래밍 문제점들을 개선할 수 있다.

 

 

Datasource


javax.sql.DataSource라는 인터페이스는 Connection Pool을 관리하는 목적으로 사용되는 객체이다. Appliction에서는 이 Datasource 인터페이스를 통해서 Connection을 얻어오고 반납하는 등의 작업을 구현해야 한다. 즉, Connection pool을 어플리케이션단에서 어떻게 관리할지를 구현하는 인터페이스라고 할 수 있다.

 

 

JDBC 란


JDBCJava DataBase Connectivity의 약자이며, 데이터베이스를 조작하는 표준 SQL 인터페이스 API이다.

 

  • 인터페이스 기반 구축 (데이터베이스 커넥션 인터페이스)
  • 이론적으로 각 DBMS에 맞는 JDBC를 받아주게 되면 쉽게 DBMS를 변경 가능

 

일반적으로 JDBC는 Database Pool 방식을 사용하지 않고 DB에서 정보를 가져올 때마다 매번 디비 Connection을 열고 닫는다. 따라서 매우 비효율적이기 때문에 상용 어플에서 JDBC 방식을 사용하는 경우는 거의 없다.

 

 

DBCP 란


DBCPDataBase Connection Pool의 약자이며, JDBC 방식보다는 일반적인 경우 사용한다.

 

  • 어플리케이션을 시작할 때 원하는 만큼 Connection 객체를 만들어 Pool에 넣어놓은 채 필요할 때마다 가져다 쓰고 다시 반납하는 방식
  • 다중스레드를 스레드풀로 관리하는 방식과 비슷
  • 보통 Database Connection Pool을 Application 소스단에 설정해놓는 방식

 

 

JNDI 란


JNDI는 Java Naming and Directory Interface의 약자이며, WAS단에 DB Connection 자체를 미리 네이밍해두는 방식이다.

 

  • DB Connection을 WAS단에서 제어하면서 서버에서 하나의 Connection Pool을 가짐 (공유객체를 사용)
  • Application이 DB에 직접 Connection을 요청하는 것이 아니라 JNDI lookup을 통해 Datasource 객체를 획득하고 그것을 Connection 요청
  • 장점1 : DB 설정 정보를 파악하기 쉽다
    • WAS단에 설정정보를 통해 DB가 몇 개 붙어있는지 파악하기 수월하다.
  • 장점2 : DB Connection Pool을 효율적으로 사용할 수 있다.
    • WAS단에서 DB Pool을 하나로 관리하면 static 객체를 생성 후에 쉽게 가져다 쓸 수 있기 때문에 효율이 좋아진다.

 

JDBC와의 차이점

 - 하드코딩하지 않아도 된다.

 - JNDI는 재활용을 하기 위한 코드로, 부하가 발생하지 않게 하기 위해서는 JNDI가 효율적이다.

 

 

Spring Boot 같은 경우는 Embedded Tomcat을 사용하기 때문에 어플리케이션을 실행시키면 내장 WAS가 기동 전 Connection 객체를 미리 Pool에 생성해서 사용하게 된다.

 

728x90