인프런 커뮤니티 질문&답변

오리쉐리님의 프로필 이미지

작성한 질문수

스프링 DB 1편 - 데이터 접근 핵심 원리

JDBC 반복 문제 해결 - JdbcTemplate

RowMapper 질문드립니다.

24.09.10 00:59 작성

·

38

·

수정됨

0

@Override

public Member findById(String memberId) {

String sql = "select * from member where member_id = ?";

return template.queryForObject(sql, memberRowMapper(), memberId);

}

private RowMapper<Member> memberRowMapper() {

return (rs, rowNum) -> {

Member member = new Member();

member.setMemberId(rs.getString("member_id"));

member.setMoney(rs.getInt("money"));

return member;

};

}

이 코드에서,

1. 해당 람다식은 파라미터로 rs와 rowNum을 받아서, 중괄호 부분을 실행한후 결과를 리턴하는것인가요? 그렇다면 rowNum의 역할은 무엇인지 궁금합니다. 또, 람다 내부의 rs와 rowNum 파라미터의 매개값은 어떻게 대입되는것인가요 ..? 람다식부분이 이해가 되지않아서 질문드립니다.

2. 이 코드에서 return member;를 하면 Member객체가 반환되는데 실제 리턴타입은 RowMapper<Member>로 되어있는데 어떻게 RowMapper<Member>타입으로 반환될수 있는것인지 질문드립니다.

3. queryForObject()의 리턴타입은 Member인데, 어떻게 Member가 되는것인가요 ?

답변 3

0

오리쉐리님의 프로필 이미지
오리쉐리
질문자

2024. 09. 13. 00:43

mapRow 메소드를 호출하는것과, 아래 코드 부분이 동일한건가요..? mapRow 메소드를 호출하면 아래 람다식이 호출되는 방식인가요..? 그리고 제가 생각했을땐 아래 코드를 바탕으로 RowMapper<Member>의 구현체가 리턴되고, 이때 쿼리 결과로 ResultSet 객체와 rowNum이 생성되서 자동으로 람다식의 매개변수 자리에 매개값으로 들어가는거 같긴한데.. 왜 이 람다식을 실행하게되면 RowMapper<Member>의 구현체가 리턴되는건가요..?

return (rs, rowNum) -> {
    Member member = new Member();
    member.setMemberId(rs.getString("member_id"));
    member.setMoney(rs.getInt("money"));
    return member;
};

0

오리쉐리님의 프로필 이미지
오리쉐리
질문자

2024. 09. 10. 10:00

  • 파라미터의 매개값은 스프링의 JdbcTemplate이 쿼리를 실행하고 결과를 처리할 때 내부적으로 제공합니다. 사용자는 이 매개변수들을 사용할 준비만 하면 됩니다.

이 부분이 이해가 되지않습니다ㅜㅜ 좀더 자세히 설명 부탁드려도될까요...

김영한님의 프로필 이미지
김영한
지식공유자

2024. 09. 11. 18:44

안녕하세요. 오리쉐리님

다음 순서로 작동합니다.

  • JdbcTemplate이 데이터베이스 쿼리를 실행합니다.

  • 쿼리 결과로 ResultSet 객체가 생성됩니다.

  • JdbcTemplate은 ResultSet의 각 행에 대해 RowMapper의 mapRow 메소드를 호출합니다.

  • 이때 JdbcTemplate이 자동으로 ResultSet 객체와 현재 행 번호를 mapRow 메소드의 파라미터로 전달합니다.

  • 개발자는 이 정보를 사용해서 처리하면 됩니다. (사용자는 이 매개변수들을 사용할 준비만 하면 됩니다.)

     

     

감사합니다.

0

인프런 AI 인턴님의 프로필 이미지

2024. 09. 10. 01:01

안녕하세요, 인프런 AI 인턴입니다.

오리쉐리님의 질문에 대해 설명드리겠습니다. RowMapper는 JDBC에서 사용하는 인터페이스로, 데이터베이스의 각 행을 매핑할 객체를 정의하는데 사용됩니다. RowMapper를 사용하는 이유는 쿼리 결과를 자바 객체에 매핑하기 위해 필요한 코드를 줄이고, 결과 처리를 표준화하기 위함입니다.

  1. 람다식과 파라미터 (rs, rowNum):

    • 람다식에서 rsResultSet의 인스턴스로, 쿼리 결과의 한 행에 접근할 수 있게 해줍니다. rowNum은 현재 처리중인 행의 번호를 나타냅니다. 일반적으로 rowNum은 로깅이나 조건부 처리를 위해 사용되기도 합니다만, 대부분의 경우에는 사용되지 않습니다.
    • 파라미터의 매개값은 스프링의 JdbcTemplate이 쿼리를 실행하고 결과를 처리할 때 내부적으로 제공합니다. 사용자는 이 매개변수들을 사용할 준비만 하면 됩니다.
  2. RowMapper<Member> 타입으로의 변환:

    • memberRowMapper() 메소드에서 반환되는 것은 RowMapper<Member>의 구현체입니다. 이 구현체는 RowMapper 인터페이스를 람다식으로 구현하여 반환하며, 이는 Member 타입의 객체를 매핑하는 로직을 포함합니다. 실제 리턴되는 것은 RowMapper 인터페이스의 구현 객체이며, 이 구현 객체 내에서 Member 객체를 생성하고 리턴하는 로직을 담고 있습니다.
  3. queryForObject()의 리턴 타입이 Member가 되는 이유:

    • queryForObject() 메소드는 쿼리 수행 결과로 얻은 단일 레코드를 RowMapper를 통해 객체로 매핑하고 그 결과 객체를 반환합니다. memberRowMapper() 메소드에 의해 제공된 RowMapper<Member> 구현체는 쿼리 결과를 Member 객체로 매핑하는데, queryForObject()는 이 매핑된 Member 객체를 반환합니다. 따라서, queryForObject()의 리턴 타입은 RowMapper에 의해 지정된 타입, 즉 Member가 됩니다.

이와 관련하여 다음 링크에서 유사한 질문에 대한 답변을 찾아보실 수도 있습니다:
- RowMapper 에 대해 질문 드립니다!! - 이 질문에서는 RowMapper의 반환값과 데이터 매핑에 대해 간단하게 설명하고 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.