문제점
기존에 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 |
댓글