커넥션 풀(Connection pool)이란? (JDBC, HikariCP)

커넥션 풀(DBCP)이란?

웹 컨테이너(WAS)가 실행이 될 때 DB와 연결을 위해 미리 설정된 값만큼의 connection 객체들을 만들어 pool에 저장을 했다가 클라이언트의 요청이 발생하면 pool에 미리 생성해 둔 connection을 주었다가, 클라이언트의 사용이 끝나면 connection을 돌려받고 다시 pool에 저장하는 방식이다.

WAS(Web application server)란?

WAS(Web application server)는 웹 서버와 웹 컨테이너(WAS = Web Server + Web Container)가 합쳐진 형태로, 웹 서버 단독으로 처리할 수 없는 DB조회나 다양한 로직 처리가 필요한 동적 컨텐츠를 제공한다.

 

커넥션 풀 동작 과정

https://steady-coding.tistory.com/564

1. 사용자가 DB사용을 위해 connection을 요청한다. 

2. connection이 저장되어 있는 pool에서 사용되고 있지 않은 connection을 제공한다.

3. 사용자는 connection을 사용하고 connection을 pool에 다시 반환한다.

 

그러면 connection을 요청할때마다 생성해서 사용하면 되지 왜 굳이 미리 connection을 만들어 놓을까??라는 의문이 들 수 있다. 커넥션 풀을 사용해서 얻는 이점을 알아보자.

 

1. 클라이언트가 요청할때 마다 connection은 생성하는 과정은 비효율적이다.

DB Connection을 생성하기 위한 작업이 생각보다 비효율적인 게 첫 번째 이유이다. java에서 db에 접근하기 위해서 JDBC를 이용해 드라이버를 로드하고 객체를 생성하고 다시 삭제를 해줘야 하는 작업이 필요한데 커넥션 풀을 이용하면 미리 커넥션 객체를 생성해 두고 재활용하기 때문에 커넥션을 요청할 때마다 생성하고 삭제하는 불필요한 작업을 하지 않아도 된다.

 

2. connection수를 제한하여 서버의 자원을 효율적으로 사용할 수 있다.

요청이 올 때마다 connection을 생성하게 되면 생성되는 connection 객체가 많아지므로 메모리 낭비 문제로 인해 프로그램의 성능 저하가 발생할 수 있고, 사용자가 갑자기 급증하더라도 사용할 수 있는 connection의 수가 정해져 있기 때문에 서버 자원 고갈 방지가 가능하다.

 

JDBC란?

위에서 잠깐 JDBC에 대해서 언급을 했는데 JDBC에 대해 알아보자

 

JDBC(Java Database Connectivity)는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다. 다시 말해 자바 언어로 다양한 관계형 데이터베이스에 접속하고 SQL문을 수행하여 작업을 처리하는 역할을 한다.

 

JDBC의 전체적인 구조는 아래 사진과 같다.

DB에 접근하기 위해서 JDBC API를 이용해 데이터 베이스에 접근한다. JDBC API는 JDBC 드라이버를 거쳐 데이터베이스와 통신을 하게 된다.

JDBC 드라이버 : DB 벤더(회사)에서는 자신의 DB에 맞도록 JDBC 인터페이스를 구현해서 라이브러리로 제공하는데, 이것을 
JDBC 드라이버라고 한다.

 

 

커넥션 풀의 종류에는 여러가지가 존재하는데 Spring Boot 2.0부터 HikariCP라는 connection pool을 기본으로 사용하고 있다.

HikariCP란 JDBC의 커넥션 풀 프레임워크로 가벼운 용량과 빠른 속도가 장점이고, Spring Boot 2.0부터 커넥션 풀 관리를 위해 HikariCP를 사용하고 있다.