ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 DB - JDBC 개발 - 조회
    Data Base/스프링 DB 2023. 11. 20. 15:54

    JDBC 개발 - 조회

    예시 - JDBC를 통해 이전에 저장한 데이터를 조회하는 기능을 개발

     

    MemberRepositoryV0 - 회원 조회 추가

        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);
    
                //DB에서 정보 조회시
                rs = pstmt.executeQuery();
                //DB로 반환받은 직후의 rs에서는 커서가 아무것도 가르키지 않는다.
                //rs.next를 해주어야 실제 데이터가 있는지 확인한뒤
                //데이터가 실제 시작하는 곳 앞으로 커서가 이동한다.
                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 memeberId="+memberId);
                }
    
    
            }catch (SQLException e){
                log.info("error",e);
                throw e;
            }finally {
                close(con,pstmt,rs);
            }
        }

     

     

    요청받은 member_id에 해당하는 select 결과가 없을 때를 대비해서 다음 exeption을 추가한다.

    import java.util.NoSuchElementException;

     

     

    findById() - 쿼리 실행

    • sql :  데이터 조회를 위한 select SQL을 준비한다.
    • rs = pstmt.executeQuery() 데이터를 변경할 때는 executeUpdate()를 사용하지만, 데이터를 조회할 때는 executeQuery()를 사용한다. executeQuery()는 결과를 ResultSet에 담아서 반환한다.

    executeQuery()

    ResultSet executeQuery() throws SQLException;

     

    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 타입으로 반환한다.

     

    ResultSet 결과 예시

    위 그림은 ResultSet의 결과 회원이 2명 조회되는 경우이다.

    • 1-1에서 rs.next()를 호출한다.
    • 1-2의 결과로 cursor가 다음으로 이동한다. 이 경우 cursor가 가리키는 데이터가 있으므로 true를 반환한다.
    • 2-1에서 rs.next()를 호출한다.
    • 2-2의 결과로 cursor가 다음으로 이동한다. 이 경우 cursor가 가리미는 데이터가 있으므로 true를 반환한다.
    • 3-1에서 rs.next()를 호출한다.
    • 3-2의 결과로 cursor가 다음으로 이동한다. 이 경우 cursor가 가리키는 데이터가 없으므로 false를 반환한다.

    findById()에서는 회원 하나를 조회하는 것이 목적이다. 따라서 조회 결과가 항상 1건이므로 while대신에 if를 사용한다. 다음 SQL을 보면 PK인 member_id를 항상 지정하는 것을 확인할 수 있다.

    SQL : select * from member where member_id = ?

     

    실행결과

    MemberRepositoryV0Test - findMember=Member(memberId=memberV1, money=10000)
    • 회원을 등록하고 그 결과를 바로 조회해서 확인해 보았다.
    • 참고로 실행 결과 member객체의 참조 값이 아니라 실제 데이터가 보이는 이유는 롬복의 @Data가 toString()을 적절히 오버라이딩 해서 보여주기 때문이다.
    • isEqualTo() : findMember.equals(member)를 비교한다. 결과가 참인 이유는 롬복의 @Data는 해당 객체의 모든 필드를 사용하도록 equals()를 오버라이딩 하기 때문이다.

     

     

    [출저 - 스프링 DB 1편 - 데이터 접긎 핵심 원리, 김영한]

    https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1

     

    스프링 DB 1편 - 데이터 접근 핵심 원리 - 인프런 | 강의

    백엔드 개발에 필요한 DB 데이터 접근 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 DB 접근 기술의 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 백엔

    www.inflearn.com

     

    댓글

Designed by Tistory.