옛날에는 애플리케이션이 필요할 때마다 데이터베이스로부터 커넥션을 확보하고 로직을 처리한 뒤 커넥션을 종료했다. 이렇게 데이터베이스로부터 직접 연결을 확보할 때 사용하는 것이 DriverManager
이다.
애플리케이션과 데이터베이스의 연결을 확보하는 것은 리소스가 많이 드는 작업이기 때문에 DriverManager
처럼 사용자가 요청할 때마다 커넥션을 확보한다면 응답 시간이 느려질 수 있다. 커넥션을 미리 생성해둔 뒤 필요할 때 꺼내 사용하는 커넥션 풀링은 이러한 문제를 해결하기 위한 아이디어이다.
커넥션 풀은 애플리케이션 시작 시점에 여러 개의 커넥션을 생성해 둔다. 커넥션 풀의 모든 커넥션은 TCP/IP를 통해 DB와 연결되어있는 상태이기 때문에 SQL 쿼리를 곧바로 DB에 전달할 수 있다.
이제 애플리케이션 로직은 DB 드라이버를 통해 커넥션을 생성할 필요가 없다. 커넥션 풀에 이미 존재하는 커넥션을 참조 조회를 통해 가져오기만 하면 된다. 쿼리를 저리한 뒤 커넥션을 종료할 필요도 없다. 단순히 반환만 하면 된다.
DataSource
는 데이터베이스로부터 커넥션을 확보하는 방법을 추상화 한 인터페이스이다. 대부분의 커넥션 풀링 기술은 DataSource
인터페이스를 구현해놓았기 때문에 필요에 따라 다른 구현체로 쉽게 변경할 수 있다.
HikariCP
를 사용한다. SpringBoot 2.0 부터 기본 탑재될 정도로 검증된 커넥션 풀이므로 특별한 이유가 있지 않다면 그대로 사용하는 것이 좋다고 한다.단 DriverManager
는 DataSource
인터페이스를 따르지 않으므로 한 쪽에서 다른 한 쪽으로 변경하고 싶다면 애플리케이션 로직을 변경해야 한다.
스프링 부트는 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는 적용되지 않는다.