inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

JDBC 반복 문제 해결 - JdbcTemplate

RowMapper 질문드립니다.

254

오리쉐리

작성한 질문수 108

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가 되는것인가요 ?

spring mvc spring-jdbc

답변 3

0

오리쉐리

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

오리쉐리

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

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

0

김영한

안녕하세요. 오리쉐리님

다음 순서로 작동합니다.

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

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

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

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

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

     

     

감사합니다.

0

인프런 AI 인턴

안녕하세요, 인프런 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의 반환값과 데이터 매핑에 대해 간단하게 설명하고 있습니다.

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

spring initialiser 어떤걸 선택해야될지 모르겠어요

0

32

2

트랜잭션 템플릿이 체크예외는 커밋하는 이유가 궁금합니다.

0

51

1

jdbc 학습하다 궁금해서 질문드려요

0

82

1

정상이체와 이체중 예외발생 차이

0

68

2

이번 강의부터가 JDBC 직접 사용 맞나요?

0

88

1

순수한 서비스 계층에 대한 의문???

0

82

2

3_4test, 4test 자동 리소스 안됨

0

58

2

데이터베이스 선택 관련 질문.

0

68

2

after 메서드 사용 유무

0

57

2

데이터베이스 접근 및 DB 락

0

55

1

@SpingBootTest, @TestConfiguration

0

56

1

Read Committed 격리 수준 사용 관련 질문

0

48

1

AopCheck Test 부분의 EnhancerBySpring 확인 법??

0

66

2

커리큘럼 관련 질문

0

76

1

서비서 계층 스프링 프레임워크 사용

0

88

1

validation(toMember)의 위치

0

83

2

데이터 계층에서 서비스 로직의 datasource를 인식하는 방법

0

165

2

member 상수 질문

0

121

2

ctrl + F6 이후로 con 인식이 안 됩니다

0

153

2

DrivenManager 와 Connection 반환에 대한 질문입니다!

0

109

1

섹션5 트랜잭션 템플릿관련 질문(이기종 DB)

0

116

1

세션1 테이블 조회결과 그림은 Redo 로그에 속하나요?

0

100

1

트랜잭션이 필요하지 않은 경우 DB 대신 파일 시스템을 사용하는 것이 더 효율적인가?

0

98

1

강의 14분쯤 Exception 질문

0

115

2