JdbcTemplate 객체


JDBC 프로그래밍은 아래와 같은 코드를 사용한다.

 

위의 구조적인 반복을 줄이기 위해 스프링은 템플릿 메서드 패턴전략 패턴을 엮은 JdbcTemplate 클래스를 제공한다.

JdbcTemplate 객체를 사용하면 DB 조회(SELECT)를 위한 위의 코드를 아래와 같이 수정할 수 있다.

List<Member> results = jdbcTemplate.query(
    "select * from MEMBER where EMAIL = ?",
    new RowMapper<Member>() {
        @Override
        public Member mapRow(ResultSet rs, int rowNum) throws SQLException {
           Member member = new Member(
               rs.getString("NAME"),
               rs.getString("EMAIL"));
           return member;
        }
    },
    email);
return results.isEmpty() ? null : results.get(0);

 

참고로, 위의 코드에서 익명 클래스 람다로 수정하면 더 짧아진다.

List<Member> results = jdbcTemplate.query(
    "select * from MEMBER where EMAIL = ?",
    (ResultSet rs, int rowNum) -> {
        Member member = new Member(
            rs.getString("NAME"),
            rs.getString("EMAIL"));
        return member;
    },
    email);
return results.isEmpty() ? null : results.get(0);

 

JdbcTemplate 클래스는 딱 2개만 알면된다.

  1. DB 조회(SELECT)를 위한 query() 메서드
  2. DB 삽입(INSERT), 수정(UPDATE), 삭제(DELETE)를 위한 update() 메서드
// query() 메서드는 가져온 결과 행 리스트를 리턴한다.
// 아래 메서드 외에도 다양한 파라미터를 지원하는 query() 메서드가 있다.
List<T> query(String sql, RowMapper<T> rowMapper)
List<T> query(String sql, RowMapper<T> rowMapper, Object... args)

// update() 메서드는 변경된 행의 개수를 리턴한다.
int update(String sql)
int update(String sql, Object... args)

 

query() 메서드는 sql 파라미터로 전달받은 쿼리를 실행하고 RowMapper를 이용해서 ResultSet의 결과를 Java 객체로 변환한다.

 

 

 

JdbcTemplate 객체 생성 주입을 위한 DataSource 인터페이스


JDBC API에서는 DB 연결을 위한 2가지 방법을 제공한다.

  1. DriverManager 객체를 이용한 방법
  2. DataSource 인터페이스를 이용한 방법 ( DataSource 구현체가 필요함 )

 

DriverManager 객체는 DB 연결 정보 + DB 연결 기능까지 다 만들어져있는 것이고,

DataSource 인터페이스DB 연결 기능은 구현체에 맡기는 방법이다. ( 유연함 )

 

DataSource 인터페이스의 구현체로는 Tomcat JDBC 라이브러리가 많이 사용된다.

( 참고로 Tomcat JDBC커넥션 풀을 위한 라이브러리다. )

 

여하튼, JdbcTemplate 객체를 생성하기 위해선 DataSource 객체를 주입해주면 된다.

import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;

public class MemberDao {
    
    private JdbcTemplate jdbcTemplate;
    
    public MemberDao(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }
}