본문 바로가기

Spring

Spring - JDBC Template

`JdbcTemplate` 은 Spring에서 제공하는 데이터베이스 접근 도구로, JDBC 작업을 단순화하고 오류 처리를 일관되게 해줍니다. 기본적인 SQL 쿼리 실행, 데이터 조회, 업데이트 등을 간단하게 수행할 수 있으며, 커넥션 관리, 자원 해제 등의 작업을 자동으로 처리합니다.

 

1. JdbcTemplate의 주요 기능과 장점

  • 커넥션 및 리소스 관리 자동화: JdbcTemplate은 데이터베이스 연결을 자동으로 관리하고 SQL 실행 후 자원을 해제합니다.
  • 간결한 코드 작성: SQL 실행을 위한 복잡한 Connection, Statement, ResultSet 처리가 필요 없어집니다.
  • 일관된 예외 처리: SQL 예외를 Spring의 DataAccessException 계층으로 변환하여 일관성 있는 예외 처리가 가능합니다.
  • 객체 매핑 기능 지원: 쿼리 결과를 RowMapper나 BeanPropertyRowMapper 등을 사용하여 객체에 쉽게 매핑할 수 있습니다.

 

2. JdbcTemplate 사용법

`JdbcTemplate`을 사용하려면 Spring에서 `JdbcTemplate` 객체를 빈으로 정의하고, 데이터베이스와의 연결 정보를 설정해야 합니다. 주로 Spring Boot에서는 데이터베이스 설정만 추가하면 자동으로 `JdbcTemplate` 빈을 주입받을 수 있습니다.

 

예제 설정 및 기본 사용

1. 의존성 추가 (build.gradle)

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
}

 

2. JdbcTemplate 빈 주입 및 사용

@Autowired
private JdbcTemplate jdbcTemplate;

public int insertUser(String name, int age) {
    String sql = "INSERT INTO users (name, age) VALUES (?, ?)";
    return jdbcTemplate.update(sql, name, age);
}

public List<User> getAllUsers() {
    String sql = "SELECT * FROM users";
    return jdbcTemplate.query(sql, new UserRowMapper());
}

 

3. RowMapper와 ResultSetExtractor

JdbcTemplate에서 쿼리 결과를 객체로 변환하기 위해 `RowMapper`와 `ResultSetExtractor`를 사용합니다.

  • RowMapper: SQL 결과의 각 행을 객체로 매핑할 때 사용합니다. RowMapper는 주로 조회 쿼리에서 사용되며, 각 결과 행을 지정된 객체로 변환합니다.
  • ResultSetExtractor: RowMapper와 유사하지만, 보다 복잡한 결과 처리가 필요할 때 사용됩니다. 전체 ResultSet을 조작하여 변환을 수행할 수 있습니다.

RowMapper 예제

 

RowMapper 인터페이스를 사용하여, SQL 결과를 Java 객체로 매핑합니다. 예를 들어, User 객체에 매핑하는 RowMapper를 작성할 수 있습니다.

public class User {
    private int id;
    private String name;
    private int age;

    // Getters and setters
}

public class UserRowMapper implements RowMapper<User> {
    @Override
    public User mapRow(ResultSet rs, int rowNum) throws SQLException {
        User user = new User();
        user.setId(rs.getInt("id"));
        user.setName(rs.getString("name"));
        user.setAge(rs.getInt("age"));
        return user;
    }
}

 

위의 `UserRowMapper`는 SQL 쿼리로 반환된 `ResultSet`의 각 행을 `User` 객체로 변환합니다. 이후 `JdbcTemplate.query()` 메서드에서 이 `UserRowMapper`를 사용하여 SQL 결과를 `List<User>`로 반환할 수 있습니다.

 

JdbcTemplate와 RowMapper 사용 예제

public List<User> getUsersByAge(int age) {
    String sql = "SELECT * FROM users WHERE age = ?";
    return jdbcTemplate.query(sql, new UserRowMapper(), age);
}

 

위 메서드는 `age` 값으로 필터링된 `User` 객체 목록을 반환합니다.

 

4. BeanPropertyRowMapper

Spring은 BeanPropertyRowMapper라는 유틸리티 클래스를 제공하여, RowMapper 없이도 자동으로 필드 이름을 기준으로 매핑할 수 있습니다.

public List<User> getAllUsers() {
    String sql = "SELECT * FROM users";
    return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
}

 

`BeanPropertyRowMapper`는 SQL 결과의 컬럼 이름과 객체의 필드 이름이 동일하다면 자동으로 값을 매핑해줍니다. 하지만, 필드명과 컬럼명이 일치하지 않으면 오류가 발생할 수 있으므로 주의가 필요합니다.

 

5. queryForObject 메서드

`JdbcTemplate`의 `queryForObject` 메서드는 SQL 쿼리 결과가 한 행일 때 사용하며, 단일 객체를 반환합니다.

public User getUserById(int id) {
    String sql = "SELECT * FROM users WHERE id = ?";
    return jdbcTemplate.queryForObject(sql, new UserRowMapper(), id);
}

 

6. update 메서드

데이터를 수정하거나 삽입, 삭제할 때는 `update` 메서드를 사용합니다. 이 메서드는 실행 후 영향을 받은 행(row)의 수를 반환합니다.

public int updateUser(int id, String name, int age) {
    String sql = "UPDATE users SET name = ?, age = ? WHERE id = ?";
    return jdbcTemplate.update(sql, name, age, id);
}

public int deleteUser(int id) {
    String sql = "DELETE FROM users WHERE id = ?";
    return jdbcTemplate.update(sql, id);
}

 

7. JdbcTemplate와 RowMapper의 장점

  • 가독성 및 코드 간결화: JdbcTemplate은 SQL 실행에 필요한 기본 작업들을 추상화하여 코드 양을 줄이고 가독성을 높여줍니다.
  • 안정적인 자원 관리: 데이터베이스 연결 및 자원 해제 처리를 자동으로 해주기 때문에 리소스 누수 가능성이 줄어듭니다.
  • 객체 매핑 용이: RowMapper 또는 BeanPropertyRowMapper를 통해 SQL 결과를 쉽게 Java 객체로 매핑할 수 있습니다.

`JdbcTemplate`는 직접 JDBC를 사용하는 것보다 훨씬 간단하게 데이터베이스 작업을 수행할 수 있도록 도와주며, 특히 Spring 프로젝트에서 매우 유용하게 쓰입니다.

728x90
반응형

'Spring' 카테고리의 다른 글

Spring - QueryDSL  (1) 2024.11.15
Spring - Spring Security  (0) 2024.11.13
Spring - Database Driver  (1) 2024.11.09
Spring - H2 Database  (0) 2024.11.08
Spring - @Transactional  (1) 2024.11.05