본문 바로가기

Study/Spring

Spring에 커넥션풀(Connection Pool) 등록 - HikariCP

커넥션풀(Connection Pool) 이란?


위의 그림처럼 풀(Pool)속에 데이터베이스와의 연결(커넥션)들을 미리 만들어 두고 데이터베이스에 접근시 풀에 남아있는 커넥션중 하나를 받아와서 사용한뒤 반환하는 기법을 말한다. (스레드 풀과 비슷한 개념이라 보면 된다.)


웹 애플리케이션의 경우 다수의 사용자가 데이터베이스에 접근해야 하는 상황이 생겼을때 사용자들이 요청할때마다 연결을 만들고 해제하는 과정을 진행하면 비효율적이다. 따라서 커넥션풀을 이용하여 미리 여러 연결을 만들어놓고 필요한 사용자가 요청시 미리 만들어놓은 연결을 주는 형식인 커넥션풀이 더욱 효과적이다.


커넥션풀은 다양한 구현체들이 존재한다. 그리고 Java에서는 커넥션풀을 사용할때 javax.sql.DataSource 라는 인터페이스를 사용한다. DataSource 인터페이스를 사용하여 커넥션 풀을 사용할 때 사용할수 있는 여러 커넥션풀 중에서 spring-jdbc 라이브러리를 사용하는 방법도 있지만 최근 HikariCP (https://github.com/brettwooldridge/HikariCP) 라는 커넥션풀이 유행한다는 정보를 알게되었다.


HikariCP는 빠르다는 장점이 있으며 Multi core CPU를 지원하는 등 여러 장점이 있는데 자세한 정보는 다음 링크를 확인하자.

https://www.slideshare.net/rheehot1/connection-pool-67337828


Spring에서 사용하기 위해 일단 maven을 통해 HikariCP를 프로젝트로 가져온다.

pom.xml에 의존성을 추가한다.


maven의 경우 의존성을 추가할때 유용한 사이트가 있다.

https://mvnrepository.com/

위의 사이트에 들어가서 HikariCP를 검색하면



이때 맨위의 항목을 클릭하면


다음과 같은 화면이 나온다. 이때 원하는 버전을 선택하면 되는데 Usages가 많은 3.2.x 버전을 선택해보면 (2019.1.9 기준)



다음과 같이 나오는데 빨간 네모부분을 클릭하면 pom.xml에 추가해야할 코드가 자동으로 복사된다. 그리고 maven 말고도 Gradle 등 다른 빌드툴에서 의존성을 추가할때 넣어야하는 코드들도 제공해준다.


위의 코드를 추가하여 의존성을 추가한 뒤 spring 프로젝트에 빈으로 hikariConfig와 hikariDataSource를 등록하여 사용하면 된다. 

자세한 사용법은 https://github.com/brettwooldridge/HikariCP 에서 확인할 수 있다.


xml을 통해 빈을 등록하는 방법은 다음과 같다. 오라클 XE 11g를 사용할때의 코드이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
    <property name="driverClassName" 
    value="oracle.jdbc.driver.OracleDriver"></property>
    <property name="jdbcUrl"
    value="jdbc:oracle:thin:@localhost:1521:XE"></property>
    <property name="username" value="username"></property>
    <property name="password" value="password"></property>
</bean>
 
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"
    destroy-method="close">
    <constructor-arg ref="hikariConfig"/>
</bean>
cs


다음과 같은 양식으로 등록하면 된다.

그러면 스프링에 application context에는 다음 그림처럼 빈이 등록된다.





이렇게 등록된 빈에서 dataSource 빈을 javax.sql.DataSource 인터페이스를 이용해 사용하면 된다.


junit를 이용한 테스트 코드는 다음과 같다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package org.zerock.persistence;
 
import static org.junit.Assert.fail;
 
import java.sql.Connection;
 
import javax.sql.DataSource;
 
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
import lombok.Setter;
import lombok.extern.log4j.Log4j;
 
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class DataSourceTests {
 
    @Setter(onMethod_ = { @Autowired })
    private DataSource dataSource;
    
    @Test
    public void testConnection() {
        
        try(Connection con = dataSource.getConnection()){
            log.info(con);
        }
        catch(Exception e) {
            fail(e.getMessage());
        }
    }
 
}
 
cs


출처 : 코드로 배우는 스프링 웹 프로젝트 개정판 - 구멍가게 코딩단