공부하기/Spring

[Spring] JDBC 이해하기

다섯자두 2025. 1. 24. 14:44

JDBC란?

JDBC (Java DataBase Connectivity)

Java 표준 API로 , SQL 쿼리를 실행하고 결과를 가져오는 등의 데이터베이스 관련 작업을 수행하도록 하는 인터페이스와 클래스들의 집합

Java를 사용하여 DB와 상호작용하기 위해 가장 오래 & 널리 사용된 Java의 표준 API이다.

JDBC만 사용하여 데이터베이스와 상호작용하는 것은 가능하지만, 다음과 같은 문제점이 생긴다.

  1. 예외처리가 번거롭다. SQLException 예외 처리를 위해 Try-Catch 블록을 여러 곳에 작성해야 한다.
  2. Connection, Statement, ResultSet 객체를 사용한 뒤 반드시 close() 메서드를 호출하여야 한다. 이처럼 자원 누수를 방지하기 위해 많은 자원 관리 코드를 작성해야 한다.
  3. 쿼리 작성의 반복성. SQL쿼리를 직접 작성해야 하기 때문에 같은 유형의 SQL 쿼리나 DB 작업을 여러번 수행할 경우 반복적인 코드가 많아진다.

Spring JDBC란?

Spring JDBC는 JDBC 작업을 더 쉽게 도와준다.

JDBC 작업을 추상화한 계층을 제공하여 기본적인 JDBC 템플릿을 통해 반복적인 코드나 예외 처리, 자원 관리와 같은 기본 작업들을 대신 처리해준다.
  • `JdbcTemplate`클래스를 기반으로 다양한 클래스들을 제공한다.


Spring JDBC 주요 클래스

JdbcTemplate

central & lowest-level 클래스로, 다른 데이터베이스 접근 클래스들은 모두 JdbcTemplate을 내부적으로 사용한다.

Connection 생성과 종료, statement 생성과 실행과 같은 기본적인 JDBC 작업들을 수행한다.

  • SQL 쿼리를 실행한다. 결과를 ResultSet 형태로 받아온다. (ex. query() 메서드) 
  • UPDATE, INSERT, DELETE와 같은 DML문을 실행한다. (ex. update() 메서드)
  • 저장 프로시저를 호출한다. (ex. call() 메서드)
  • ResultSet을 순회하면서 쿼리 결과를 처리하는 작업을 할 수 있다. (ex. RowMapper 인터페이스 사용)
private final RowMapper<Actor> actorRowMapper = (resultSet, rowNum) -> {
	Actor actor = new Actor();
	actor.setFirstName(resultSet.getString("first_name"));
	actor.setLastName(resultSet.getString("last_name"));
	return actor;
};

public List<Actor> findAllActors() {
	return this.jdbcTemplate.query("select first_name, last_name from t_actor", actorRowMapper);
}
  • SQLException과 같은 JDBC 예외를 처리하고 더 구체적인 Spring Exception으로 변환한다.

(+) 유사하지만 파라미터에 `?` 대신 이름을 정해 삽입할 수 있는 기능을 제공하는 클래스로 `NamedParameterJdbcTemplate`이 존재한다.

사용 방법

@Repository
public class JdbcTemplateTodoRepository implements TodoRepository {
    private final JdbcTemplate jdbcTemplate;

    public JdbcTemplateTodoRepository(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }
    
    // 기타 메서드 ...
}
  • JdbcTemplate을 사용하는 클래스에 `@Repository` 어노테이션을 단다.
    • Srping 빈으로 등록된다.
    • 의존성 주입을 위한 컴포넌트 스캔 대상이 된다.
  • JdbcTemplate을 생성할 때, `DataSource`를 주입받도록 한다. (생성자 파라미터로 명시 / 혹은 @Autowired)
    • Spring Boot는 `applicaiton.properties` 또는 `application.yml`에 데이터베이스 관련 설정이 존재하면 해당 설정을 기반으로 DataSource 빈을 자동 생성한다.
    • 수동으로 생성하고싶을 경우, `@Configuration` 클래스에서 `@Bean`을 사용하여 직접 정의할 수 있다.

* 기타 내용은 공부 후 차후 추가 예정