본문 바로가기
코드 스테이츠

JDBC

by 한휘용 2023. 6. 16.
728x90

JDBC(JavaDataBaseConnectivity)

JDBC : Java DataBase Connectivity의 약자로 해석하면 "자바 데이터베이스 연결"이라는 의미를 가집니다.

 

JDBC Java 기반 애플리케이션의 코드 레벨에서 사용하는 데이터를 데이터베이스에 저장 및 업데이트하거나,

데이터베이스에 저장된 데이터를 Java 코드 레벨에서 사용할 수 있도록 해주는 Java에서 제공하는 표준 사양(또는 명세, Specification)입니다.

JDBC는 자바에서 제공하는 Database 접근을 위한 인터페이스로 드라이버라고 불리는 구현체를 사용해서 자바에서 DB에 연결할 수 있습니다. 자바에서 이용하는 모든 DB 접근 기술(MyBatis, JPA 등)은 모두 JDBC 기반으로 동작합니다.

 

JDBC의 동작 흐름

JDBC 동작 흐름

JDBC는 Java 애플리케이션 내에서 JDBC API를 사용하여 데이터베이스에 액세스하는 단순한 구조이기 때무에 JDBC의 동작 흐름은 매우 심플합니다. 이를 한문장으로 간단히 표현하자면,

Java 애플리케이션에서 JDBC API를 이용해 적절한 데이터베이스 드라이버를 로딩한 후, 데이터베이스와 인터랙션 한다

라고  할 수 있다.

 

이처럼 JDBC API를 사용해 데이터베이스와 구체적인 인터랙션을 하기 위해서는 JDBC 드라이버를 먼저 로딩한 후에 데이터베이스와 연결해야 합니다.

JDBC 드라이버(JDBC Driver)
JDBC 드라이버는 데이터베이스와의 통신을 담당하는 인터페이스인데, Oracle이나 MS SQL, MySQL 같은 다양한 벤더에서는 해당 벤더에 맞는 JDBC 드라이버를 구현해서 제공을 하게 되고, 우리는 이 JDBC 드라이버의 구현체를 이용해서 특정 벤더의 데이터베이스에 액세스 할 수 있습니다.

 

JDBC API 사용 흐름

JDBC API의 사용 흐름

  • JDBC 드라이버 로딩
    • 사용할 드라이버를 로딩한다. JDBC드라이버는 DriverManager 클래스를 통해 로딩된다.
  • Connection 객체 생성
    • JDBC 드라이버가 로딩되면 DriverManager를 통해 데이터 베이스와 연결되는 세션인 Connection 객체 생성한다.
  • Statement 객체 생성
    • Statement객체는 작성된 SQL쿼리문을 실행하기 위한 객체로 객체 생성 후 정적SQL 쿼리 문자열 입력을 가진다. 
  • Query 실행
    • 생성된 Statement 객체를 이용해서 입력한 SQL 쿼리를 실행
  • ResultSet 객체로부터 데이터 조회
    • 실행된 SQL쿼리문에 대한 결과 데이터 셋이다.
  • ResultSet 객체 Close, Statement 객체 Close, Connection 객체 Close 
    • JDBC API를 통해 사용된 객체들은 사용 이후에 사용한 순서의 역순으로 차례대로  Close 해주어야 한다.

 

 

커넥션 풀 (Connection Pool)

커넥션 객체를 생성하는 과정
1. 애플리케이션에서 DB 드라이버를 통해 커넥션을 조회한다.
2. DB 드라이버는 DB와 TCP/IP 커넥션을 연결한다. (3 way handshake와 같은 네트워크 연결 동작 발생)
3. DB 드라이버는 TCP/IP 커넥션이 연결되면 아이디와 패스워드, 기타 부가 정보를 DB에 전달한다.
4. DB는 아이디, 패스워드를 통해 내부 인증을 거친 후 내부에 DB를 생성한다.
5. DB는 커넥션 생성이 완료되었다는 응답을 보낸다.
6. DB 드라이버는 커넥션 객체를 생성해서 클라이언트에 반환한다.

위의 과정처럼 JDBC API를 사용하여 데이터베이스와 연결하기 위해 Connection 객체를 생성하는 작업은 비용이 많이 들며 비효율적입니다.

 

이러한 문제를 해결하기위해 애플리케이션 로딩 시점에 Connection 객체를 미리 생성해 두고 애플리케이션에서 데이터베이스에 연결이 필요할 때, Connection 객체를 새로 생성하는 것이 아니라 미리 만들어둔 Connection 객체를 사용해서 애플리케이션의 성능을 향상 시키는 방법을 사용하게 됩니다.

 

여기서 데이터 베이스 Connection을 미리 생성하여 보관하고 애플리케이션이 필요할 때 이 Connection을 제공하는 역할을 하는 Connection 관리자를 바로 커넥션 풀 (Connection Pool)이라고 합니다.

 

커넥션 풀 동작 구조

커넥션 풀 동작 구조

 

1. 애플리케이션을 시작하는 시점에 커넥션 풀은 필요한 만큼 커넥션을 미리 생성하여 보관한다.

2. 서비스의 특징과 스펙에 따라 생성되는 Connection 객체의 개수는 다르지만 일반적으로 기본값으로 10개를 생성한다.

3. 커넥션 풀에 들어있는 Connection 객체는 TCP/IP로 DB와 연결되어 있는 상태이기 때문에 SQL을 DB에 전달할 수 있다.

4. DB 드라이버를 통해 새로운 커넥션을 획득하는 것이 아닌 이미 생성되어 있는 커넥션을 참조하여 사용하게 된다.

5. 커넥션 풀에 있는 커넥션을 요청하면 커넥션 풀은 자신이 가지고 있는 커넥션 객체 중 하나를 반환한다.

 

 

히카리 CP (HikariCP)

HikariCP는 가벼운 용량과 빠른 속도를 가지는 우수한 성능의 JDBC Connection Pool Framework입니다.

스프링 부트 2.0 이후부터는 커넥션 풀을 관리하기 위해 HikariCP를 사용하고 있습니다.

HikariCP는 미리 정해놓은 크기만큼의 Connection을 Connection Pool에 담아 놓습니다.

이후 요청이 들어오면 Thread가 Connection을 요청하고, Connection Pool에 있는 Connection을 연결해 줍니다.

 

핵심 정리

  • JDBC(Java Database Connectivity)는 Java 기반 애플리케이션의 코드 레벨에서 사용하는 데이터를 데이터베이스에 저장 및 업데이트하거나 반대로 데이터베이스에 저장된 데이터를 Java 코드 레벨에서 사용할 수 있도록 해주는 Java에서 제공하는 표준 API이다.
    • JDBC의 구체적인 API 사용법을 알 필요는 없지만 JDBC의 동작 흐름을 알면 Spring에서 지원하는 데이터 액세스 기술을 사용하는데 도움이 된다.
  • 데이터베이스 Connection 객체를 미리 만들어서 보관하고 애플리케이션이 필요할 때 이 Connection을 제공해 주는 역할을 하는 Connection 관리자를 바로 Connection Pool이라고 한다.
  • Spring Boot 2.0부터 HikariCP가 기본 DBCP로 채택되었다.
728x90

'코드 스테이츠' 카테고리의 다른 글

DDD(Domain Driven Design),애그리거트(Aggregate)  (0) 2023.06.19
Spring Data JDBC  (0) 2023.06.18
Spring - Controller  (0) 2023.06.13
Spring MVC 아키텍쳐  (0) 2023.06.12
Section2 회고  (0) 2023.06.08