[Spring] Datasource

DataSource
JDBC 커넥션 풀 또는 데이터베이스 연결 정보를 캡슐화한 인터페이스
쉽게 말해 커넥션 풀에 따라 DB 연결을 열고 닫고 관리해주는 객체
- 커넥션풀 관리
- 설정 한번으로 여러 DB 기술에 연동이 가능
DataSource 종류
| HikariCP (기본) | 빠르고 가볍고 안정적. Spring Boot 기본 |
| Tomcat JDBC | Tomcat에서 제공하는 커넥션 풀 |
| DBCP2 | Apache 커넥션 풀 (성능은 Hikari < DBCP2) |
| SimpleDriverDataSource | 테스트용. 풀링 없음 |
SpringBoot Application.yml 설정 예시
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: user
password: pass
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 10
minimum-idle: 2
위 설정을 읽어서 HikariDataSource가 자동 빈으로 등록되고,
JdbcTemplate이나 EntityManagerFactory에 주입됨.
소스코드로 Config 설정

이런식으로 HikairDatasource 에 대한 설정을 하여 DataSource에 넘겨주면 정보들을 토대로 커넥션풀을 관리하게 된다.
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class HikariExample {
public static void main(String[] args) {
// 1. 설정 객체 생성
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb"); // DB 주소
config.setUsername("user");
config.setPassword("pass");
config.setDriverClassName("com.mysql.cj.jdbc.Driver");
// 커넥션 풀 옵션 (예시)
config.setMaximumPoolSize(10);
config.setMinimumIdle(2);
config.setIdleTimeout(30000); // 30초
config.setConnectionTimeout(10000); // 10초
// 2. DataSource 생성
HikariDataSource dataSource = new HikariDataSource(config);
// 3. 커넥션 얻고 사용
try (Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT NOW()")) {
if (rs.next()) {
System.out.println("DB 시간: " + rs.getString(1));
}
} catch (Exception e) {
e.printStackTrace();
}
// 4. 자원 정리
dataSource.close(); // 꼭 닫아주기
}
}
중요한 것은 DataSource 인터페이스에서 getConnection() 메서드이다.
구현체들은 이 getConnection() 메서드를 구현해야 하는데
Datasource에서 실제 DB와 연결된 커넥션을 하나 빌려오는 행위라고 볼 수 있다.
내부적으로는 커넥션 풀에서 미리 생성된 커넥션을 꺼내줌 (매번 DB 연결 X)
close() 는 커넥션 종료가 아니라 반환하는 개념이다. --> 커넥션을 닫지 않으면 풀 자원 고갈되어 연결지연
정리
Datasource는 인터페이스 ! ---> DB 연결을 제공하는 표준 인터페이스일뿐 직접 커넥션 풀 핸들링x
getConnection() 메서드를 통해 DB 커넥션을 제공하는 계약만 정의
Datasource를 구현한 커넥션 풀 구현체
| HikariDataSource | ✅ HikariCP 커넥션 풀의 구현체 |
| BasicDataSource | Apache DBCP 구현체 |
| org.apache.tomcat.jdbc.pool.DataSource | Tomcat JDBC 풀 구현체 |
| SimpleDriverDataSource | 풀링 없이 직접 연결, 테스트용 |
JDBC Driver
DB 벤더(Oracle, MySQL 등)가 제공하는 JDBC 표준 구현체
DB 연결을 하려면 무조건 필요 (DB랑 직접 통신하는 라이브러리)
- 자바 프로그램이 DB랑 직접 통신하려면 JDBC라는 표준 인터페이스를 따라야 해.
- 이 JDBC 표준에 따라 DB 벤더(Oracle, MySQL, PostgreSQL 등) 가 만든 구현체가 JDBC 드라이버임.
- 쉽게 말해, 자바에서 SQL 날리면 그걸 DB가 이해할 수 있는 형태로 번역해서 DB에 보내는 역할을 함
Java Application
|
| JDBC API (Connection, Statement, etc.)
↓
JDBC Driver (MySQLDriver, OracleDriver 등)
↓
DB 벤더의 프로토콜로 변환 (TCP/IP, TDS, Oracle Net 등)
↓
소켓(Socket)으로 DB 서버에 연결
↓
DB Server
JdbcTemplate
JDBC 드라이버를 사용하는 코드를 훨씬 간단하고 안전하게 작성할 수 있게 도와주는 유틸 클래스이다.
Connection을 열고 닫는 작업와 예외처리(SQLException -> Spring예외로 전환) 등 작업들을 생략해줌
-일반 JDBC
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = dataSource.getConnection();
ps = conn.prepareStatement("SELECT * FROM users");
rs = ps.executeQuery();
while (rs.next()) {
// row 처리
}
} catch (SQLException e) {
// 예외 처리
} finally {
if (rs != null) rs.close();
if (ps != null) ps.close();
if (conn != null) conn.close();
}
- JdbcTemplate
List<User> users = jdbcTemplate.query(
"SELECT * FROM users",
(rs, rowNum) -> new User(rs.getLong("id"), rs.getString("name"))
);