Home Spring DB - 커넥션풀과 데이터소스 이해
Post
Cancel

Spring DB - 커넥션풀과 데이터소스 이해

커넥션 풀 이해

데이터데이스 커넥션을 획득할 떄는 복잡한 과정을 걸치게 됨

Alt text

  • 어펄리케이션 로직은 DB 드라이버를 통해 커넥션 조회
  • DB 드라이버는 DB와 TCP/IP 커넥션 연결
  • DB 드라이버는 TCP/IP 커넥션이 연결되면 ID, PW와 기타 부가정보를 DB에 전달
  • DB는 ID, PW를 통해 내부 인증을 완료하고 내부에 DB 세션을 생성
  • DB는 커넥션 생성이 완료되었다는 응답 전송
  • DB 드라이버는 커넥션 객체를 생성하여 클라이언트에 반환

이러한 커넥션을 새로 만드는 과정은 복잡하며 시간 및 리소스를 많이 소모하는 일임. 이러한 문제를 해결하기 위해 매번 커넥션을 요청하는것이 아닌 미리 커넥션을 생성해두고 사용하는 커넥션 풀이라는 방법

커넥션 풀 초기화

Alt text 어플리케이션을 시작하는 시점에 커넥션 풀은 필요한 만큼 커넥션을 미리 확보하여 풀에 보관

  • 보통 얼마나 보관할 지는 서비스의 특징과 서버 스펙에 따라 다르지만 기본값은 보통 10개
커넥션 풀의 연결 상태

Alt text 커넥션 풀에 들어있는 커넥션은 TCP/IP로 DB와 커넥션이 연결되어 있는 상태이기 때문에 언제든지 즉시 SQL을 DB에 전달 가능

커넥션 풀 사용

Alt text 어플리케이션 로직에서 DB 드라이버를 통해 새로운 커넥션을 획득하는 것이 아닌 커넥션 풀을 통해 이미 생성된 커넥션을 객체 참조로 사용

Alt text 어플리케이션 로직은 커넥션 풀에서 받은 커넥션을 사용하여 SQL을 데이터베이스에 전달하고 결과를 받아 처리. 이후 커넥션을 모두 사용했다면 커넥션을 종료하는 것이 아닌 그대로 커넥션 풀에 반환하여 커넥션이 살아있는 상태로 커넥션 풀에 유지시켜야 함

정리

  • 적절한 커넥션 풀 숫자는 서비스의 특징과 어플리케이션 서버스펙, DB 서버 스펙에 따라 다르기 때문에 성능 테스트를 통해 적절한 커넥션 풀 숫자를 찾아야 함
  • 커넥션 풀은 서버당 최대 커넥션을 제한 할 수도 있기 때문에 무한정 DB에 연결이 생성되는것을 막아줌
  • 실무에서는 항상 기본으로 사용됨

DataSource 이해

데이터베이스 커넥션은 얻는 방법은 JDBC DriverManager를 직접 사용하거나 커넥션 풀을 사용하는등 여러 방법이 존재함

Alt text

그러나 만약 DriverManager를 통해 직접 커넥션을 획득하다가 커넥션 풀로 방법을 바꾸게 된다면 의존관계가 DriverManager에서 커넥션 풀로 바뀌었기 떄문에 커넥션을 획득하는 어플리케이션 코드를 모두 수정해주어야 함

Alt text

이러한 문제를 해결하기 위해 자바는 javax.sql.DataSource 라는 추상화 인터페이스를 제공함 Alt text

  • DataSource는 커넥션을 획득하는 방법을 추상화 하는 인터페이스
  • 해당 인터페이스의 핵심 기능은 커넥션 조회
1
2
3
4
5
public interface DataSource {
  Connection getConnection() throws SQLException;

  ...
}

대부분의 커넥션 풀은 DataSource 인터페이스를 이미 구현해두었기 떄문에 개발자는 DataSource 인터페이스에만 의존하도록 어플리케이션 로직을 작성하면 됨. 즉, 자바는 DataSource를 통해 커넥션을 획득하는 방법을 추상화하여 구현체만 변경하면 되도록 했기 떄문에 DriverManager를 사용하다 다른 커넥션 풀로 변경하더라도 코드를 재사용 할 수 있음

정리

  • DB 연결시 매번 새로운 연결을 하지 않도록 되도록이면 커넥션 풀을 하용하여 커넥션을 유지하도록 함
  • 추상화인 DataSource를 사용하여 구현체를 DriverManagerDataSource(매번 커넥션 형성)를 사용하든 HikariDataSource(커넥션 풀)을 사용하든 코드를 변경하지 않도록 해야함
    • DB 커넥션을 위한 설정과 실제 커넥션을 사용하는 코드를 분리할 수 있음
    • DataSource의 인터페이스에만 의존하도록 하여 구현체를 수정하더라도 코드의 수정이 필요 없음(DI + OOP)

참고

  • 스프링 DB - 데이터 접근 핵심 원리(김영한)
This post is licensed under CC BY 4.0 by the author.