본문 바로가기

카테고리 없음

[STS_세팅 가이드] Hikari CP로 데이터베이스 연결하기

01_DB Connection Pool.txt

 

커넥션 풀 (DBCP, Database Connection Pool)

- 필요할 때마다 새로운 연결을 만드는 게 아니라 
  미리 만들어놓은 연결을 사용하여 새로운 연결을 계속해서 생성하는 자원의 낭비를 없애는 방법

- 만들어놓은 DB연결 객체들을 저장해놓은 곳을 Pool이라고 한다.

- 매번 데이터베이스에 새로운 연결을 맺는 것은 속도가 느려지기 때문에 
  커넥션 풀에서 미리 만들어진 연결을 꺼내 사용하면 쿼리문의 처리 속도가 매우 빨라진다.

- 웹서버가 실행될 때 연결을 미리 설정한 만큼 생성해두는 방식을 사용한다.


참고 https://linked2ev.github.io/spring/2019/08/14/Spring-3-%EC%BB%A4%EB%84%A5%EC%85%98-%ED%92%80%EC%9D%B4%EB%9E%80/

 

 

 

유명 커넥션 풀 라이브러리

- Apache Commons DBCP 
- Hikari CP  - https://github.com/brettwooldridge/HikariCP 

 

 

 

 

 

 

 

 

 

Hikari CP 세팅 가이드

 

1. 구글에 Hikari CP검색해서 뜨는 깃헙 주소 로 접속

https://github.com/brettwooldridge/HikariCP

 

 

2. 나는 자바 1.8이니까 8버전 디펜 복붙 (pom.xml)

HikariCP dependency

<dependency>
   <groupId>com.zaxxer</groupId>
   <artifactId>HikariCP</artifactId>
   <version>4.0.3</version>
</dependency>

 

 

 

 

3. root-context.xml가서 빈 등록 

 

HikariCP root-context

<bean id="config" class="com.zaxxer.hikari.HikariConfig">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
    <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:XE"/>
    <property name="username" value="hr"/>
    <property name="password" value="1234"/>
</bean>

<bean id="ds" class="com.zaxxer.hikari.HikariDataSource">
	<constructor-arg ref="config"/>
</bean>

 

빈 등록된 모습

 

저장 후 Bean Graph에서 빈이 잘 등록 돼 있는 것을 확인

메이븐 업데이트 안 해도 되고

 

이제 이 빈들이 정상작동하는지 테스트해보기 위해 

홈 컨트롤러 가서 오토와이어드로 ds 사용해보기

 

4. HomeController에서 DataSource ds를 @Autowired로 받아서 테스트 

package com.ezen.database;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import lombok.extern.log4j.Log4j2;


@Log4j2
@Controller
public class HomeController {
	
	@Autowired
	DataSource ds;
	
	
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Locale locale, Model model) {
		
		//http://localhost:8888/database/로 접속하면 뜰 것
		//log.info("Home Controller!!");
		
		log.info(ds); 
		//11:25:21:620 [http-nio-8888-exec-4] INFO  com.ezen.database.HomeController - HikariDataSource (HikariPool-1)
		
		
		Date date = new Date();
		DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
		
		String formattedDate = dateFormat.format(date);
		
		model.addAttribute("serverTime", formattedDate );
		
		return "home";
	}	
}

 

log.info(ds); 를 콘솔에 출력했을 때

아래 달린 주석처럼 나오면 됨

 

 

 

 

 

 

 

 

 

 

세팅 가이드 3 번 빈등록 하기 전에 그냥 빈 등록 안 하고 써봄

 

1. 테스트용 클래스 하나 만들고 그 안에 HikariCP 깃헙에서 얻은 예시 코드 넣어보기

 

이 코드를 내가 사용하는 jdbc에 맞게 커스텀 하고 살을 더 붙여보면 아래와 같은 클래스가 만들어진다.

 

HikariTest.java

package mytest;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import lombok.extern.log4j.Log4j2;

@Log4j2
public class HikariTest {

	public static void main(String[] args) {
		
		HikariConfig config = new HikariConfig();
		
		config.setDriverClassName("oracle.jdbc.driver.OracleDriver"); //오라클 빌드패스 해주기
		config.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:XE");
		config.setUsername("hr");
		config.setPassword("1234");
		// 이런 기능도 있다 ~ 나머지는 https://github.com/brettwooldridge/HikariCP 읽어보기
//		config.setMinimumIdle(5);
//		config.setMaximumPoolSize(10);
		//잡다한 거
//		config.addDataSourceProperty("cachePrepStmts", "true");
//		config.addDataSourceProperty("prepStmtCacheSize", "250");
//		config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");

		HikariDataSource ds = new HikariDataSource(config);
		
		try (
				Connection conn = ds.getConnection();
				PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM employees");
				ResultSet rs = pstmt.executeQuery();			
		){
			while(rs.next()) {
				log.info(rs.getString("first_name") + " " + rs.getString("last_name"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

 

이러고 실행해봤더니 안 됨

왜냐하면 Maven이 jdbc를 자동으로 연결해주지 않기 때문에

우리가 수동으로 ojdbc8.jar파일을 Build Path 해주고, deployee 

 

2. 프로젝트 우클릭 - Build Path - Configuration Build Path... - Add External JARs... 에서 ojdbc8.jar경로 추가

C:\JavaAWS\database\sqldeveloper-21.4.3.063.0100-x64\sqldeveloper\jdbc\lib 폴더에 위치

 

3. Web Deployment Assembly - Add .. - Java Build Path Entries 에서 ojdbc8.jar 패스 추가해주고 apply

 

4. 다시 HikariTest 실행

정상적으로 실행되는 모습 (console에 뜨는 log들)