DB 드라이버가 커넥션을 생성하는 과정

  1. 애플리케이션 로직은 DB 드라이버를 통해 커넥션을 조회
  2. DB 드라이버는 DB와 TCP/IP 커넥션을 연결
  3. DB드라이버는 TCP/IP 커넥션이 연결되면 ID, PW와 기타 정보를 DB에 전달
  4. DB는 DB 드라이버로부터 받은 정보를 통해 인증을 완료하고, 내부에 DB 세션 생성
  5. DB는 커넥션 생성이 완료되었다는 응답을 보냄
  6. DB 드라이버는 커넥션 객체를 생성하여 클라이언트에 반환

매번 새로운 커넥션을 생성하는 것의 문제점

  • 커넥션을 생성할 떄마다 DB 서버는 물론이고 애플리케이션 서버도 TCP/IP 연결을 위한 리소스를 사용
  • SQL 실행 시간에 더하여 커넥션 생성 시간이 추가되어 응답 속도에 악영향
  • 커넥션을 여러 개 미리 생성해두고 사용하는 방법으로 이러한 문제를 해결

Connection Pool

  • 커넥션 여러 개를 미리 생성해두고 클라이언트는 커넥션 사용 후 반납하는 방법
  • 애플리케이션 실행 시점에 커넥션 풀은 커넥션일 미리 확보하여 풀에 보관
    • 커넥션 풀에 있는 커넥션은 이미 DB와 TCP/IP로 연결되어 있는 상태이기 때문에 즉시 SQL 실행 가능
  • 애플리케이션 로직에서는 DB 드라이버를 통해 새로운 커넥션을 획득하는 것이 아니라 이미 생성된 커넥션을 커넥션 풀로부터 반환받아 사용
  • 커넥션 사용을 마치면 커넥션을 종료하는 것이 아니라 TCP/IP 연결이 유지된 상태로 커넥션 풀에 '반환'

커넥션을 얻는 여러가지 방법

  • DriverManager 또는 커넥션 풀을 통해 획득
  • 커넥션 획득 방법을 변경해야 할 때 애플리케이션 로직도 수정해야 함
  • 이를 위해 DataSource를 통해 커넥션 획득 방법을 추상화
    • 마치 JDBC를 통해 DB 접근 방법을 추상화한 것과 같은 맥락

DataSource

  • 커넥션 획득 방법을 추상화한 인터페이스
  • Java에서 제공
  • javax.sql.DataSource
public interface DataSource { 
    Connection getConnection() throws SQLException; 
}

JDBC와 DataSoruce의 차이

  • JDBC

    • 기본적인 데이터베이스 접근 방법을 추상화
    • 설정과 사용이 결합되어 있음
      • Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
  • DataSoruce

    • 데이터베이스 접근 방법 뿐만 아니라 커넥션을 획득하는 방법도 추상화함 (단일 커넥션 또는 커넥션 풀에서 획득)
    • 설정과 사용이 분리되어 있어 설정 변경 시 클라이언트 코드를 수정할 필요가 없음
      • dataSource.setJdbcUrl(URL);
      • Connection conn = dataSource.getConnection();

+ Recent posts