본문 바로가기

Spring Boot

[DB] JDBC Template 사용하기

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