Spring
[Spring] 스프링 데이터베이스(1) - 템플릿 클래스
재담
2022. 4. 17. 17:00
스프링 데이터베이스 연동
스프링은 JDBC를 이용한 DAO 클래스를 구현할 수 있도록 다양한 기능을 지원하고 있는데, 그 내용은 다음과 같다.
- 템플릿 클래스를 통한 데이터 접근 지원
- 의미 있는 익셉션 타입
- 트랜잭션 처리
데이터베이스 연동을 위한 템플릿 클래스
데이터에 접근하는 코드는 거의 동일한 코드 구성을 갖는다. 예를 들어, JDBC를 사용할 경우 특정 테이블에서 데이터를 로딩하는 코드는 다음과 같은 구조를 갖는다.
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = getConnection();
pstmt = conn.prepareStatement("select * from message where guestBookId = ?");
pstmt.setInt(1, guestBookId);
rs = pstmt.executeQuery();
if (rs.next()) {
do {
Message message = new Message();
message.setContent(rs.getString("content"));
// 이하 생략
...
} while(rs.next());
}
} catch (SQLException ex) {
// 알맞은 익셉션 처리
} finally {
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
}
위 코드에서 Connection을 생성하고, PreparedStatement, ResultSet, Connection 등의 자원을 반환하는 코드는 거의 모든 JDBC 코드에서 중복되는 코드이다. PreparedStatement를 구하고 ResultSet으로부터 데이터를 읽어와 바바빈 객체에 저장하는 코드 역시 동일한 구성을 갖는다.
템플릿 메서드 패턴과 전략 패턴을 함께 사용하면 이런 구조적인 중복을 줄일 수 있는데, 스프링은 이 2가지 패턴이 적용된 JDBC 템플릿 클래스를 제공하고 있다. 다음 코드는 그 예이다.
List<Message> messages = jdbcTemplate.query(
"select * from guestmessage order by id desc limit ?, ?",
new Object[] {start, size}, new RowMapper<Message>() {
@Override
public Message mapRow(ResultSet rs, int rowNum) throws SQLException {
Message m = new Message();
m.setId(rs.getInt("id"));
// 이하 생략
...
return m;
}
});
자바 8부터 지원되는 람다 표현식을 사용하면 좀 더 간결하게 표현할 수 있다.
List<Message> messages = jdbcTemplate.query(
"select * from guestmessage order by id desc limit ?, ?",
new Object[] {start, size},
(rs, rowNum) -> {
Message m = new Message();
m.setId(rs.getInt("id"));
// 이하 생략
...
return m;
}
});
Reference
- 웹 개발자를 위한 Spring 4.0 프로그래밍 (최범균 저)