본문 바로가기
Spring/Spring DB

문제해결 - JDBC 반복

by YellowCow 2025. 7. 28.

문제점

기존에 JDBC를 통해 쿼리를 요청할 경우

예외변환 및 커넥션 관리 로직이 비즈니스 로직에 누수되는 문제가 있다.

public class MemeberRepositoryImpl implements MemberRepository {

    private final DataSource dataSource;
    private final SQLExceptionTranslator exTranslator;

    public MemberRepositoryImpl(DataSource dataSource) {
        this.dataSource = dataSource;
        this.exTranslator = new SQLErrorCodeSQLExceptionTranslator(dataSource);
    }

    @Override
    public Member save(Member member) {
        String sql = "INSERT INTO member (member_id, money) VALUES (?, ?)";

        Connection connection = null;
        PreparedStatement preparedStatement = null;

        try {
            connection = getConnection();
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, member.getMemberId());
            preparedStatement.setInt(2, member.getMoney());
            preparedStatement.executeUpdate();
            return member;
        } catch (SQLException e) {
            throw exTranslator.translate("save", sql, e); // 예외변환로직 누수
        } finally {
            close(connection, preparedStatement, null ); // 커넥션 관리로직 누수
        }

    }

    ...

    private void close(Connection connection, Statement statement, ResultSet resultSet) {
        JdbcUtils.closeResultSet(resultSet);
        JdbcUtils.closeStatement(statement);
        // 트랜잭션 동기화를 사용하려면 DataSourceUtils를 사용해야 한다
        DataSourceUtils.releaseConnection(connection, dataSource);
    }

    private Connection getConnection() {
        // 트랜잭션 동기화를 사용하려면 DataSourceUtils를 사용해야 한다
        Connection connection = DataSourceUtils.getConnection(dataSource);
        log.info("get connection = {}, class = {}", connection, connection.getClass());
        return connection;
    }

}

 

 

문제해결

스프링에서는 이러한 문제를 해결하기 위해 JDBC Template이라는 기술을 제공한다.

JDBC Template을 사용하면 JDBC Template 내부에서 예외변환 및 커넥션 관리까지 자동으로 해준다.

 

아래는 사용예이다

public class MemberRepositoryImpl implements MemberRepository {

    private final JdbcTemplate template;

    public MemberRepositoryImpl(DataSource dataSource) {
        this.template = new JdbcTemplate(dataSource);
    }

    @Override
    public Member save(Member member) {
        String sql = "INSERT INTO member (member_id, money) VALUES (?, ?)";

        template.update(sql, member.getMemberId(), member.getMoney());

        return member;
    }

    ...
}

위 코드에서 보는 것처럼 JDBC Template 적용 후, 소스코드가 엄청 간결해진 것을 볼 수 있다

기존에 소스코드에 누수되었던 예외변환 및 커넥션 관리 로직이 보이지 않는다.

이처럼, JDBC Template을 적용하면 Repository에서 반복되는 코드를 줄일 수 있다.

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

문제해결 - 예외처리  (0) 2025.07.28
자바 예외(Exception)  (3) 2025.07.21
문제해결 - 트랜잭션 동기화 문제  (1) 2025.07.19
문제해결 - 트랜잭션 처리 코드 반복 문제  (0) 2025.07.19
DB Lock  (0) 2025.07.18

댓글