Spring

[Spring] Datasource

개바리여리 2025. 6. 29. 18:56

 

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"))
);