서론
순수한 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
'CS > 데이터베이스' 카테고리의 다른 글
[DB] 예외 의존성 해결 - 예외 전환, 스프링의 예외 추상화 (0) | 2023.10.17 |
---|---|
[DB] 트랜잭션 매니저, 트랜잭션 템플릿, @Transactional (0) | 2023.10.08 |
[DB] 트랜잭션 이해 (0) | 2023.10.08 |
[DB] 커넥션풀과 데이터소스 이해 (0) | 2023.10.07 |
[DB] JDBC 이해 (0) | 2023.10.07 |