티스토리 뷰

Spring

[Spring] JDBC Template

토랑 2025. 2. 20. 15:34

개요

  • JDBC TemplateSpring Framework에서 제공하는 데이터베이스 연동 유틸리티로, JDBC의 반복 코드를 크게 줄여주고 자원 관리 및 예외 처리를 내부적으로 처리
  • SQL 실행, 결과 매핑, 트랜잭션 통합 등 다양한 기능을 제공하여 개발자가 비즈니스 로직에 집중할 수 있도록 도와줌
  • 데이터 소스와 커넥션 풀, 예외 전환, 배치 처리 등과도 유기적으로 연동되어, 실무에서 성능과 안정성을 동시에 고려할 수 있음


주요 특징과 활용

핵심 기능

1. 반복 코드 제거

  • SQL 실행, 리소스 해제, 예외 전환 등 JDBC의 반복적인 코드를 추상화하여 코드의 간결성과 유지보수성을 높임

2. SQL 실행 및 업데이트

  • 단순한 쿼리 실행뿐 아니라, 업데이트, 삭제, 삽입 작업을 손쉽게 수행할 수 있음

3. 결과 매핑 (RowMapper 활용)

  • RowMapper 인터페이스를 통해 ResultSet의 각 행을 도메인 객체로 매핑할 수 있어, 커스텀 매핑 로직을 쉽게 구현할 수 있음

부가 기능 및 확장성

예외 전환

  • 내부적으로 SQLException을 Spring의 DataAccessException 계층의 런타임 예외로 전환하여, 일관된 예외 처리를 가능하게 함

트랜잭션 통합

  • Spring의 트랜잭션 관리와 자연스럽게 연동되어, JdbcTemplate을 사용하는 모든 작업이 트랜잭션 경계 내에서 안전하게 실행

배치 처리 지원

  • 대량 데이터를 효율적으로 처리하기 위한 배치 작업 기능을 제공하며, 배치 크기 및 트랜잭션 경계를 설정할 수 있음

데이터 소스와 커넥션 풀

  • 외부 커넥션 풀 라이브러리와 연동되어, 데이터베이스 연결 관리를 최적화할 수 있음

콜백 인터페이스 활용

  • PreparedStatementCreator, ResultSetExtractor 등의 콜백 인터페이스를 사용하여, 복잡한 SQL 실행 로직이나 결과 처리 로직을 유연하게 구현할 수 있음

예시 코드

1. JdbcTemplate을 사용한 데이터 조회 및 업데이트

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserDao {
    private JdbcTemplate jdbcTemplate;

    // 생성자를 통해 JdbcTemplate 주입
    public UserDao(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    // ID로 사용자 조회 (단일 객체 반환)
    public User getUserById(int id) {
        String sql = "SELECT * FROM users WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, new RowMapper<User>() {
            @Override
            public User mapRow(ResultSet rs, int rowNum) throws SQLException {
                User user = new User();
                user.setId(rs.getInt("id"));
                user.setName(rs.getString("name"));
                user.setEmail(rs.getString("email"));
                return user;
            }
        });
    }

    // 사용자 추가 (영향 받은 행의 수 반환)
    public int insertUser(User user) {
        String sql = "INSERT INTO users(name, email) VALUES(?, ?)";
        return jdbcTemplate.update(sql, user.getName(), user.getEmail());
    }
}

2. RowMapper를 이용한 커스텀 매핑 예시

import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserRowMapper implements RowMapper<User> {
    @Override
    public User mapRow(ResultSet rs, int rowNum) throws SQLException {
        User user = new User();
        user.setId(rs.getInt("id"));
        user.setName(rs.getString("name"));
        user.setEmail(rs.getString("email"));
        return user;
    }
}
UserRowMapper를 별도로 구현하면, 여러 DAO 메서드에서 재사용 가능해 코드의 일관성과 재사용성을 높일 수 있음

JDBC Template의 상세 활용

내부 동작 및 리소스 관리

자동 자원 해제

  • Connection, Statement, ResultSet 등의 자원을 자동으로 해제하여, 개발자가 try-catch-finally 블록을 작성할 필요가 없음

예외 전환

  • SQLException을 DataAccessException으로 전환하여, 체크 예외 대신 런타임 예외로 처리할 수 있어 예외 처리가 간편해짐

트랜잭션 관리와 배치 처리

트랜잭션 연동

  • Spring의 선언적 트랜잭션 관리와 결합되어, JdbcTemplate을 통한 모든 데이터 작업이 트랜잭션 경계 내에서 안전하게 수행

배치 처리

  • 배치 업데이트나 대량 데이터 처리 시 배치 작업을 활용하여 성능 최적화를 도모할 수 있으며, 배치 크기 조절 및 롤백 전략을 설정할 수 있음

커스터마이징 및 확장성

콜백 메서드 활용

  • PreparedStatementCreator, ResultSetExtractor 등의 콜백 인터페이스를 활용하면, 복잡한 SQL 처리 로직이나 대용량 데이터 처리에 유연하게 대처할 수 있음

데이터 소스 연동

  • 외부 커넥션 풀(like HikariCP, DBCP)과 연동되어, 안정적인 데이터베이스 연결 관리를 지원

면접 대비 질문

더보기

기본 질문

Q1. JDBC Template이란 무엇이며, 주요 장점은 무엇인가요?

모범 답안
JDBC Template은 Spring Framework에서 제공하는 유틸리티 클래스로, JDBC 관련 반복 코드를 줄이고 자원 관리 및 예외 처리를 자동으로 수행합니다. 이를 통해 SQL 실행, 결과 매핑, 트랜잭션 통합 등의 작업을 간편하게 처리할 수 있어 개발 생산성과 유지보수성을 높여줍니다.


Q2. JdbcTemplate이 내부적으로 처리하는 주요 작업은 무엇인가요?

모범 답안
JdbcTemplate은 Connection 획득, Statement 및 ResultSet 생성, SQL 실행, 자원 해제, 그리고 SQLException을 DataAccessException으로 전환하는 작업을 내부적으로 처리합니다. 이러한 작업을 추상화함으로써 개발자가 핵심 비즈니스 로직에 집중할 수 있도록 도와줍니다.


심화 질문

Q1. RowMapper의 역할은 무엇이며, JdbcTemplate과 어떻게 연동되나요?

모범 답안
RowMapper는 SQL 쿼리 결과(ResultSet)를 도메인 객체로 매핑하는 인터페이스입니다. JdbcTemplate의 query 메서드에 RowMapper를 전달하면, 각 행을 도메인 객체로 변환하여 리스트 또는 단일 객체로 반환받을 수 있어, 복잡한 매핑 로직을 간결하게 구현할 수 있습니다.


Q2. JdbcTemplate 사용 시 예외 전환이 어떻게 이루어지며, 그 장점은 무엇인가요?

모범 답안
JdbcTemplate은 JDBC 작업 중 발생하는 SQLException을 Spring의 DataAccessException 계층의 런타임 예외로 전환합니다. 이를 통해 체크 예외를 처리할 필요가 없어 코드가 간결해지고, 일관된 예외 처리 전략을 수립할 수 있으며, 트랜잭션 관리와의 통합도 원활해집니다.


압박 질문

Q1. JdbcTemplate을 사용하여 대량의 데이터를 배치 처리할 때 고려해야 할 사항은 무엇인가요?

모범 답안
대량 데이터를 배치 처리할 때는 배치 크기를 적절히 조절하여 메모리 사용량을 최적화하고, 배치 처리 중 발생하는 예외에 대해 롤백 전략을 명확하게 설정해야 합니다. 또한, 배치 작업 시 데이터 정합성 유지와 트랜잭션 경계를 신중하게 관리하는 것이 중요합니다.


Q2. JdbcTemplate과 ORM 프레임워크(Hibernate 등)를 비교할 때 각각의 장단점과 사용 시점을 어떻게 판단해야 하나요?

모범 답안
JDBC Template은 SQL을 직접 작성하고 세밀하게 제어할 수 있어 단순 쿼리나 성능 튜닝이 필요한 경우에 적합합니다. 반면, ORM 프레임워크는 객체와 데이터베이스 간의 매핑을 자동화하여 개발 생산성을 높여주지만, 복잡한 쿼리나 특정 상황에서는 성능 이슈가 발생할 수 있습니다. 따라서, 데이터 작업이 단순하고 SQL 제어가 중요한 경우는 JdbcTemplate을, 복잡한 도메인 모델을 다루거나 빠른 개발 속도가 중요한 경우에는 ORM을 선택하는 것이 바람직합니다.


Q3. JdbcTemplate을 활용할 때 데이터 소스와 커넥션 풀의 역할은 무엇이며, 이를 어떻게 구성하나요?

모범 답안
JdbcTemplate은 외부 데이터 소스와 커넥션 풀(HikariCP, DBCP 등)과 연동되어, 안정적인 데이터베이스 연결 관리 및 성능 최적화를 도모합니다. 데이터 소스 설정 파일이나 Spring의 Java Config를 통해 커넥션 풀을 구성하고, JdbcTemplate에 주입하여 사용하면, 연결 재사용과 자원 관리를 효과적으로 수행할 수 있습니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함