`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 프로젝트에서 매우 유용하게 쓰입니다.
'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 |