[JDBC] DataSource 개념 및 설정

dondonee·2024년 3월 27일
0

DataSource 개념 및 설정

DataSource 개념

DriverManager

옛날에는 애플리케이션이 필요할 때마다 데이터베이스로부터 커넥션을 확보하고 로직을 처리한 뒤 커넥션을 종료했다. 이렇게 데이터베이스로부터 직접 연결을 확보할 때 사용하는 것이 DriverManager이다.

  • 참고) 위 이미지의 DB 드라이버는 JDBC 드라이버를 말한다. JDBC는 자바 애플리케이션과 데이터베이스의 연동을 표준화한 API이고, 각 벤더들은 자신의 데이터베이스의 맞게 이 JDBC를 구현화한 JDBC 드라이버를 제공한다. 이로써 개발자들은 데이터베이스마다 사용법을 익힐 필요 없이 JDBC 드라이버를 사용함으로써 자바 애플리케이션과 데이터베이스를 편리하게 연동할 수 있다. ( 🔗 관련 포스팅: JDBC의 이해 )

커넥션 풀링

애플리케이션과 데이터베이스의 연결을 확보하는 것은 리소스가 많이 드는 작업이기 때문에 DriverManager처럼 사용자가 요청할 때마다 커넥션을 확보한다면 응답 시간이 느려질 수 있다. 커넥션을 미리 생성해둔 뒤 필요할 때 꺼내 사용하는 커넥션 풀링은 이러한 문제를 해결하기 위한 아이디어이다.

커넥션 풀은 애플리케이션 시작 시점에 여러 개의 커넥션을 생성해 둔다. 커넥션 풀의 모든 커넥션은 TCP/IP를 통해 DB와 연결되어있는 상태이기 때문에 SQL 쿼리를 곧바로 DB에 전달할 수 있다.

이제 애플리케이션 로직은 DB 드라이버를 통해 커넥션을 생성할 필요가 없다. 커넥션 풀에 이미 존재하는 커넥션을 참조 조회를 통해 가져오기만 하면 된다. 쿼리를 저리한 뒤 커넥션을 종료할 필요도 없다. 단순히 반환만 하면 된다.


DataSource와 커넥션 풀링

DataSource는 데이터베이스로부터 커넥션을 확보하는 방법을 추상화 한 인터페이스이다. 대부분의 커넥션 풀링 기술은 DataSource 인터페이스를 구현해놓았기 때문에 필요에 따라 다른 구현체로 쉽게 변경할 수 있다.

  • 현재는 대부분 HikariCP를 사용한다. SpringBoot 2.0 부터 기본 탑재될 정도로 검증된 커넥션 풀이므로 특별한 이유가 있지 않다면 그대로 사용하는 것이 좋다고 한다.

DriverManagerDataSource 인터페이스를 따르지 않으므로 한 쪽에서 다른 한 쪽으로 변경하고 싶다면 애플리케이션 로직을 변경해야 한다.



DataSource 설정

SpringBoot

스프링 부트는 AutoConfigure(자동 설정) 기능을 제공하기 때문에 기본적인 설정은 appliction.yml 파일 작성만으로 간단히 DataSource를 등록할 수 있다.


spring:
  datasource:
    url: "jdbc:mysql://localhost/test"
    username: "dbuser"
    password: "dbpass"

스프링 부트는 JDBC URL을 통해 드라이버를 자동으로 인식한다. HikariCP를 사용한다면 커넥션 풀 prefix를 생략해도 된다. 스프링 부트가 사용할 커넥션 풀을 탐색할 때 우선적으로 HikariCP를 찾기 때문이다.

  • spring-boot-starter-jdbc 또는 spring-boot-starter-data-jpa를 사용하면 자동적으로 HikariCP 의존성이 추가된다.
  • 스프링 부트의 커넥션 풀 탐색 알고리즘을 건너뛰고 직접 선택하고 싶다면 spring.datasource.type 속성을 설정한다.

spring:
  datasource:
    tomcat:
      max-wait: 10000
      max-active: 50
      test-on-borrow: true

물론 위와 같이 커넥션 풀을 명시적으로 선택하여 세부 조정도 가능하다.


추가적인 DataSource를 설정하고 싶다면 수동으로 DataSourceBuilder를 사용한다. 단 직접 DataSource를 정의하는 경우 AutoConfigure는 적용되지 않는다.




🔗 References

0개의 댓글