본문 바로가기
CS/데이터베이스

[JDBC] JdbcTemplate 간단히 알아보기

by 2245 2023. 10. 17.

서론

순수한 JDBC를 사용하다보면, 다음과 같이 반복되는 코드가 굉장히 많습니다.

public void update(String memberId, int money) {
    String sql = "update member set money=? where member_id=?";

    Connection con = null;
    PreparedStatement pstmt = null;

    try {
        con = getConnection();
        pstmt = con.prepareStatement(sql);
        pstmt.setInt(1, money);
        pstmt.setString(2, memberId);
        pstmt.executeUpdate();
    } catch (SQLException e) {
        throw exTranslator.translate("update", sql, e);
    } finally {
        close(con, pstmt, null);
    }
}

...

private void close(Connection con, Statement stmt, ResultSet rs) {
    JdbcUtils.closeResultSet(rs);
    JdbcUtils.closeStatement(stmt);
    DataSourceUtils.releaseConnection(con, dataSource);
}

private Connection getConnection() throws SQLException {
    Connection con = DataSourceUtils.getConnection(dataSource);
    log.info("get connection={}, class={}", con, con.getClass());
    return con;
}

JDBC 반복 문제

  • 커넥션 조회, 커넥션 동기화 
  • PreparedStatement 생성 및 파라미터 바인딩
  • 쿼리 실행
  • 결과 바인딩
  • 예외 발생 시 스프링 예외 변환기 실행
  • 리소스 종료

 

이렇게 반복되는 부분들을 효과적으로 처리하는 방법이 바로 템플릿 콜백 패턴입니다.

스프링은 JDBC의 반복 문제를 해결하기 위해 JdbcTemplate 이라는 템플릿을 제공합니다.

자세한 사용법보단 전체 구조와 이 기능을 사용하여 반복코드를 제거할 수 있다는 점에 초점을 맞춰보도록 해봅시다.

 

 

 

실습

MemberRepositoryV5

package hello.jdbc.repository;

..

/**
 * JdbcTemplate 사용
 */
public class MemberRepositoryV5 implements MemberRepository {
    
    private final JdbcTemplate template;
    
    public MemberRepositoryV5(DataSource dataSource) {
        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;
    }

    @Override
    public Member findById(String memberId) {
        String sql = "select * from member where member_id = ?";
        return template.queryForObject(sql, memberRowMapper(), memberId);
    }

    @Override
    public void update(String memberId, int money) {
        String sql = "update member set money=? where member_id=?";
        template.update(sql, money, memberId);
    }

    @Override
    public void delete(String memberId) {
        String sql = "delete from member where member_id=?";
        template.update(sql, memberId);
    }
    
    private RowMapper<Member> memberRowMapper() {
        return (rs, rowNum) -> {
            Member member = new Member();
            member.setMemberId(rs.getString("member_id"));
            member.setMoney(rs.getInt("money"));
            return member;
        };
    }
}

 

 

정리

  • JdbcTemplate은 JDBC로 개발할 때 발생하는 반복을 대부분 해결해줍시다.
  • 이전 글에서 작성했던 트랜잭션을 위한 커넥션 동기화는 물론이고, 예외 발생 시 스프링 예외 변환기도 자동으로 실행합니다.

 


출처

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1/dashboard

 

스프링 DB 1편 - 데이터 접근 핵심 원리 - 인프런 | 강의

백엔드 개발에 필요한 DB 데이터 접근 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 DB 접근 기술의 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 백엔

www.inflearn.com