[Spring] JDBC란?

JANG SEONG SU·2023년 10월 25일
0

Sping

목록 보기
7/9
post-thumbnail
post-custom-banner

1. JDBC

1-1. 웹 서버, DB 통신 방법

  1. Connection 연결 : 주로 TCP/IP로 커넥션 연결을 수행한다.
  2. SQL 전달 : 웹 서버는 DB가 이해할 수 있는 SQL 쿼리문을 연결된 Connection을 통해 DB에 전달한다.
  3. DB는 전달 받은 SQL은 수행하고, 그 결과를 응답한다.

1-2. JDBC API

JDBC API는 자바에서 DB에 접속할 수 있도록하는 자바 API, 즉 JDBC를 쉽게 사용할 수 있도록 한 클래스와 라이브러리의 집합이다. 사실 JDBC APIJDBC라고 통칭하여 부르기도 한다.

JDBC는 DB 접근 방법을 표준화해서 DB Driver가 변경되더라도 코드단에는 영향을 주지 않는다. 개발자는 JDBC Interface에만 의존해서 코드를 작성하면 되기 때문이다. JDBC Interface의 구현체는 각 DB가 라이브러리로 제공하는데, 이를 DB Driver라고 한다.

📌DB Driver?
DB Driver는 DBMS와 통신을 담당하며, DBMS별로 각각 다른 DB Driver가 존재한다.

DB Driver 라이브러리를 추가하면 JDBC Driver Manager가 해당 드라이버를 찾아 Connection을 연결해준다.
정리하자면 개발자는 JDBC 표준 인터페이스에만 의존하여 코드를 작성하고, DB를 변경하려면 변경할 DB Drvier 라이브러리를 추가하기만 하면 된다.

대표적으로 다음 3가지 JDBC 표준 인터페이스가 있다.

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

1-3. JDBC Driver Manager

JDBC Driver Manager는 라이브러리로 등록된 DB Driver를 관리하고, DB Connection을 획득하는 역할을 한다. Driver Manager는 라이브러리에 등록된 Driver 목록을 자동으로 인식하고, 이 드라이버들에게 순서대로 DB 접속 정보(URL, USERNAME, PASSWORD 등)를 전달해 커넥션을 획득할 수 있는지 확인한다. 적절한 Driver를 찾아 그 구현체를 클라이언트에게 반환한다.

(현실에서 JDBC를 직접 사용하는 건 복잡하기 때문에, JDBCTemplate, MyBatis, JPA(ORM)를 사용한다.)


2. JDBC 사용

2-1. JDBC 직접 사용

위에서 언급했듯이 JDBC를 직접 사용하는 것은 매우 복잡하다.

2-2. SQL Mapper 사용

  1. SQL Mapper는 SQL 응답 결과를 객체로 편리하게 변환해주고, 반복 코드를 제거해준다.
  2. 대표적으로는 JDBC Template, MyBatis가 있다.

2-3. ORM 기술

  • ORM(Object Relational Mapping)은 객체를 관계형 DB 테이블과 매핑해주는 기술
  • 객체를 전달하면 구현체가 객체의 매핑 정보를 보고 쿼리를 직접 만들어낸다.
  • 즉, 반복적인 SQL을 직접 작성하지 않는다.

3. DB Connection

3-1. Connection

H2 Database로 DB 연결하는 과정을 코드로 살펴보겠다.

public static Connection getConnection() {
    try {
        Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
        log.info("get connection={}, class={}", connection, connection.getClass());
        return connection;
    } catch (SQLException e) {
        throw new IllegalStateException(e);
    }
}
  • DriverManager.getConnection(): 라이브러리에 있는 DB드라이버를 찾아 해당 드라이버가 제공하는 Connection을 반환
  • Connection인터페이스이고, getConnection()을 통해 가져온 것은 Connection구현체이다.
    • 로그는 아래처럼 찍히는데 가져오는 구현체가 JdbcConnection라는 의미
    • class=class org.h2.jdbc.JdbcConnection
  • JdbcConnection는 H2 데이터베이스 드라이버가 제공하는 H2 전용 커넥션이고 JDBC 표준 커넥션 인터페이스인 java.sql.Connection 인터페이스를 구현하고 있다
  • JDBC는 java.sql.Connection 인터페이스를 정의한다. (java.sql.Connection JDBC API 중 하나의 인터페이스이다.)
  • H2 DB Driverjava.sql.Connection 인터페이스를 구현한 org.h2.jdbc.JdbcConnection를 제공한다.
  • JdbcConnection이 있어야 H2 데이터베이스와 통신이 가능하다

3-2. DriverManager 커넥션 흐름

앞서 다뤘듯이, `DriverManager`는 라이브러리에 등록된 `DB Driver`를 관리하고, 커넥션을 웹서버에 제공한다.

🔍커넥션 반환 과정

  1. 어플리케이션 로직에서 커넥션이 필요하면 DriverManager.getConnection()을 호출
  2. DriverManager는 라이브러리에 등록된 드라이버 목록을 자동으로 인식하고 이 드라이버들에게 순서대로 정보(URL, 이름, 비밀번호 등)를 넘겨서 커넥션을 획득할 수 있는지 확인
  3. 각각의 드라이버는 URL 정보를 체크해서 본인이 처리할 수 있는 요청인지 확인해서 처리할 수 있는 경우 실제 데이터베이스에 연결해서 커넥션을 획득하고 이 커넥션을 클라이언트에 반환, 본인이 처리할 수 없으면 처리할 수 없다는 결과를 반환하고 다음 드라이버에게 순서가 넘어간다
  4. 이렇게 찾아진 커넥션 구현체가 클라이언트에게 반환된다

profile
Software Developer Lv.0
post-custom-banner

0개의 댓글