이 글을 쓰게 된 이유는 JDBCTemplate에서 MySql을 사용하며 RowMapper()를 쓰는데 자꾸 헷갈려서 쓰게 됐음.
JdbcTemplate의 RowMapper는 SQL 쿼리 결과인 ResultSet을 자바(일반적으로 엔티티 객체)로 변환하는 역할을 한다.
JdbcTemplate를 사용하여 데이터를 조회할 때 SQL 쿼리를 실행하고, 그 결과를 자바 객체로 변환하는 과정에서 중요한 부분이 바로 RowMapper이다.
1. RowMapper란?
RowMapper는 ResultSet의 각 행을 자바 객체로 변환하는 인터페이스이다.
RowMapper의 작동방식은
- SQL 쿼리 결과를 행 단위로 반환.
- RowMapper는 ResultSet의 한 행을 자바 객체로 매핑하는 역할을 한다.
그럼 RowMapper 인터페이스는 mapRow(ResultSet rs, int rowNum) 메서드를 구현해야 함.
이 메서드는 ResultSet의 한 행을 받아서 해당 데이터를 자바 객체로 변환한다.
2. RowMapper의 사용 흐름
- SQL 쿼리 실행 : JdbcTemplate.query() 또는 JdbcTemplate.queryForObject() 메서드를 호출하면, SQL 쿼리가 실행
- RowMapper 호출 : 쿼리 결과의 각 행을 RowMapper가 처리하여 자바 객체로 변환된다.
- 자바 객체 변환 : 변환된 자바 객체(또는 엔티티)는 JdbcTemplate으로 반환된다.
3. RowMapper를 이용한 매핑 예시
1. 데이터베이스 테이블 구조
| 컬럼 | 타입 |
| id | INT |
| name | VARCHAR |
| age | INT |
2. Student 엔티티 클래스
@Getter
@AllArgsConstructor
public class Student {
private Long id;
private String name;
private int age;
}
3. JdbcTemplate를 사용한 RowMapper 적용
JdbcTemplate를 사용하여 Student 객체를 조회하는 메서드 작성
public List<Student> findAllStudents() {
String sql = "SELECT id, name, age FROM student";
// JdbcTemplate의 query 메서드에서 SQL 쿼리와 RowMapper를 넘겨줌
List<Student> students = jdbcTemplate.query(sql, studentRowMapper()); // 결과를 Student 객체로 매핑하여 반환
return students
}
- 위 코드에서는 SELECT id, name, age FROM student SQL 쿼리를 실행하여 student 테이블의 모든 데이터를 조회한다. 그 후, JdbcTemplate.query() 메서드는 각 결과 행을 RowMapper를 통해 Student 객체로 변환하여 리스트로 반환한다.
4. RowMapper 구현
RowMapper를 사용해서 Student 객체로 매핑하는 방법
private RowMapper<Student> studentRowMapper() {
return new RowMapper<Student>() {
@Override
public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
// ResultSet에서 데이터를 읽어 Student 객체로 변환
Long id = rs.getLong("id"); // 'id' 컬럼 값을 읽어옴
String name = rs.getString("name"); // 'name' 컬럼 값을 읽어옴
int age = rs.getInt("age"); // 'age' 컬럼 값을 읽어옴
// 읽은 데이터를 가지고 새로운 Student 객체를 생성
return new Student(id, name, age);
}
};
}
- ResultSet에서 id, name, age 값을 읽고
- 엔티티 객체로 변환
- Student 객체는 id, name, age를 받아 생성
1. RowMapper와 SQL 쿼리의 관계
- SQL 쿼리에서 반환하는 데이터는 ResultSet에 저장된다. RowMapper는 이 ResultSet에서 각 열(컬럼)을 읽어와 자바 객체의 필드에 맞게 매핑한다.
- SQL 쿼리에서 JOIN을 사용하여 여러 테이블을 결합할 경우, RowMapper는 각 테이블의 컬럼을 별도로 매핑하여 엔티티 객체에 포함.
2. RowMapper와 엔티티 관계
RowMapper는 SQL 쿼리 결과를 엔티티로 변환하는 역할을 하므로, RowMapper와 엔티티 클래스는 밀접한 관계가 있음.
- 엔티티 클래스는 데이터베이스 테이블의 구조를 자바 객체로 표현하는 클래스. 즉, 테이블의 각 컬럼을 객체의 필드로 매핑.
- RowMapper는 ResultSet에서 데이터를 읽어, 이를 엔티티의 필드에 맞게 변환하는 역할. 즉 SQL 쿼리 결과와 엔티티 간의 중개자 역할을 함.
'Back-End > DataBase' 카테고리의 다른 글
| SQL로 복잡한 쿼리 실습하기 (0) | 2025.01.15 |
|---|---|
| SQL로 요리하듯 데이터 다루기 (0) | 2025.01.15 |
| 커넥션 풀과 데이터소스 (0) | 2024.12.06 |
| JDBC - CRUD (0) | 2024.12.06 |
| SQL 기초 3 (Join) (1) | 2024.11.08 |