본문 바로가기

Tech/Spring | SpringBoot

[SpringBoot] Database 연동 - 3 (JdbcTemplate)

반응형

1. JdbcTemplate

Spring 에는 Database 사용할 있는 방법으로 JdbcTemplate 있다.

순수 JDBC 에서는 DB Connection 얻고 해제하는 등의 DB 작업을 위해 반복되는 코드들이 있다. JdbcTemplate 은 이러한 반복 코드들을 제거할 수 있도록 되어서 사용에 편리하고 자원을 얻고 해제하는 등의 코드를 작성하면서 발생할 있는 문제들을 피할 있도록 해준다. 물론 SQL 쿼리문은 직접 작성하여야 한다.

 

JdbcTemplate 은 사용할 때 설정은 앞서 JDBC 를 사용하기 위해서 했던 Spring Datasource 등의 설정과 동일하게 수행하면 된다.

2. 구현

JdbcTemplate 으로 구현 시에는 기존의 JDBC 와는 다르게 Connection 이나 ResultSet 등을 사용하지 않는다. 다만 JdbcTemplate 메서드들을 사용하여 쿼리를 실행하여 DB 작업을 수행한다.

 

대신에 구현한 코드를 보면 RowMapper 를 구현해서 사용한다. 이는 쿼리문의 결과를 출력할 때, 결과로 나오는 ResultSet 을 어떻게 객체로 변환할지를 정의해놓은 것이라고 이해하면 된다. 각 ResultSet 의 Row 하나하나에 대하여 RowMapper 에 정의한 내용을 수행하며 객체로 변환한다.

 

public class JdbcTemplateUserRepository implements UserRepository {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    @Override
    public void saveUser(User user) {
        String sql = String.format("INSERT INTO %s VALUES (?, ?)", TABLE);
        try {
            jdbcTemplate.update(sql, user.getId(), user.getName());
        } catch (Exception e) {
            throw new IllegalStateException(e);
        }
    }
    
    @Override
    public List<User> findAllUsers() {
        String sql = String.format("SELECT * FROM %s", TABLE);
        List<User> users = new ArrayList<>();
        try {
            users = jdbcTemplate.query(sql, userRowMapper());
        } catch(Exception e) {
            throw new IllegalStateException(e);
        }
        return users;
    }
   
    @Override
    public User findById(String id) {
        String sql = String.format("SELECT * FROM %s WHERE ID=%s", TABLE, id);
        User user = null;
        try {
            user = jdbcTemplate.queryForObject(sql, userRowMapper());
        } catch(Exception e) {
            throw new IllegalStateException(e);
        }
        return user;
    }
    
    @Override
    public void updateUser(User user) {
        String sql = String.format("UPDATE %s SET NAME=? WHERE ID=?", TABLE);
        try {
            jdbcTemplate.update(sql, user.getName(), user.getId());
        } catch(Exception e) {
            throw new IllegalStateException(e);
        }
    }
    
    @Override
    public void removeUser(String id) {
        String sql = String.format("DELETE FROM %s WHERE ID=?", TABLE);
        try {
            jdbcTemplate.update(sql, id);
        } catch(Exception e) {
            throw new IllegalStateException(e);
        }
    }
    
    private RowMapper<User> userRowMapper() {
        return (rs, rowNum) -> {
            User user = new User(rs.getString("id"), rs.getString("name"));
            return user;
        };
    }
}

- JdbcTemplate methods

JdbcTemplate 의 메서드들 중에서 위의 예제에서 사용한 몇가지 메서드들을 설명하고자 한다.

 

메서드 이름 메서드 설명
update() SQL 연산을 통해서 DB 를 갱신할 때 사용한다. (INSERT, UPDATE, DELETE)
queryForObject() SELECT 문을 사용하여 조회를 하는데, 이 때 하나의 객체를 결과값으로 출력할 때 사용하는 메서드이다.
RowMapper 콜백을 사용하여 결과값의 매핑을 정의해주어야 한다.
query() queryForObject() 가 하나의 결과값을 위한 메서드라면, query() 는 다수의 결과를 위한 메서드이다.
List 타입으로 여러 개의 Row 를 포함한 결과를 반환한다.

[Reference]

 

[spring] DB를 사용하는 주요 기술 5가지

Spring을 이용하여 DB를 사용하는 주요 접근 기술을 학습하고 정리한 내용입니다.

velog.io

 

[Spring] JdbcTemplate 사용법 - update(), queryForInt(), queryForObject(), query()

💡 update() JdbcTemplate는 DAO객체에서 DB와 연동하기 위해 SQL 연산들을 수행 할 수 있도록 도와주는 기술인데, update()는 SQL 연산을 통해 데이터베이스를 갱신시켜줄 때(INSERT, DELETE, UPDATE) 사용하는..

withseungryu.tistory.com

 

반응형