RowMapper는 스프링 JDBC에서 제공하는 인터페이스로, SQL 결과(ResultSet)를 Java 객체로 매핑하는 데 사용됩니다. 데이터베이스의 결과를 특정 자바 객체로 변환하기 위해 사용되며, SELECT 쿼리의 결과를 처리하는 데 주로 활용됩니다.RowMapper의 역할BeanPropertyRowMapper를 활용하고, 복잡한 매핑은 RowMapper를 직접 구현합니다.RowMapper 인터페이스 구조RowMapper는 단일 메서드로 구성되어 있습니다.
public interface RowMapper<T> {
T mapRow(ResultSet rs, int rowNum) throws SQLException;
}
mapRow(ResultSet rs, int rowNum):ResultSet 객체의 현재 행을 읽고, 이를 변환하여 Java 객체를 반환합니다.rs: 쿼리 결과를 나타내는 ResultSet.rowNum: 결과 집합 내에서 현재 행의 번호(0부터 시작).T).데이터베이스의 users 테이블과 매핑할 클래스입니다.
@Getter
@Setter
public class User {
private int id;
private String name;
private String email;
User 객체로 결과를 매핑하기 위한 RowMapper를 직접 구현합니다.
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
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.setEmail(rs.getString("email"));
return user;
}
}
ResultSet에서 데이터베이스 컬럼 값을 읽고, User 객체에 설정합니다.JdbcTemplate의 query 메서드에서 RowMapper를 사용하여 데이터를 객체로 변환합니다.
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class UserRepository {
private final JdbcTemplate jdbcTemplate;
public UserRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public List<User> findAllUsers() {
String sql = "SELECT id, name, email FROM users";
return jdbcTemplate.query(sql, new UserRowMapper());
}
public User findUserById(int id) {
String sql = "SELECT id, name, email FROM users WHERE id = ?";
return jdbcTemplate.queryForObject(sql, new UserRowMapper(), id);
}
}
query:queryForObject:BeanPropertyRowMapper는 스프링 JDBC에서 제공하는 RowMapper의 구현체로, SQL 결과(ResultSet)를 지정한 클래스의 객체로 자동 매핑해주는 유용한 도구입니다. 클래스의 속성 이름과 데이터베이스 컬럼 이름이 일치할 경우, 이를 자동으로 매핑하여 객체를 생성합니다.ResultSet)를 클래스의 필드 이름과 매칭하여 객체로 변환합니다.다음과 같은 users 테이블을 가정합니다.
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100)
);
데이터베이스의 users 테이블과 매핑할 클래스는 다음과 같이 작성합니다.
@Getter
@Setter
public class User {
private int id;
private String name;
private String email;
BeanPropertyRowMapper 사용import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class UserRepository {
private final JdbcTemplate jdbcTemplate;
public UserRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public List<User> findAllUsers() {
String sql = "SELECT id, name, email FROM users";
return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
}
public User findUserById(int id) {
String sql = "SELECT id, name, email FROM users WHERE id = ?";
return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), id);
}
}
new BeanPropertyRowMapper<>(User.class): SQL 결과를 User 객체로 자동 매핑합니다.query: 여러 개의 결과를 리스트로 반환합니다.queryForObject: 단일 결과를 객체로 반환합니다.snake_case일 경우, camelCase 필드로 자동 변환하여 매핑합니다.user_email → 클래스 필드 userEmail.setter 메서드가 있어야 합니다.DataAccessException).RowMapper를 직접 구현할 필요가 없습니다.snake_case 형식이어도 클래스 필드가 camelCase 형식이라면 자동으로 매핑됩니다.SQL 쿼리에서 컬럼 이름에 별칭을 지정하여 필드 이름과 일치시키는 방법입니다.
public User findUserById(int id) {
String sql = "SELECT id AS id, name AS name, email AS email_address FROM users WHERE id = ?";
return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), id);
}
email 컬럼 이름을 email_address로 변경하여 클래스 필드와 매칭합니다.RowMapper와 BeanPropertyRowMapper 비교| 특징 | RowMapper | BeanPropertyRowMapper |
|---|---|---|
| 매핑 방식 | 개발자가 매핑 로직을 직접 작성 | Reflection을 통해 필드와 컬럼 이름 자동 매핑 |
| 유연성 | 복잡한 매핑 로직에 적합 | 단순 매핑 로직에 적합 |
| 컬럼-필드 이름 일치 여부 | 불필요 (직접 매핑) | 컬럼 이름과 필드 이름이 일치해야 함 |
| 성능 | Reflection이 없으므로 더 빠름 | Reflection 사용으로 약간 느림 |
| 코드 간결성 | 다소 코드가 길어질 수 있음 | 코드가 더 간결 |