JDBC(Java Database Connectivity)

Java 기반 어플리케이션의 데이터를 데이터베이스에 저장, 업데이트, 조회할 수 있도록 하는 Java API(Application Programming Interface)이다.
즉, 데이터베이스 접속과 SQL 문장의 실행, 그리고 실행 결과로 얻어진 데이터의 핸들링을 제공한다.
데이터베이스에 접근하기 위해 JDBC API를 사용하여 연동할 수 있다.

각각의 데이터베이스마다 커넥션을 연결하는 방법, SQL 전달방법, 결과를 응답받는 방법이 모두 다르므로 이 문제를 해결하기 위해 등장하였다.

JDBC는 3가지 기능을 표준 인터페이스로 정의하여 제공한다. (패키지명으로 표기함)

  1. java.sql.Connection (연결)
  2. java.sql.Statement (SQL 질의)
  3. java.sql.ResultSet (SQL 응답)

JDBC API Flowchart

flowchart LR;
    %% Default JDBC API
    DESCRIPTION>Default JDBC API]
    A[Database Driver loading] --> B[Connection] --> C[Statement] --> D[ResultSet]
    
    subgraph WAS
        APPLICATION[Application Logic] ---> |1.커넥션 조회| DRIVER[Driver]
        DRIVER --> |6.커넥션 반환| APPLICATION
    end

    USER(User) --> |요청| APPLICATION
    DRIVER --> |2.TCP/IP| DATABASE[(DB)]
    DRIVER --> |"3.ID & PW 인증"| DATABASE
    DATABASE ===== |"4.인증 및 세션 생성"| DATABASE
    DATABASE --> |5.커넥션 생성| DRIVER

    subgraph CLIENT
        APPLICATION ---> |응답| USER
    end
    flowchart LR;
    
    JDBC_INTERFACE[JDBC Interface]
    
    subgraph JDBC
        direction RL;
        ORACLE[Oracle JDBC Driver] ---> JDBC_INTERFACE
        MYSQL[Mysql JDBC Driver] ---> JDBC_INTERFACE
        SYBASE[Sybase JDBC Driver] ---> JDBC_INTERFACE
        POSTGRESQL[PostgreSQL Driver] ---> JDBC_INTERFACE
    end

    subgraph DBMS
        direction TB;
        ORACLE_DBMS[(Oracle DBMS)]
        MYSQL_DBMS[(Mysql DBMS)]
        SYBASE_DBMS[(Sybase DBMS)]
        POSTGRESQL_DBMS[(PostgreSQL DBMS)]
    end
    
    APPLICATION ---> |사용| JDBC ---> |구현| DBMS
  1. Client에서 WAS에 요청을 보낸다.
  2. DB Driver를 통하여 Connection을 조회한다.
  3. DB와 TCP/IP Connection을 연결한다. 3way handshake
  4. ID, PW 등 정보를 DB에 전달한다.
  5. 내부 인증을 완료하고, 내부 DB Session을 생성한다.
  6. DB는 Connection 생성이 완료되었다는 응답을 보낸다.
  7. DB Driver는 Connection 객체를 생성하여 Client에게 반환한다.
  8. WAS는 Client에게 응답을 보낸다.

JDBC API Useful Flowchart

    flowchart LR;
        JDBC_DRIVER_LOADING[JDBC 드라이버 로딩] ---> CONNECTION[Connection 객체 생성]
        CONNECTION ---> STATEMENT[Statement 객체 생성] ---> QUERY[Query 실행]
        QUERY ---> RESULT_SET[ResultSet 객체로부터 데이터 조회] ---> RS_CLOSE[ResultSet Close]
        RS_CLOSE ---> SM_CLOSE[Statement 객체 Close] ---> CN_CLOSE[Connection 객체 Close]
  1. 사용하고자 하는 JDBC 드라이버를 로딩하며, DriverManager Class를 통하여 로딩한다.
  2. 드라이버가 정상적으로 로딩 되었다면, DriverManager를 통해 데이터베이스와 연결되는 세션인 Connection 객체를 생성한다.
  3. Statement 객체는 작성된 SQL문을 실행하기 위한 객체로 정적 SQL 쿼리 문자열을 입력으로 가진다.
  4. 생성된 Statement 객체를 이용하여 입려된 SQL문을 실행한다.
  5. ResultSet 객체로부터 데이터를 조회한다.
  6. JDBC API를 통해 사용된 객체들은 사용한 순서의 역순으로 close 한다.

JDBC 드라이버

데이터베이스와의 통신을 담당하는 인터페이스

DriverManager class

DriverManager Flowchart
flowchart LR;
    APPLICATION[Application Logic] ---> |1.커넥션 요청| DriverManager["DriverManager.getConnection()"] -. "2.커넥션 요청" .-> Drivers    

    subgraph Drivers
        H2[H2 Driver]
        MySQL[MySql Driver]
    end
    
    Drivers -. "3.커넥션 번환" .-> APPLICATION

JDBC 드라이버를 통하여 커넥션을 만드는 역할을 하는 class

ConnectionPool(커넥션 풀)?

커넥션 객체를 생성하는 과정은 비용이 많이 들며, 비효율적이다.(사용자가 웹 어플리케이션에 요청을 할때마다 연결, 수립, 해제의 작업을 계속적으로 반복하기 때문)
이러한 문제를 해결하기 위해 애플리케이션 로딩 시점에 커넥션 객체를 미리 생성하고, 데이터베이스에 연결이 필요한 경우 미리 준비된 커넥션 객체를 사용하며 애플리케이션의 성능을 향상한다.

DataSource Flowchart
flowchart LR;
    subgraph Interface
        INTERFACE[DataSource]
    end

    subgraph ConnectionPools
        APACHE_COMMONS_DBCP2[DBCP Connection Pool]
        HikariCP[HikariCP Connection Pool]
        DriverManagerDataSource[DirverManagerDataSource]
    end

    APPLICATION[Application Logic] ---> |getConnection| Interface
    ConnectionPools -. Dependency .-> Interface

JDBC로 DB에 접근하려면 커넥션을 얻어야 하는 것을 알았다.
JDBC DriverManager Class로 커넥션을 얻었지만, Connection Pool 등장으로 커넥션 얻을 수 있는 방법이 많아졌다.
대부분 Connection Pool에선 문제 없지만, java.sql.DriverManager는 DataSource Interface를 사용하지 않는다.
하여, Spring에선 DriverManager도 DataSource를 사용할 수 있도록 DriverManagerDataSource class를 제공한다.