이전 글에서 자바 언어로 DB에 CRUD 를 수행하는 프로그램 작성하기를 살펴보았다. 스프링을 사용하면 DataSource, Connection, Statement, ResultSet 을 직접 사용하지 않고 JdbcTemplate 을 이용해서 편리하게 쿼리를 실행할 수 있다. DataSource를 직접 사용한 코드와 JdbcTemplate을 이용한 코드를 비교해보자.

 

다음 코드는 DataSource를 직접 사용한 JDBC 프로그래밍 코드이다.

package spring;

...

public class MemberDao {

    private DataSource dataSource;

    public MemberDao(DataSource dataSource) {
        this.dataSource = dataSource;
    }
    
    public int count() {
        Connection connection = null;
        try {
            connection = dataSource.getConnection();
            try (
                Statement stmt = connection.createStatement());
                ResultSet resultSet = stmt.executeQuery(
                    "select count(*) from MEMBER")
            ) {
                resultSet.next();
                return resultSet.getInt(1);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            if (connection != null) {
                try { connection.close(); }
                catch (SQLException e) {}
            }
        }
    }
}

 

이번에는 JavaTemplate을 이용한 코드를 보자.

다음 코드는 앞서 등장한 MemberDao 에 스프링에서 제공하는 JdbcTemplate 을 적용한 것이다.

package spring;

...

public class MemberDao {

    private JdbcTemplate jdbcTemplate;

    public MemberDao(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }
    
    public int count() {
        Integer count = jdbcTemplate.queryForObject(
            "select count(*) from MEMBER", Integer.class);
        return count;
    }
}

 

count() 함수를 보면, jdbcTemplate 을 사용했을 때 코드가 훨씬 깔끔해졌음을 알 수 있다.

이처럼 JdbcTemplate 을 사용하면 DataSource를 직접 사용하는 대신, JdbcTemplate 에게 DataSource를 주입해주고 JdbcTemplate 을 통해서 사용하게 된다.

그럼으로써 DataSource를 직접 사용할 때 써야만 했던 많은 코드들(이를테면 dataSource.getConnection(), resultSet.next(), stmt.close(), connection.close() 등등)이 JdbcTemplate의 몫으로 넘어간다.

이를 통해 count() 는 [Member 의 수를 구한다]는 본연의 역할에 충실하게 되었다.

 

+ Recent posts