작성
·
86
·
수정됨
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
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
안녕하세요, 인프런 AI 인턴입니다.
오리쉐리님의 질문에 대해 설명드리겠습니다. RowMapper
는 JDBC에서 사용하는 인터페이스로, 데이터베이스의 각 행을 매핑할 객체를 정의하는데 사용됩니다. RowMapper
를 사용하는 이유는 쿼리 결과를 자바 객체에 매핑하기 위해 필요한 코드를 줄이고, 결과 처리를 표준화하기 위함입니다.
람다식과 파라미터 (rs
, rowNum
):
rs
는 ResultSet
의 인스턴스로, 쿼리 결과의 한 행에 접근할 수 있게 해줍니다. rowNum
은 현재 처리중인 행의 번호를 나타냅니다. 일반적으로 rowNum
은 로깅이나 조건부 처리를 위해 사용되기도 합니다만, 대부분의 경우에는 사용되지 않습니다.JdbcTemplate
이 쿼리를 실행하고 결과를 처리할 때 내부적으로 제공합니다. 사용자는 이 매개변수들을 사용할 준비만 하면 됩니다.RowMapper<Member>
타입으로의 변환:
memberRowMapper()
메소드에서 반환되는 것은 RowMapper<Member>
의 구현체입니다. 이 구현체는 RowMapper
인터페이스를 람다식으로 구현하여 반환하며, 이는 Member
타입의 객체를 매핑하는 로직을 포함합니다. 실제 리턴되는 것은 RowMapper
인터페이스의 구현 객체이며, 이 구현 객체 내에서 Member
객체를 생성하고 리턴하는 로직을 담고 있습니다.queryForObject()
의 리턴 타입이 Member
가 되는 이유:
queryForObject()
메소드는 쿼리 수행 결과로 얻은 단일 레코드를 RowMapper
를 통해 객체로 매핑하고 그 결과 객체를 반환합니다. memberRowMapper()
메소드에 의해 제공된 RowMapper<Member>
구현체는 쿼리 결과를 Member
객체로 매핑하는데, queryForObject()
는 이 매핑된 Member
객체를 반환합니다. 따라서, queryForObject()
의 리턴 타입은 RowMapper
에 의해 지정된 타입, 즉 Member
가 됩니다.이와 관련하여 다음 링크에서 유사한 질문에 대한 답변을 찾아보실 수도 있습니다:
- RowMapper 에 대해 질문 드립니다!! - 이 질문에서는 RowMapper
의 반환값과 데이터 매핑에 대해 간단하게 설명하고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
안녕하세요. 오리쉐리님
다음 순서로 작동합니다.
JdbcTemplate이 데이터베이스 쿼리를 실행합니다.
쿼리 결과로 ResultSet 객체가 생성됩니다.
JdbcTemplate은 ResultSet의 각 행에 대해 RowMapper의 mapRow 메소드를 호출합니다.
이때 JdbcTemplate이 자동으로 ResultSet 객체와 현재 행 번호를 mapRow 메소드의 파라미터로 전달합니다.
개발자는 이 정보를 사용해서 처리하면 됩니다. (사용자는 이 매개변수들을 사용할 준비만 하면 됩니다.)
감사합니다.