728x90
MemberRepositoryV0 - findById
public Member findById(String memberId) throws SQLException {
String sql = "select * from member where member_id = ?";
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
con = getConnection();
pstmt = con.prepareStatement(sql);
pstmt.setString(1, memberId);
rs = pstmt.executeQuery();
if (rs.next()) { //최소 한번은 호출해야 데이터가 있는지 없는지 알수 있다
Member member = new Member();
member.setMemberId(rs.getString("member_id"));
member.setMoney(rs.getInt("money"));
return member;
} else {
throw new NoSuchElementException("member not found memberId = " + memberId);
}
} catch (SQLException e) {
log.error("db error", e);
throw e;
}finally {
close(con, pstmt, rs);
}
}
- sql : 데이터 조회를 위한 select SQL을 준비한다.
- rs = pstmt.executeQuery() 데이터를 변경할 때는 executeUpdate()를 사용하지만, 데이터를 조회할 때는 executeQuery()를 사용한다. executeQuery()는 결과를 ResultSet에 담아서 반환한다.
ResultSet

- ResultSet 은 다음과 같이 생긴 데이터 구조이다. 보통 select 쿼리의 결과가 순서대로 들어간다.
- 예를 들어서 select member_id, money 라고 지정하면 member_id , money라는 이름으로 데이터가 저장된다.
- 참고로 select * 을 사용하면 테이블의 모든 컬럼을 다 지정한다.
- ResultSet 내부에 있는 커서( cursor )를 이동해서 다음 데이터를 조회할 수 있다.
- rs.next() : 이것을 호출하면 커서가 다음으로 이동한다. 참고로 최초의 커서는 데이터를 가리키고 있지 않기 때문에 rs.next()를 최초 한 번은 호출해야 데이터를 조회할 수 있다.
- rs.next() 의 결과가 true 면 커서의 이동 결과 데이터가 있다는 뜻이다.
- rs.next()의 결과가 false 면 더 이상 커서가 가리키는 데이터가 없다는 뜻이다.
- rs.getString("member_id") : 현재 커서가 가리키고 있는 위치의 member_id 데이터를 String 타입으로 반환한다.
- rs.getInt("money") : 현재 커서가 가리키고 있는 위치의 money 데이터를 int 타입으로 반환한다
- findById()에서는 회원 하나를 조회하는 것이 목적이다. 따라서 조회 결과가 항상 1건이므로 while 대신에 if를 사용한다
Test
@Test
void crud() throws SQLException {
//save
Member member = new Member("memberV1", 10000);
repository.save(member);
//findById
Member findMember = repository.findById(member.getMemberId());
log.info("findMember={}", findMember);
log.info("findMember == member {} ", findMember == member);
log.info("findMember == member {} ", findMember.equals(member));
assertThat(findMember).isEqualTo(member);
}
- equals 메소드가 true가 나오는 이유는 @Data에서 EqualsAndHashCode를 오버라이딩헀기 때문이다.
- 실행 결과에 member 객체의 참조 값이 아니라 실제 데이터가 보이는 이유는 롬복의 @Data 가 toString() 을 적절히 오버 라이딩해서 보여주기 때문이다.
728x90
'스프링 DB 1편(데이터 접근 핵심 원리)' 카테고리의 다른 글
| Ch02. 커넥션풀과 데이터소스 이해 - 커넥션 풀 이해 (0) | 2022.04.24 |
|---|---|
| Ch01. JDBC 이해 - JDBC 개발(수정, 삭제) (0) | 2022.04.23 |
| Ch01. JDBC 이해 - JDBC 개발(등록) (0) | 2022.04.23 |
| Ch01. JDBC 이해 - 데이터베이스 연결 (0) | 2022.04.23 |
| Ch01. JDBC 이해 - JDBC와 최신 데이터 접근 기술 (0) | 2022.04.23 |