์ฐ์ ๊ธฐ๋ก ๐ช
์ปค๋ฅ์ ํ(Spring Boot, HikariCP) ๋ณธ๋ฌธ
๊ฐ์
Spring Boot ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด application.yaml์ ์๋์ ๊ฐ์ด ์ค์ ํ์ฌ DB์ ์ฐ๊ฒฐ์ ํ๋ค.
spring:
application:
name: backend-basics-for-juniors
datasource:
url: jdbc:mysql://localhost:3306/${DB_NAME}
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
maximum-pool-size: 10
minimum-idle: 2
connection-timeout: 30000
์ฌ๊ธฐ ๋ณด์ด๋ hikari๋ HikariCP(ํ์นด๋ฆฌ ์ปค๋ฅ์ ํ)์ ์๋ฏธํ๋๋ฐ, HikariCP๋ JDBC ์ปค๋ฅ์ ํ ๊ตฌํ์ฒด์ด๋ค. build.gradle์ ๋ณด๋ฉดimplementation 'org.springframework.boot:spring-boot-starter-jdbc' ์ ๊ฐ์ ์ฝ๋๊ฐ ์์ํ ๋ฐ spring-boot-starter-jdbc ๋ฅผ ์ฐ๋ฉด HikariCP๊ฐ ๊ธฐ๋ณธ ์ปค๋ฅ์ ํ๋ก ์๋ ์ ์ฉ๋๋ค.
์ปค๋ฅ์ ํ์ด๋?
์ปค๋ฅ์ ํ์ด๋ DB์ ์ฐ๊ฒฐ๋ ์ปค๋ฅ์ ์ ๋ฏธ๋ฆฌ ์์ฑํด์ ๋ณด๊ดํ๋ ๊ฒ์ด๋ค. ์ฐ๋ฆฌ๊ฐ DB๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด DB์ ์ฐ๊ฒฐํ๊ณ , ์ฟผ๋ฆฌ๋ฅผ ์คํํ ํ ์ฐ๊ฒฐ์ ์ข ๋ฃํ๋๋ฐ, ์ด ์ฐ๊ฒฐ์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. ์ปค๋ฅ์ ์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ DB์์ ์ด ํ์ํ ๋ ๋ง๋ค์ด์ ธ์๋ ์ปค๋ฅ์ ์ ์ฌ์ฉํ๊ณ , ์ฟผ๋ฆฌ ์ํ์ด ๋๋๋ฉด ์ปค๋ฅ์ ํ์ ์ปค๋ฅ์ ์ ๋ฐํํ๋ค. ์ด๋ฅผ ํตํด ์๋ต์๊ฐ์ ์ค์ด๋ ๊ฒ์ด๋ค.
์ปค๋ฅ์ ํ์๋ ์ฌ๋ฌ๊ฐ์ง ์ค์ ์ ์ ์ฉํ ์ ์๋ค. ์ปค๋ฅ์ ํ ํฌ๊ธฐ, ์ปค๋ฅ์ ๋๊ธฐ์๊ฐ, ์ปค๋ฅ์ ์ ์ง์๊ฐ ๋ฑ.. ๋ง์ ์ค์ ์ด ๊ฐ๋ฅํ๊ณ ๊ฐ ๊ฐ๋ค์ ์ ์ ํ๊ฒ ์ค์ ํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ค.
์ปค๋ฅ์ ํ ์ค์ ๊ฐ
HikariCP์ ์ค์ ๊ฐ์ HikariCP์ ๋ ํฌ์งํ ๋ฆฌ์์ ํ์ธํ ์ ์๋ค.
Every property is optional, except for the "essentials" marked below.

HikariCP์ ์ํ๋ฉด dataSourceClassName ํน์ jdbcUrl, username, password๋ง ๋ช ์ํ๋ฉด ๋ค๋ฅธ ์ค์ ๊ฐ์ ๋ชจ๋ ์ต์ ์ด๋ผ๊ณ ํ๋ค.
์๋๋ HikariCP์ ์ค์ ๊ฐ ์ค ํ์๊ฐ๊ณผ ์ ์ฉํ ์ค์ ๋ค์ ์ ๋ฆฌํ ๊ฒ์ด๋ค.
| ํ์ ๊ฐ | ์ค๋ช | ์์ ๊ฐ |
| dataSourceClassName(๋๋ jdbcUrl์ฌ์ฉ) | JDBC driver ๋ง๋ค ๋ช ์๋์ด ์๋ Datasource class ์ด๋ฆ | org.h2.jdbcx.JdbcDataSource |
| jdbcUrl(๋๋ dataSourceClassName ์ฌ์ฉ) | jdbc ๋๋ผ์ด๋ฒ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ ๋ ์ฌ์ฉํ๋ URL | jdbc:mysql://localhost:3306/testdb |
| username | DB ์ฐ๊ฒฐ ์ ์ฌ์ฉ๋๋ username | username |
| password | DB ์ฐ๊ฒฐ ์ ์ฌ์ฉ๋๋ password | password |
| ์ ์ฉํ ์ค์ | ์ค๋ช | ์์ ๊ฐ |
| autoCommit | auto commit ์ฌ๋ถ(๊ธฐ๋ณธ๊ฐ true) | true/false |
| connectionTimeout | ์ปค๋ฅ์ ํ์์ ์ปค๋ฅ์ ์ ์ป์ง ๋ชปํ์ ๋ ๊ธฐ๋ค๋ฆด ์๊ฐ(๊ธฐ๋ณธ๊ฐ: 30000(30์ด)) | 30000 |
| idleTimeout | ์ปค๋ฅ์
์ด ์ฌ์ฉ๋์ง ์์์ ๋ ์ปค๋ฅ์
์ ๋จธ๋ฌด๋ ์ต๋ ์๊ฐ 0์ผ๋ก ์ค์ ์ ์ปค๋ฅ์ ์ด ์ค๋ ์๊ฐ ์ฌ์ฉ๋์ง ์์๋ ์ ๊ฑฐ๋์ง ์์.(๊ธฐ๋ณธ๊ฐ: 6000000(10๋ถ) |
600000 |
| keepaliveTime | ์ ํ(idle)์ํ์ธ ์ปค๋ฅ์ ์ ping์ ๋ณด๋ด๊ณ , ํด๋น ์ปค๋ฅ์ ์ด ์ฃฝ์ ๊ฒ์ผ๋ก ํ๋จ๋๋ฉด ์ ์ปค๋ฅ์ ์ผ๋ก ๊ต์ฒด(๊ธฐ๋ณธ๊ฐ: 120000(2๋ถ)) | 120000 |
| maxLifetime | ์ปค๋ฅ์
์ ์ต๋ ์์กด ์๊ฐ โ ๏ธDB๋ ๋คํธ์ํฌ์์ ์ค์ ๋ ์ปค๋ฅ์ ์ต๋ ์ ์ง ์๊ฐ๋ณด๋ค ์กฐ๊ธ ์งง๊ฒ ์ค์ ํ ๊ฒ ๊ถ๊ณ . (๊ธฐ๋ณธ๊ฐ: 1800000(30๋ถ)) |
1800000 |
| minimumIdle | ์ต์ ์ ํด(idle)์ปค๋ฅ์ ์(๊ธฐ๋ณธ๊ฐ: maximumPoolSize๊ฐ๊ณผ ๋์ผ) | 10 |
| maximumPoolSize | ์ปค๋ฅ์ ํ์ ์กด์ฌํ๋ ์ปค๋ฅ์ ์ ์ต๋ ์(๊ธฐ๋ณธ๊ฐ: 10) | 10 |
์ ์ค์ ๊ฐ๋ค์ ์๋น์ค ์ฑ๊ฒฉ์ ๋ฐ๋ผ ์ ์ ํ๊ฒ ์ค์ ํ๋ฉด ๋๋ค. ์๋ฅผ๋ค์ด connectionTimeout์ ์ปค๋ฅ์ ํ์์ ์ปค๋ฅ์ ์ ์ป์ง ๋ชปํ์ ๋ ๋ช์ด๊น์ง ๊ธฐ๋ค๋ฆด ๊ฒ์ธ์ง๋ฅผ ๋ํ๋ด๋ ๊ฐ์ธ๋ฐ, ๊ธฐ๋ณธ๊ฐ์ 30์ด์ด๋ค. ์ฆ ์ต์ ์ ๊ฒฝ์ฐ 30์ด๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ค๋ ๊ฒ์ธ๋ฐ ๋น ๋ฅธ ์๋ต์ด ์๊ตฌ๋๋ ์๋น์ค๋ผ๋ฉด ํด๋น ๊ฐ์ ์ค์ด๋ ๊ฒ์ด ์ข๋ค. ๋ ๋ง์ ํธ๋ํฝ์ด ๋ชฐ๋ฆฌ๋ ์๋น์ค์ ๊ฒฝ์ฐ์๋ connectionTimeout์ ์งง๊ฒ ์ค์ ํ๊ณ ์ปค๋ฅ์ ์ ๊ฐ์ ธ์ค์ง ๋ชปํ์ ๋ ๋น ๋ฅด๊ฒ ์๋ฌ๋ฅผ ์๋ตํ๋ ๊ฒ์ด ์ข๋ค. ์ด๋ฏธ ๋๊ธฐ์ค์ธ ์์ฒญ์ด ๋ง์๋ฐ ๊ธฐ๋ค๋ฆฌ๋ ์ฌ์ฉ์๊ฐ ์ฌ์์ฒญ์ ๋ณด๋ธ๋ค๋ฉด ๋๊ธฐ์ค์ธ ์์ฒญ ๊ฑด์๊ฐ ๊ฑท์ก์ ์ ์์ด ๋์ด๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋ maxLifetime๊ณผ idleTimeout๋ ์ผํ ๋น์ทํด๋ณด์ด์ง๋ง ์ ์ฉ ๋์๊ณผ ๊ทธ ์ฉ๋๊ฐ ๋ค๋ฅด๋ค. maxLifetime์ ์ปค๋ฅ์ ์ ์ต๋ ์์กด ์๊ฐ์ด๋ค. ์ ํด(idle)์ํ์ ์ฌ์ฉ์ค์ธ ์ํ์ ์ปค๋ฅ์ ์ ๋ชจ๋ ์ ์ฉ๋์ง๋ง ์ฌ์ฉ์ค์ธ ์ปค๋ฅ์ ์ ์ ๊ฑฐํ์ง๋ ์๋๋ค. ์๋ฅผ๋ค์ด maxLifetime์ด 30๋ถ์ผ๋ก ์ ์ฉ๋์ด์์ ๋ ์์ฑ๋์ง 30๋ถ์ด ๋ค ๋์ด๊ฐ๋ ์ปค๋ฅ์ ์ด ์ฟผ๋ฆฌ ์ํ ์ค 30๋ถ์ด ๋๋ค๊ณ ํด๋ ํด๋น ์ปค๋ฅ์ ์ ์ ๊ฑฐํ์ง ์๋๋ค. ์ดํ ์์ ์ด ๋๋๋ฉด ํด๋น ์ปค๋ฅ์ ์ด ์ ๊ฑฐ๋๋ค. ์ด ์ค์ ๊ฐ์ ๋ชฉ์ ์ DB์ ํด๋ผ์ด์ธํธ์ ์ผ์ ์๊ฐ ์ํธ์์ฉ์ด ์๋ค๋ฉด ์๋์ผ๋ก ์ฐ๊ฒฐ์ ๋๋ ๊ธฐ๋ฅ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ DB์ชฝ์์๋ ์ฐ๊ฒฐ์ ๋์๋๋ฐ, ํด๋น ์ปค๋ฅ์ ์ด ๊ณ์ ํ์ ๋จ์์๋ค๊ฐ ํด๋ผ์ด์ธํธ๊ฐ ํด๋น ์ปค๋ฅ์ ์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ธฐ์ HikariCP์์๋ DB๋ ๋คํธ์ํฌ์์ ์ค์ ๋ ์ปค๋ฅ์ ์ต๋ ์ ์ง ์๊ฐ๋ณด๋ค ์กฐ๊ธ ์งง๊ฒ ์ค์ ํ ๊ฒ์ ๊ถ๊ณ ํ๊ณ ์๋ค.
idleTimeout์ ์ ํด(idle)์ํ์ ์ปค๋ฅ์ ์ ๋ํด์๋ง ์ ์ฉ๋๋ค. ์๋ฅผ๋ค์ด ์ค์ ์ ํธ๋ํฝ์ด ๋ง์ด ๋ชฐ๋ ค์ 10๊ฐ์ ์ปค๋ฅ์ ์ด ์์ฑ๋์์ง๋ง ์คํ์ ํธ๋ํฝ์ด ๋จ์ด์ก๋ค๊ณ ๊ฐ์ ํ์. ์ด ๊ฒฝ์ฐ 10๊ฐ์ ์ปค๋ฅ์ ์ ๋ชจ๋ ์ปค๋ฅ์ ํ์ ์ ์งํ๊ณ ์์ ํ์๊ฐ ์๋ค. ๊ทธ๋์ ์ผ์ ์๊ฐ ์ด์ ์ ํด(idle)์ํ์ธ ์ปค๋ฅ์ ์ ๋ถํ์ํ๋ค๊ณ ์๊ฐํ๊ณ ์ ๊ฑฐํ๋ ๊ฒ์ด๋ค.
์ฝ๋ ์ค์ต
์๋ ํ ์คํธ ์ฝ๋๋ฅผ ํตํด ์ปค๋ฅ์ ํ์ ๋ํ ์ค์ ๊ฐ์ ๋ฐ๊ฟ๊ฐ๋ฉฐ ์ฌ๋ฌ ์ํฉ์ ํ ์คํธํ ์ ์๋ค. ์ด ์ฝ๋๋ ์ปค๋ฅ์ ํ ํฌ๊ธฐ ์ ํ์ 2๋ก ์ค์ ํ๊ณ , ๊ทธ ์ด์์ผ๋ก ์ปค๋ฅ์ ์ ๊ฐ์ ธ์ค๋ ค๋ ์ฝ๋์ด๋ค. ์๋ฌ๊ฐ ๋ฐ์ํด์ผ ํ ์คํธ๊ฐ ํต๊ณผ๋๋ค.
์ฐธ๊ณ ๋ก JdpcTemplate๋ JPA๋ฅผ ์ฌ์ฉํ๋ฉด ์ปค๋ฅ์ ์ ์ป๊ฑฐ๋ ๋ซ๋ ๊ฒ์ ๋ด๋ถ์ ์ผ๋ก ๊ด๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ง์ ํ ํ์๊ฐ ์๋ค.
package com.backend.backendbasicsforjuniors.ch01.connectionPool;
import static org.assertj.core.api.Assertions.assertThat;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import java.sql.Connection;
import java.sql.SQLException;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest;
@JdbcTest
class UserRepositoryTest {
HikariConfig config = new HikariConfig();
@BeforeEach
void setUp() {
config.setJdbcUrl("jdbc:h2:mem:testdb"); // H2 ์ธ๋ฉ๋ชจ๋ฆฌ
config.setUsername("sa");
config.setPassword("");
config.setMaximumPoolSize(2); // ํ ํฌ๊ธฐ ์ ํ
config.setConnectionTimeout(500); // 0.5์ด๋ก ์งง๊ฒ ์ค์
}
@Test
@DisplayName("์ปค๋ฅ์
ํ ๊ฐ์ ์ด์์ผ๋ก ์์ฒญ ๊ฐ์ ธ์ค๊ธฐ")
void testMaximumPoolSize() throws SQLException {
try (HikariDataSource dataSource = new HikariDataSource(config)) {
// ์ปค๋ฅ์
์ฌ๋ฌ ๊ฐ ๋์์ ๊ฐ์ ธ์ค๊ธฐ
Connection conn1 = dataSource.getConnection();
Connection conn2 = dataSource.getConnection();
assertThat(conn1).isNotNull();
assertThat(conn2).isNotNull();
// ์ต๋ ํ์ ๋๋ ์ปค๋ฅ์
์์ฒญ → timeout ๋ฐ์ ํ์ธ
Exception exception = null;
try {
dataSource.getConnection(); // 3๋ฒ์งธ ์ปค๋ฅ์
} catch (SQLException e) {
exception = e;
}
System.out.println(exception);
assertThat(exception).isNotNull(); // timeout ์์ธ ํ์ธ
}
}
}
'Computer Science > ๋ฐ์ดํฐ๋ฒ ์ด์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ์ฟผ๋ฆฌ ๋์์ฑ ๊ฒ์ฆ (Mysql) (0) | 2025.10.29 |
|---|---|
| DB์ ๋๋ ๋ฐ์ดํฐ ๋ฃ๊ธฐ (Mysql, Faker) (0) | 2025.10.12 |
| [๋ฐ์ดํฐ๋ฒ ์ด์ค] B- Tree์ ์ธ๋ฑ์ค์ ์ดํด (3) | 2024.09.04 |