1. 커넥션 풀이란?

 

데이터 연동과정에서 일반적인 연동과정은 웹 어플리케이션이 필요할 때마다 데이터베이스에 연결하여 작업하는 방식입니다. 그런데 이런 식으로 필요할 때마다 연동해서 작업할 경우 발생하는 문제가 있는데, 데이터베이스 연결에 시간이 많이 걸린다는 것입니다.

 

예를들어 온라인 쇼핑몰의 경우, 동시에 수십 수백명이 동시에 상품조회, 주문하기 등의 기능을 사용하는데 방금의 설명처럼 데이터베이스와 연동해 작업해야한다면 비효율적일 것입니다.

 

이 문제를 해결하기 위해 현재는 웹 어플리케이션이 실행됨과 동시에 연동할 데이터베이스와의 연결을 미리 설정해 둡니다. 그리고필요할 때마다 미리 연결해 놓은 상태를 이용해 빠르게 데이터베이스와 연동하여 작업을 합니다.

 

이렇게 미리 데이터베이스와 연결시킨 상태를 유지하는 기술을 커넥션 풀(Connection Pool, CP)라고 합니다.

 

2. 스프링에서 커넥션 풀 설정

 

Java에서는 DataSource라는 인터페이스를 통해서 커넥션 풀을 사용합니다.

 

잠시 여기서 DataSource를 간단하게 설명하자면, Connection Pool에는 여러개의 Connection 객체가 존재 하는데, 각각을 Application에서 직접적으로 이용하면 체계적인 관리가 힘들게 되므로 DataSource라는 것이 도입되었습니다. 즉, DataSource는 Connection Pool을 관리하는 목적으로 사용되는 인터페이스입니다.

 

다시 이어서, 매번 데이터베이스와 연결하는 방식이 아닌, DataSource를 통하여 미리 연결을 맺어주고 반환하는 구조를 이용하는 방식입니다.

 

spring-jdbc 라이브러리를 이용하는 방식 외에 여러 종류의 커넥션 풀이 있지만, 이번 포스팅에선 HikariCP를 이용하여 커넥션 풀 설정을 시작하겠습니다.

 

3. HikariCP 사용방법

 

먼저 pom.xml에 HikariCP를 추가합니다.

<!-- https://mvnrepository.com/artifact/com.zaxxer/HikariCP -->
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>2.7.4</version>
</dependency>

 

그다음 xml설정과 java설정이 있는데 각각 설정방법에 대해 알아보겠습니다.

 

- root-context.xml 설정방법

 

<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="test"></property>
    <property name="password" value="test"></property>
</bean>		

<!-- HikariCP configuration -->

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
	<constructor-arg ref="hikariConfig" />
</bean>

 

root-context.xml 안에 설정은 직접 <bean>태그를 정의해서 작성합니다. <bean> 태그 내에는 <property>를 이용해서 여러 속성에 대해 설정할 수 있는데 HikariCP에 대한 자세한 설정은 github.com/brettwooldridge/HikariCP 에서 참고하여 작성하면 되겠습니다.

 

위의 예시는 최소한의 설정으로 작성된 예시이므로 참고정도만 하면 되겠습니다.

 

 - Java 설정방법

 

@Bean
public DataSource dataSource() {
    HikariConfig hikariConfig = new	HikariConfig();
    hikariConfig.setDriverClassName("oracle.jdbc.driver.OracleDriver");
    hikariConfig.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:xe");

    hikariConfig.setUsername("test");
    hikariConfig.setPassword("test");

    HikariDataSource dataSource = new HikariDataSource(hikariConfig);

	return dataSource;
}

 

java 설정을 이용하는 경우에는 클래스에서 @Bean 어노테이션을 이용하여 처리합니다.

 

@Bean이 선언된 메서드의 실행 결과로 반환된 객체는 스프링의 객체(Bean)로 등록됩니다.

 

4. 테스트 코드를 통해 정상 작동 여부 확인하기

 

package org.zerock.persistence;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
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 conn = dataSource.getConnection()) {

			log.info(conn);
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

 

테스트 코드를 통해 콘솔창에 HikariPool - Start completed 부터 Shutdown completed까지 확인할 수 있습니다.

 

 

 

 

 

참고자료

 

책 자바 웹을 다루는 기술(이병승)book.naver.com/bookdb/book_detail.nhn?bid=14439459

책 코드로 배우는 스프링 웹 프로젝트(구멍가게 코딩단)book.naver.com/bookdb/book_detail.nhn?bid=9425458

choong0121.tistory.com/entry/DataSource-%EB%9E%80

 

 

 

 

 

 

 

'코딩 > Spring' 카테고리의 다른 글

MyBatis 동적 태그  (0) 2020.09.21
Spring Model  (1) 2020.08.28
Spring servlet-context.xml, root-context.xml, web.xml  (0) 2020.08.23
Spring Lombok Log4j 오류뜰 때  (2) 2020.08.21
Spring 스프링을 사용하는 이유  (0) 2020.08.20
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기