웹/Spring

[Spring] Spring JDBC

킹형준 2025. 2. 8. 16:28

JDBC

JDBC는 Java 애플리케이션이 데이터베이스와 연결하고, 쿼리를 실행하며, 결과를 받아오는데 필요한 API이다. JPA, Hibernate, Spring Data 등의 더 높은 수준의 데이터베이스 접근 라이브러리를 사용하더라도 이들은 JDBC 위에서 동작한다. 즉 해당 라이브러리들도 결국은 JDBC를 사용해 DB와 연결하고 작업을 처리한다.

 

JDBC 기본 사용법

import java.sql.*;

public class JdbcExample {
    public static void main(String[] args) {
        // 데이터베이스 연결 정보
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";

        // 데이터베이스 연결 객체, 쿼리 실행 객체, 결과 객체
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            // 1. JDBC 드라이버 로드 (MySQL 예시)
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 2. 데이터베이스 연결
            connection = DriverManager.getConnection(url, username, password);

            // 3. SQL 쿼리 실행을 위한 Statement 객체 생성
            statement = connection.createStatement();

            // 4. 쿼리 실행 (SELECT 예시)
            String sql = "SELECT * FROM users";
            resultSet = statement.executeQuery(sql);

            // 5. 결과 처리
            while (resultSet.next()) {
                // 데이터베이스에서 각 컬럼 값 읽기
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                System.out.println("ID: " + id + ", Name: " + name);
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            // 6. 자원 해제
            try {
                if (resultSet != null) resultSet.close();
                if (statement != null) statement.close();
                if (connection != null) connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

 

JDBC를 사용할 때는 드라이버를 로드하고, Connection 객체를 사용하여 DBMS에 연결하고, Statement 객체를 사용해 파라미터를 변경하거나 쿼리를 실행하고 DB 연결과 관련된 자원을 전부 닫는 등 다른 쿼리를 실행하더라도 반복되는 작업이 계속 생기게 된다.

 

Spring JDBC의 JdbcTemplate 클래스

Spring JDBC는 JdbcTemplate을 사용하여 반복적인 JDBC 작업을 간소화하고, SQL Exception을 DataAccessException으로 바꾸어 DB 접근시 SQL 예외를 Spring 예외로 관리할 수 있는 장점이 있다. 또한 쿼리 결과를 Map, List 등의 컬렉션으로 바로 매핑할 수 있는 장점이 있다.

 

JdbcTemplate 클래스는 SQL을 실행하는 다양한 메소드를 제공한다. JdbcTemplate의 생성자는 DataSource 타입 객체를 파라미터로 받으며, DataSource에 DBMS와 연결을 위한 정보들이 담겨있다.

 

또한 JdbcTemplate 클래스가 DataSource 레퍼런스를 가지는 구조이므로 두 클래스를 Bean에 등록하여 JdbcTemplate에 DataSource 주입을 자동으로 Spring 컨테이너가 주입해주도록 할 수 있다.

 

@Configuration
public class AppConfig {

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mydatabase");
        dataSource.setUsername("root");
        dataSource.setPassword("password");
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

 

Bean으로 등록된 JdbcTemplate 객체를 사용할 때는 아래와 같이 사용하려는 객체에 의존성을 직접 주입해주면 된다.

@Service
public class MyService{
	
    private final JdbcTemplate jdbcTemplate;
    
    @Autowired
    public MyService(JdbcTemplate jdbcTemplate){
    	this.jdbcTemplate = jdbcTemplate;
    }
    
}

 

DataSource

DataSource 인터페이스는 JDBC에서 커넥션을 얻는 방법을 추상화한 것으로, DBMS에 커넥션을 얻는 구체적인 방법이 아닌 해당 인터페이스의 getConnection()에만 의존하도록 코드를 작성할 수 있다.

 

DataSource는 여러 구현체를 가진다.

 

1. DriverManagerDataSource

DriverManager를 사용하여 데이터베이스 연결을 생성한다. 이 때 DriverManager는 DBMS에 매번 새 연결을 직접 열고닫는 가장 기본적인 방법을 가진 클래스이다. DriverManagerDataSource는 Spring에서 제공하는 DataSource 구현체중 하나로, DriverManager를 사용하여 DBMS와의 연결을 생성한다.

 

2. BasicDataSource 

커넥션 풀을 관리해준다.

커넥션 풀이란 DBMS와 애플리케이션 사이의 커넥션을 매번 만들고 지우는 오버헤드를 줄이기 위해 미리 DBMS에서 커넥션을 여러 개 만들어두고 애플리케이션의 쿼리 실행 쓰레드를 해당 커넥션에 매핑시키기 위한 자료구조이다.

 

3. HikariDataSource

매우 빠르고 효율적인 커넥션 풀을 제공한다.

' > Spring' 카테고리의 다른 글

[Spring] @Autowired  (0) 2025.02.10
[Spring] 싱글톤 컨테이너  (0) 2025.02.10
[Spring] Spring Boot  (0) 2025.02.08
[Spring] Spring Bean  (0) 2025.02.08
[Spring] DI란?  (0) 2025.02.06