본문 바로가기
  • 시 쓰는 개발자
1일 1개념정리 (24년 8월~)/Spring

1일1개 (10) - JDBC

by poetDeveloper 2024. 8. 18.

1일 1개념정리 24.08.09.금 ~ 

 

큰 결정에 큰 동기가 따르지 않을 때도 있다. 하지만 큰 결심이 따라야 이뤄낼 수 있다.

무조건 무조건 1일 1개의 개념 정리하기 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!


#10. JDBC

JDBC가 무엇인가 ? 스프링을 공부했다면 한번쯤 들어본 단어이다. JDBC는 "Java Database Connectivity"의 약자로, 자바에서 DB와 연결하고 쿼리를 실행하는 자바 API를 말한다. 한마디로 자바와 DB를 연결해주는 기술이라고 할 수 있다. JDBC는 쿼리문을 DB에 전달하거나 DB결과를 불러오는 등의 기능을 제공한다.

 

JDBC가 요즘에도 직접 사용되는가? 라고 묻는다면, "직접적으로" 사용되진 않는다. 아래에서 서술하겠지만, 여러 JDBC가 지금은 추상화된 상태로 Spring이 관리해주고 있다. 즉, Spring에서 추상화시켜놓은 기능을 우리가 가져다 쓰는거고 만약 저수준제어(복잡한 쿼리 / 성능 최적화 / DB의 특정 기능 활용)가 필요하다면 JDBC를 직접적으로 사용할 수도 있다.

 

JDBC 구성요소

주된 구성 요소는 2, 3, 4번에서 이야기하는 Connection, Statement, ResultSet이다.

 

1. JDBC 드라이버

자바 애플리케이션과 DB간의 통신을 담당한다. DB의 종류에 따라(Oracle, MySQL 등) 알맞은 JDBC 드라이버를 사용해야 한다. JDBC 드라이버로 특정 DB에 접근한다. 드라이버는 크게 4가지 타입이 있다. 이건 가볍게만 보자.

  • JDBC-ODBC 브리지 드라이버 : JDBC와 ODBC (Open Database Connectivity) 간의 연결 제공. 현재는 사용 X
  • 네이티브 API 드라이버 : DB의 네이티브 API를 호출하여 JDBC API와 연결
  • 네트워크 프로토콜 드라이버 : 네트워크 프로토콜을 사용하여 DB 서버와 연결
  • 스마트 드라이버 : DB 서버와 직접 연결되며, JDBC API를 직접 구현

2. Connection

Connection 객체는 DB와의 연결을 나타낸다. DB와 연결을 맺고, 트랜잭션을 시작하고, SQL 쿼리를 실행하며, 연결을 종료한다. ex) jdbc:mysql://localhost:3306/mydatabase

 

3. Statement

SQL 쿼리를 DB에 전송하고, 결과를 처리한다. Statement에는 세 가지 하위 클래스가 있다:

  • Statement : 단순한 SQL 쿼리를 실행
  • PreparedStatement : 매개변수를 포함하는 SQL 쿼리를 실행, 쿼리 실행 성능을 향상시키고 SQL 인젝션 공격 방지 가능
  • CallableStatement : 데이터베이스의 저장 프로시저를 호출
String sql = "SELECT * FROM users WHERE id = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, userId);
ResultSet resultSet = preparedStatement.executeQuery();

 

4. ResultSet

SQL 쿼리 실행 결과를 나타내고 결과 집합을 순회하면서 데이터를 읽을 수 있게 해줌.

while (resultSet.next()) {
    int id = resultSet.getInt("id");
    String name = resultSet.getString("name");
    // 결과를 처리
}

 

5. Transaction Management

JDBC는 트랜잭션을 수동으로 관리한다. 트랜잭션을 시작하려면 setAutoCommit(false)를 호출하고, 트랜잭션을 커밋하거나 롤백하려면 commit(), rollback()을 호출한다.

connection.setAutoCommit(false);
try {
    // 여기서 SQL 작업 수행
    connection.commit();
} catch (SQLException e) {
    connection.rollback();
}

 

6. Exception Handling

JDBC에서 DB작업 중 발생하는 예외는 SQLException 클래스로 처리한다.

try {
} catch (SQLException e) {
    e.printStackTrace();
}

 

JDBC 흐름

앞서 간단하게 설명했는데, JDBC는 자바와 DB를 연결해주는 기술이고 이때 JDBC에서 Connection이 필요하다고 했다. 그래서 동작 흐름이 다음과 같다.

 

Java Application → JDBC API 호출 → JDBC 드라이버 → DataBase

 

조금 더 자세히 살펴보자. Java Application이 DB에 접근해야하는 상황 발생한 상황이다.

  1. JDBC 드라이버 로드 (필요에 따라 특정 JDBC 드라이버를 로드)
  2. Connection 생성해서 DB 연결
  3. Statement 또는 PreparedStatement 객체 생성 - SQL 쿼리를 실행하기 위함
  4. SQL 쿼리 실행 - executeQuery() 또는 executeUpdate() 메소드 사용하여 SQL 쿼리를 실행
  5. 결과 처리 - 쿼리 결과 처리
  6. 트랜잭션 관리(Optional) - 필요에 따라 트랜잭션 관리 (수동)
  7. 해제 - 사용이 끝난 객체(Connection, Statement, ResultSet)를 닫아 자원 해제

 

Connection Pool

커넥션 풀과 비슷한 맥락...... 바로 멀티쓰레드에서 나왔던 내용이다. 다음 내용도 참고해보자.

https://100won-developer.tistory.com/entry/1%EC%9D%BC1%EA%B0%9C-2-%EB%A9%80%ED%8B%B0-%EC%93%B0%EB%A0%88%EB%93%9C

 

1일1개 (2) - 멀티 쓰레드 & spring 동시 요청 처리

1일 1개념정리 24.08.09.금 ~  큰 결정에 큰 동기가 따르지 않을 때도 있다. 하지만 큰 결심이 따라야 이뤄낼 수 있다.무조건 무조건 1일 1개의 개념 정리하기 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!#2. 멀티 쓰레드

100won-developer.tistory.com

 

쓰레드에서도 그랬지만, 결국 풀을 쓰는 이유는 첫 생성이 비싸기 때문이다. DB 연결도 마찬가지로 연결과정이 비싸기때문에 새로운 커넥션이 매번 생겼다가 지워지는 것은 비효율적이다. 따라서 DB 연결 객체를 일정 수만큼 만들어놓고 연결시 이를 가져다가 쓰는 것이다.

 

커넥션 풀 장점

  • 연결 비용을 아낀다. 만들어놓고 재사용하기 때문
  • 한정된 커넥션이기 때문에 자원 관리가 효율적
  • 이미 존재하는 연결을 사용하는 것이기 때문에 DB 접근 속도도 빨라진다.
  • 최대/최소 커넥션 수 / 커넥션이 풀에 머무르는 시간 / 커넥션 다 쓰고 추가 요청시 대기시간 설정 등이 가능하다.

커넥션 풀 동작 원리

  1. 초기화 : 애플리케이션이 시작될 때 일정 수의 DB 연결이 미리 생성되고 커넥션 풀에 대기상태로 저장됨.
  2. 커넥션 요청, 사용 : 애플리케이션이 DB와 연결이 필요할 때 새로운 연결을 생성하는 게 아니고 풀에서 커넥션을 가져오고 이걸 사용해서 DB 작업 수행.
  3. 커넥션 반환 : 작업이 완료되면 커넥션을 종료하는 대신 커넥션을 풀에 반환한다. 이 커넥션은 다음에 다른 요청이 있을 때 재사용된다.
  4. 풀 관리 : 커넥션 풀이 설정된 최대 수에 도달한 경우, 추가적인 커넥션 요청이 있을 때 대기하거나, 요청이 거부될 수 있다. 그리고 사용되지 않는 커넥션은 일정 시간 후에 풀에서 제거될 수 있다.