티스토리 뷰
queryForObject() 메서드와 query() 메서드
'JdbcTemplate' 클래스는 Spring에서 JDBC(Java Database Connectivity)를 쉽게 사용할 수 있도록 지원하는 클래스이다. 이 클래스를 사용하여 SQL 쿼리를 실행하고 결과를 가져올 수 있다.
queryForObject() 및 query() 메서드는 JdbcTemplate에서 제공하는 메서드 중 일부이다.
1. queryForObject() 메서드
queryForObject() 메서드는 단일 행의 결과를 조회할 때 사용된다.
결과 집합이 한 행만 반환되어야 한다. 일반적으로 RowMapper 또는 ResultSetExtractor와 함께 사용되어 단일 객체나 값으로 결과를 매핑한다.
ex)
public String getUsernameById(int userId) {
String SQL = "SELECT username FROM users WHERE id = ?";
return jdbcTemplate.queryForObject(SQL, new Object[]{userId}, String.class);
}
2. query() 메서드
query() 메서드는 여러 행의 결과를 조회할 때 사용된다.
여러 행을 조회하기 때문에 RowMapper를 사용하여 각 행을 객체로 매핑하거나, ResultSetExtractor를 사용하여 결과 집합을 처리할 수 있다.
ex)
public List<User> getAllUsers() {
String SQL = "SELECT * FROM users";
return jdbcTemplate.query(SQL, new UserRowMapper());
}
@Override
public List<LessonReview> readAllReviewList(String lessonId) {
String SQL = "SELECT * FROM l_review WHERE lessonid=?";
List<LessonReview> listOfReviews = template.query(SQL, new Object[] {lessonId}, new LessonReviewRowMapper());
return listOfReviews;
}
차이점
- 결과의 타입:
- queryForObject(): 하나의 값 또는 객체를 반환한다.
- query(): 여러 행을 조회하므로 결과를 리스트나 배열과 같은 컬렉션으로 반환한다.
- 행의 개수:
- queryForObject(): 딱 한 행만을 기대하며, 그 이상의 행이 반환되면 예외가 발생한다.
- query(): 여러 행을 반환할 수 있다.
- 사용 예시:
- queryForObject(): 주로 단일 값을 조회할 때 사용합니다. 예를 들어, 특정 조건에 해당하는 결과가 하나의 값을 갖는 경우에 사용된다.
- query(): 여러 행을 조회하여 리스트 형태로 결과를 가져와야 할 때 사용된다.
ex)
// queryForObject() 사용 예시
String username = jdbcTemplate.queryForObject("SELECT username FROM users WHERE id = ?", new Object[]{userId}, String.class);
// query() 사용 예시
List<User> userList = jdbcTemplate.query("SELECT * FROM users", new UserRowMapper());
RowMapper 인터페이스를 사용하면 query() 메서드에서 각 행을 객체로 변환하는 방법을 정의할 수 있다.
* RowMapper
'RowMapper'는 JDBC에서 조회한 ResultSet의 각 행(row)을 객체로 변환해주는 인터페이스이다.
이 인터페이스를 사용하는 이유는 아래와 같다.
- 객체 매핑:
- ResultSet은 행과 열의 집합이기 때문에, 그 자체로는 자바 객체로의 변환이 쉽지 않다.
- RowMapper를 사용하면 각 행의 데이터를 원하는 형태의 자바 객체로 변환할 수 있다.
- 각 행을 객체로 매핑함으로써 코드 가독성이 향상되고, 객체 지향적인 설계를 할 수 있다.
- 재사용성:
- RowMapper는 인터페이스로서, 여러 조회 쿼리에서 재사용할 수 있다.
- 동일한 데이터베이스 테이블을 조회하는 여러 쿼리가 있다면, 하나의 RowMapper를 작성하여 공통된 매핑 로직을 재사용할 수 있다.
- 유지보수성:
- 데이터베이스 스키마가 변경되는 경우, 매핑 로직은 RowMapper에서만 수정하면 된다.
- 만약 객체 매핑을 직접하는 로직이 여러 곳에 중복되어 있다면, 변경이 번거로울 수 있다.
- 편의성:
- RowMapper를 사용하면 객체 매핑을 좀 더 간편하게 할 수 있습니다.
- ResultSet의 각 열을 객체의 필드에 매핑하는 로직을 RowMapper에서 한 곳에서 관리할 수 있다.
- 자동화된 매핑:
- Spring JDBC Template과 같은 프레임워크에서는 RowMapper를 사용하여 자동으로 결과를 매핑해주는 기능을 제공한다.
- 사용자는 RowMapper를 구현하거나 람다 표현식을 사용하여 간단하게 매핑 로직을 정의할 수 있다.
ex)
public class UserRowMapper implements RowMapper<User> {
@Override
public User mapRow(ResultSet resultSet, int rowNum) throws SQLException {
User user = new User();
user.setId(resultSet.getLong("id"));
user.setUsername(resultSet.getString("username"));
user.setEmail(resultSet.getString("email"));
// ... other fields
return user;
}
}
위와 같이 작성된 RowMapper는 ResultSet의 각 행을 User 객체로 변환해준다.
객체 매핑의 세부사항은 RowMapper 내부에서 관리되므로, 클라이언트 코드에서는 매우 간단하게 결과를 객체로 얻을 수 있다.
'코딩 > spring' 카테고리의 다른 글
[20주 5일차] 경기 매칭하기 (0) | 2024.02.23 |
---|---|
[20주 3일차] 하나의 컨트롤러에서 여러 Service 클래스 참조하기 (0) | 2024.02.21 |
[20주 2일차] 프로젝트 - 강의 리뷰 관리 (0) | 2024.02.20 |
[20주 1일차] 프로젝트 - 경기관리 (1) | 2024.02.19 |
[19주 5일차] 프로젝트 - 병원관리(CRUD) (0) | 2024.02.16 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday