728x90
이전 포스팅 에서 사용한 Repository 클래스에는 코드가 복잡합니다. 특히나 JDBC를 사용하고 있는데 아래와 같이 동일한 코드가 반복되어 사용되고 있습니다.
- 커넥션 조회 및 커넥션 동기화
- PreparedStatement 생성 및 파라미터 바인딩
- 쿼리 실행
- 결과 바인딩
- 예외 발생시 스프링 예외 변환기 실행
- 리소스 종료
스프링은 이런 반복 문제를 해결하기 위해 JdbcTemplate 이라는 템플릿을 제공합니다. 이 템플릿을 사용하여 코드를 수정하면 아래와 같이 깔끔하게 작성할 수 있습니다.
package hello.jdbc.repository.Account;
import hello.jdbc.domain.Account;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
@Slf4j
@AllArgsConstructor
public class AccountRepository implements AccountRepository {
private final JdbcTemplate template;
@Override
public Account save(Account account) {
String sql = "insert into account(account_id, money) value(?,?)";
template.update(sql, account.getAccountId(), account.getMoney());
return account;
}
@Override
public Account findById(String accountId) {
String sql = "select * from account where account_id = ?";
return template.queryForObject(sql, accountRowMapper(), accountId);
}
@Override
public void update(String accountId, int money) {
String sql = "update account set money=? where account_id = ?";
template.update(sql, money, accountId);
}
@Override
public void delete(String accountId) {
String sql = "delete from account where account_id=?";
template.update(sql, accountId);
}
private RowMapper<Account> accountRowMapper() {
return (rs, rowNum) ->
new Account(rs.getString("account_id"), rs.getInt("money"));
}
}
AccountRepository 인터페이스
package hello.jdbc.repository.Account;
import hello.jdbc.domain.Account;
public interface AccountRepository {
Account save(Account account);
Account findById(String accountId);
void update(String accountId, int money);
void delete(String accountId);
}
JdbcTemplate 은 JDBC로 개발할 때 발생하는 반복을 대부분 해결해줍니다. 그 뿐만 아니라 트랜 잭션을 위한 커넥션 동기화는 물론이고, 예외 발생시 스프링 예외 변환기도 자동으로 실행해주는 편리함을 제공합니다.
728x90
반응형
'Spring Boot' 카테고리의 다른 글
Spring AOP 란? (0) | 2024.09.23 |
---|---|
AOP 적용 방식 (0) | 2024.09.23 |
[DB] Spring 의 트랜잭션 추상화 (트랜잭션 매니저) (0) | 2024.08.04 |
[DB] 트랜잭션(Transaction) 이란? (0) | 2024.08.03 |
[DB] JDBC 실습 (구현 및 테스트) (0) | 2024.08.03 |