8.2 JDBC와 HikariCP 커넥션 풀
자바 애플리케이션이 외부 데이터베이스에 접근하려면 기본적으로 JDBC (Java Database Connectivity) 라는 자바 표준 API를 거치게 됩니다.
커넥션 풀(Connection Pool)의 이해
클라이언트가 서버에 API 요청을 보낼 때마다 데이터베이스에 새로 커넥션을 맺고 끊는 것은 시간과 리소스 측면에서 매우 무거운(Costly) 작업입니다.
이를 해결하기 위해 애플리케이션 로딩 시점에 미리 지정된 개수만큼의 DB 커넥션을 맺어두고 풀(Pool)에 보관해 두는 방식을 사용합니다.
- 요청이 들어오면 풀에서 커넥션을 하나 빌려주고,
- 쿼리 실행이 끝나면 다시 풀로 반납받습니다.
스프링 부트는 역사적으로 가장 빠르고 안정적인 커넥션 풀 오픈소스인 HikariCP 를 기본(Default)으로 채택하고 있습니다.
application.yml 설정
애플리케이션이 HikariCP를 통해 DB에 접속하려면 먼저 사용하는 DB의 Driver가 의존성(build.gradle)에 추가되어 있어야 합니다.
// MySQL
runtimeOnly 'com.mysql:mysql-connector-j'
// PostgreSQL
runtimeOnly 'org.postgresql:postgresql'
이제 src/main/resources/application.yml 파일에 접속 정보를 기입합니다.
spring:
datasource:
# JDBC URL 설정
url: jdbc:mysql://localhost:3306/mydb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
# HikariCP 추가 설정 (성능 최적화 필수 옵션)
hikari:
maximum-pool-size: 10 # 최대 커넥션 개수 (서비스 트래픽에 따라 조절)
minimum-idle: 10 # 최소 유휴 커넥션 유지 개수
connection-timeout: 30000 # 커넥션을 획득하기 위해 기다리는 최대 시간 (ms)
idle-timeout: 600000 # 커넥션이 풀에서 유휴(idle) 상태로 남아있을 수 있는 시간
max-lifetime: 1800000 # 커넥션의 최대 생명 주기
pool-name: MyHikariCP # 풀의 이름 (로그 확인용)
3. 환경별 데이터베이스 분리 (Profiles)
실무에서는 로컬(local), 개발(dev), 운영(prod) 서버의 DB 주소가 모두 다릅니다. 스프링의 프로파일(Profile) 기능을 사용하면 설정 파일을 분리할 수 있습니다.
- application-dev.yml: 개발 서버용 DB 설정
- application-prod.yml: 운영 서버용 DB 설정
실행 시점에 어떤 파일을 쓸지 결정합니다:
java -jar myapp.jar --spring.profiles.active=dev
4. 접속 확인 및 로그 체크
스프링 부트가 정상적으로 DB에 연결되었는지는 기동 시 로그를 통해 알 수 있습니다.
... o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http)
... com.zaxxer.hikari.HikariDataSource : MyHikariCP - Starting...
... com.zaxxer.hikari.HikariDataSource : MyHikariCP - Start completed.
... o.s.b.a.e.web.EndpointLinksResolver : Exposing 13 endpoint(s) beneath base path '/actuator'
만약 Starting... 이후에 에러가 발생한다면 URL, ID/PW, 또는 네트워크 방화벽 설정을 확인해야 합니다.
스프링 부트의 자동 설정(Auto Configuration) 덕분에 spring.datasource 하위의 프로퍼티값만 채워주면 내부적으로 DataSource 빈이 자동으로 생성됩니다. 별도의 자바 코드를 작성할 필요가 없다는 점이 스프링 부트의 강력한 장점입니다.