BACKEND/스프링 Spring

[spring3.0] RowMapper 에 대해서

꾸준히개발하자 2022. 3. 29. 22:41

queryForObject 의 반환형은 데이터형만 가능하다.

하지만 말이 안되는게 있다

 

select * from user 구문으로 user 객체 자체를 반환받는건 포기해야 되나 ?

그걸 위해서 필요한 것이 바로 RowMapper 인터페이스이다.

 

 

1. RowMapper 란?

원하는 형태의 결과값을 반환할 수 있다.

SELECT로 나온 여러개의 값을 반환할 수 있을 뿐만 아니라 사용자가 원하는 형태로도 얼마든지 받을 수 있다.

즉 다음과 같이 가능하다는 것이다.

// UserMapper로 인해, User 형태로 반환 가능
List<User> userList = jdbcTemplate.queryForObject(
        "SELECT * FROM USER WHERE id=?",
        UserMapper,
        1000L);

 

2. 과거로 

우리가 순수 JDBC를 배울땐 이런 고민을 하지 않았는데

왜일까

그 이유는 우린 결과값을 ResultSet으로 반환 받았기 때문이다.

 

// 쿼리 날리기
ResultSet rs = stat.excuteQuery("SELECT * FROM USER");

// 결과값 가져오기
while(rs.next()) {
     // user 객체에 값 저장
     user = new User();
     user.setId(rs.getInt(1));
     user.setName(rs.getString(2));
     user.setDescription(rs.getString(3));
     
     // 리스트에 추가
     userList.add(user);
}

아무런 생각없이 사용했지만 사실

 

ResultSet으로 먼저 값을 받고

그다음 User 객체에 담아서 

반환하였다

 

이 3계단를 거쳤던 것이다.

그렇기 때문에 아무 고민없이 결과값을 받을 수 있었다.

 

3. RowMapper 사용법 

 RowMapper 의 mapRow메소드는 이러한 ResultSet를 사용한다.

사용법은

 

??? mapRow(ResultSet rs , int count)

 

ResultSet에 값을 담아와서 User 객체에 저장한다.

그리고 그것을 count만큼 반복한다는 뜻이다.

(반환형은 뭔지 잘 모르겠다. 확인해봐야겠지만 아마 List가 아닐까 싶다)

 

위에 것을 실제로 작성해보면

 

public User mapRow(ResultSet rs, int count) throws SQLException {
    // ResultSet 값을 User 객체에 저장
    User user = new User();
    actor.setFirstName(resultSet.getString("name"));
    actor.setLastName(resultSet.getString("description"));
    
    // user 반환
    return user;
};

count는 알아서 세어준다 작성할 필요없다

저것을 좀더 깔끔하게 람다식으로 작성할수있다.

 

(rs, count) -> new User(
                     rs.getString("name"),
                     rs.getString("description")
                   )

 

3. 향상된 queryForObject

우린 User 클래스도 반환 받을 수 있다.

// select 구문
String SELECT_BY_ID = "SELECT * FROM USER WHERE id=?";

// user 반환 받기
User user = jdbcTemplate.queryForObject(
        SELECT_BY_ID,
        (rs, count) -> new User(
                     rs.getString("name"),
                     rs.getString("description")
                   ),
        1000L);
짠~ : )