시냅스

Java - JDBC 정리 본문

Java, Spring

Java - JDBC 정리

ted k 2022. 8. 24. 21:12

클라이언트, 애플리케이션 서버, DB

  • 클라이언트가 애플리케이션 서버를 통해 데이터를 저장하거나 조회하면, 다음과 같은 과정을 거친다.
  • 1. 커넥션 연결
    • 주로 TCP/IP 를 사용해서 커넥션을 연결한다.
    • 3 way handshake
  • 2. SQL 전달
    • 애플리케이션 서버는 DB가 이해할 수 있는 SQL을 연결된 커넥션을 통해 DB에 전달한다.
  • 3. 결과 응답
  • 다만 각각의 데이터베이스 마다 커넥션을 연결하는 방법, SQL을 전달하는 방법, 응답을 받는 방법이 모두 다르다.

 

JDBC Java Database Connectivity

  • JDBC는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API다.
  • JDBC 표준 인터페이스에 의존하게 하여 데이터베이스를 다른 종류의 데이터베이스로 변경하면 애플리케이션 서버의 데이터베이스 사용 코드도 함께 변경해야하는 문제를 해결한다.
  • JDBC 사용법만 숙지하면 개발자가 각각의 데이터베이스마다 커넥션 연결, SQL 전달, 응답 받는 방법을 새로 학습하지 않아도 된다.
  • 대표적으로 다음 3가지 기능을 표준 인터페이스로 정의해서 제공한다.
  • java.sql.Connection
    • 연결
  • java.sql.Statement
    • sql을 담은 내용
  • java.sql.ResultSet
    • sql 요청 응답
  • 이런 인터페이스에 대한 구현체를 JDBC 드라이버라 한다.

 

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

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

 

  • JDBC가 제공하는 DriverManager는 라이브러리에 등록된 DB 드라이버들을 관리하고, 커넥션을 획득하는 기능을 제공한다.
  • 애플리케이션 로직에서 커넥션이 필요하면 DriverManger.getConnection() 을 호출한다.
  • DriverManager는 라이브러리에 등록된 드라이버 목록을 자동으로 인식하여 드라이브들에게 순서대로 정보를 넘겨 커넥션을 획득할 수 있는지 확인한다.
    • URL : e.g. jdbc:h2:tcp://localhost/~/test
    • 이름, 비밀번호 등 추가 정보
    • 각각의 드라이버들은 URL을 확인하여 연결할 수 있다면 데이터베이스에 연결하여 커넥션을 클라이언트에 반환한다.
  • 이렇게 찾은 커넥션 구현체가 클라이언트에 반환된다.

 

구현 예시

try {
	Connection con = DriverManager.getConnection(URL, USERNAME, PASSWORD); // connection 획득
	prepareStatement pstmt = con.prepareStatement(sql); // 데이터 베이스에 전달할 sql 정의
    pstmt.setString(1, eg); // 변수 바인딩
	ResultSet rs = pstmt.executeQuery(); // 쿼리 실행 및 응답 반환
	if (rs.next()) {
    	/** logic... */
    } else {
    throw new NoSuchElementException("..."); 
	}
} catch (SQLException e) { 
	log.error("db error", e); throw e;
} finally {
	close(con, pstmt, rs); // 리소스 정리 함수 실제로 각각은 con.close() 와 같은 모습으로 정리된다.
    }
}

 

리소스 정리

  • 쿼리를 실행하고 나면 리소스를 정리할 때에는 항상 역순으로 해야한다
  • 위의 경우 close라는 함수에서 정리하는데
  • Connection 을 먼저 획득하고 PrepareStatement, ResultSet 순서로 획득했기 때문에
  • ResultSet -> PrepareStatement -> Connection 순서로 close 해야한다.
  • 만약 커넥션이 끊어지지 않고 계속 유지되는 경우 리소스 누수가 발생하여 커넥션 부족으로 이어질 수 있다.

 

ResultSet

  • 보통 select 쿼리의 결과가 순서대로 들어간다.
    • select member_id, money 라고 지정하면 member_id, money 라는 이름으로 데이터가 저장된다.
  • ResultSet 내부에 있는 커서를 이동해서 다음 데이터를 조회할 수 있다.
  • rs.next() 를 호출하면 커서가 다음으로 이동한다.
    • 최초의 커서는 데이터를 가리키고 있지 않기 때문에 최초 한 번은 호출해야 데이터를 조회할 ㅅ ㅜ있다.
  • rs.next() 의 결과가 true면 커서의 이동 결과 데이터가 있다는 뜻이다.
    • 반대는 없다는 뜻이다.
  • rs.getString("") 과 같이 데이터 반환 타입을 지정할 수 있다.
Comments