티스토리 뷰

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;
}

 

 

 

 

차이점

  1. 결과의 타입:
    • queryForObject(): 하나의 값 또는 객체를 반환한다.
    • query(): 여러 행을 조회하므로 결과를 리스트나 배열과 같은 컬렉션으로 반환한다.
  2. 행의 개수:
    • queryForObject(): 딱 한 행만을 기대하며, 그 이상의 행이 반환되면 예외가 발생한다.
    • query(): 여러 행을 반환할 수 있다.
  3. 사용 예시:
    • 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)을 객체로 변환해주는 인터페이스이다.

이 인터페이스를 사용하는 이유는 아래와 같다.

 

 

  1. 객체 매핑:
    • ResultSet은 행과 열의 집합이기 때문에, 그 자체로는 자바 객체로의 변환이 쉽지 않다.
    • RowMapper를 사용하면 각 행의 데이터를 원하는 형태의 자바 객체로 변환할 수 있다.
    • 각 행을 객체로 매핑함으로써 코드 가독성이 향상되고, 객체 지향적인 설계를 할 수 있다.
  2. 재사용성:
    • RowMapper는 인터페이스로서, 여러 조회 쿼리에서 재사용할 수 있다.
    • 동일한 데이터베이스 테이블을 조회하는 여러 쿼리가 있다면, 하나의 RowMapper를 작성하여 공통된 매핑 로직을 재사용할 수 있다.
  3. 유지보수성:
    • 데이터베이스 스키마가 변경되는 경우, 매핑 로직은 RowMapper에서만 수정하면 된다.
    • 만약 객체 매핑을 직접하는 로직이 여러 곳에 중복되어 있다면, 변경이 번거로울 수 있다.
  4. 편의성:
    • RowMapper를 사용하면 객체 매핑을 좀 더 간편하게 할 수 있습니다.
    • ResultSet의 각 열을 객체의 필드에 매핑하는 로직을 RowMapper에서 한 곳에서 관리할 수 있다.
  5. 자동화된 매핑:
    • 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;
    }
}
 
 
 
 
위와 같이 작성된 RowMapperResultSet의 각 행을 User 객체로 변환해준다.
객체 매핑의 세부사항은 RowMapper 내부에서 관리되므로, 클라이언트 코드에서는 매우 간단하게 결과를 객체로 얻을 수 있다.
 
 
 
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday