본문 바로가기
Spring/DB 1편

JDBC 이해

by JHyun0302 2023. 8. 9.
728x90

 

 

문제 : 각각의 데이터베이스마다 커넥션을 연결하는 방법, SQL을 전달하는 방법, 응답 받는 방법이 모두 다르다.

 

 

 

 

 

JDBC 표준 인터페이스

 

JDBC 표준 인터페이스

 

  • java.sql.Connection - 연결
  • java.sql.Statement - SQL을 담은 내용
  • java.sql.ResultSet - SQL 요청 응답

  

 

 

 

 

◎ 참고 : 표준화의 한계

  • 각각의 데이터베이스마다 SQL, 데이터타입 등의 일부 사용법 다르다.
             ex) 실무에서 기본으로 사용하는 페이징 SQL은 각각의 데이터베이스마다 사용법이 다르다.
  •   결국 데이터베이스를 변경하면 JDBC 코드는 변경하지 않아도 되지만 SQL은 해당 데이터베이스에 맞도록 변경해야한다.

 

 

 

 


JDBC와 최신 데이터 접근 기술

 

 

 

 

JDBC

 

 

 

SQL Mapper

 

SQL Mapper

  • 장점: JDBC를 편리하게 사용하도록 도와준다.
             SQL 응답 결과를 객체로 편리하게 변환해준다.
             JDBC의 반복 코드를 제거해준다.
  • 단점: 개발자가 SQL을 직접 작성해야한다.
  • 대표 기술: 스프링 JdbcTemplate, MyBatis

 

 

 

 

 

ORM

 

ORM 기술

  • ORM은 객체를 관계형 데이터베이스 테이블과 매핑해주는 기술이다.
  • 각각의 데이터베이스마다 다른 SQL을 사용하는 문제도 중간에서 해결해준다.
  • 대표 기술: JPA, 하이버네이트, 이클립스링크
  • JPA는 자바 진영의 ORM 표준 인터페이스이고, 구현체로 하이버네이트와 이클립스 링크 등의 구현 기술이 있다.

 

 

 


DB 연결

 

 

JDBC 커넥션 인터페이스와 구현

 

 

  • JDBC는java.sql.Connection 표준 커넥션 인터페이스정의한다.
  • H2 데이터베이스 드라이버는 JDBC Connection 인터페이스를 구현한 org.h2.jdbc.JdbcConnection 구현체를 제공한다.

 

 

 

 

DriverManager 커넥션 요청 흐름

 

 

 

H2 데이터베이스 드라이버 라이브러리

runtimeOnly 'com.h2database:h2' //h2-x.x.xxx.jar

 

 

 


JDBC 개발

 

※ 회원 등록, 조회, 수정, 삭제 기능 중 수정 기능에 대해서만 작성하겠다.

 

 

JDBC 개발 - 조회

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);
    }
}

 

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

 

 

 

executeQuery()

  ResultSet executeQuery() throws SQLException;

 

 

 

 

ResultSet

ResultSet 결과 예시

 

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

'Spring > DB 1편' 카테고리의 다른 글

자바 예외 이해  (0) 2023.08.09
스프링과 문제 해결 - 트랜잭션  (0) 2023.08.09
트랜잭션 이해  (0) 2023.08.09
커넥션풀과 데이터 소스 이해  (0) 2023.08.09
H2 데이터베이스 설정  (0) 2023.08.09