์Šคํ”„๋ง(Spring)์—์„œ ์ปค๋„ฅ์…˜ ํ’€์„ ์‚ฌ์šฉํ•  ๋•Œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ฟผ๋ฆฌ(Validation Query)๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด, ์˜ค๋ž˜๋œ DB ์—ฐ๊ฒฐ๋กœ ์ธํ•ด SQL ErrorConnection resetHikariPool connection timeout๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํฌ์ŠคํŒ…์—์„œ๋Š” HikariCP, Apache DBCP2, Tomcat JDBC ๋“ฑ์—์„œ ์ปค๋„ฅ์…˜ ํ’€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ฟผ๋ฆฌ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ” ์ปค๋„ฅ์…˜ ํ’€๊ณผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ฟผ๋ฆฌ๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ 

✔ ์ปค๋„ฅ์…˜ ํ’€(Connection Pool)์ด๋ž€?

์ปค๋„ฅ์…˜ ํ’€์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๊ฒฐ์„ ๋ฐ˜๋ณต ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์žฌ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๋†’์ด๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์ปค๋„ฅ์…˜ ํ’€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ๋Š” HikariCPApache Commons DBCPTomcat JDBC๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

✔ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ฟผ๋ฆฌ(Validation Query)์˜ ์—ญํ• 

DB ์ปค๋„ฅ์…˜์ด ์œ ํšจํ•œ์ง€ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด ์‹คํ–‰ํ•˜๋Š” ๋‹จ์ˆœ ์ฟผ๋ฆฌ๋กœ, ๋น„์ •์ƒ์ ์ธ ์—ฐ๊ฒฐ์„ ์‚ฌ์ „์— ๊ฐ์ง€ํ•ด ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค

  • DB ์„œ๋ฒ„๊ฐ€ ์—ฐ๊ฒฐ์„ ๋Š์—ˆ๋Š”๋ฐ ์ปค๋„ฅ์…˜ ํ’€์€ ์ธ์‹ํ•˜์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ
  • ์žฌ์‹œ์ž‘์ด๋‚˜ ๋„คํŠธ์›Œํฌ ์ด์Šˆ๋กœ ์—ฐ๊ฒฐ์ด ๋ฌดํšจํ™”๋œ ๊ฒฝ์šฐ
  • "HikariPool-1 - Connection is not available" ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ


✅ DB๋ณ„ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ฟผ๋ฆฌ ์˜ˆ์‹œ

DBMS์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ฟผ๋ฆฌ
MySQLSELECT 1
PostgreSQLSELECT 1
OracleSELECT 1 FROM DUAL
H2SELECT 1
MSSQLSELECT 1 ๋˜๋Š” SELECT 1 AS result

✅ Spring์—์„œ ์ปค๋„ฅ์…˜ ํ’€ ์œ ํšจ์„ฑ ์ฟผ๋ฆฌ ์„ค์ • ๋ฐฉ๋ฒ•

1️⃣ HikariCP ์„ค์ • (Spring Boot ๊ธฐ์ค€)

Spring Boot์—์„œ application.properties ๋˜๋Š” Java Config๋กœ ์„ค์ • ๊ฐ€๋Šฅํ•˜๋ฉฐ, HikariCP๋Š” ๊ธฐ๋ณธ ์ปค๋„ฅ์…˜ ํ’€์ž…๋‹ˆ๋‹ค.


๐Ÿ”น application.properties ์‚ฌ์šฉ ์‹œ

spring.datasource.hikari.validation-timeout=5000
spring.datasource.hikari.connection-test-query=SELECT 1


๐Ÿ”น Java ์ฝ”๋“œ๋กœ ์„ค์ • ์‹œ

@Bean
public DataSource dataSource() {
    HikariConfig config = new HikariConfig();
    config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
    config.setUsername("user");
    config.setPassword("password");

    // ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ฟผ๋ฆฌ ์„ค์ •
    config.setConnectionTestQuery("SELECT 1");
    config.setValidationTimeout(5000);

    return new HikariDataSource(config);
}


๐Ÿ’ก Hikari๋Š” connectionTestQuery ์—†์ด๋„ isValid()๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๋ช…์‹œ์ ์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ง€์ •ํ•˜๋ฉด ์•ˆ์ •์„ฑ์ด ๋” ๋†’์Šต๋‹ˆ๋‹ค.

2️⃣ Apache Commons DBCP2 ์„ค์ • (XML ๋˜๋Š” Java Config)

๐Ÿ”น XML ์„ค์ • ์˜ˆ์‹œ

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
    <property name="username" value="user"/>
    <property name="password" value="password"/>
    
    <!-- ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ -->
    <property name="validationQuery" value="SELECT 1"/>
    <property name="testOnBorrow" value="true"/>
</bean>


๐Ÿ”น Java ์„ค์ • ์˜ˆ์‹œ

BasicDataSource dataSource = new BasicDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
dataSource.setUsername("user");
dataSource.setPassword("password");
dataSource.setValidationQuery("SELECT 1");
dataSource.setTestOnBorrow(true);


3️⃣ Tomcat JDBC ์„ค์ •

spring.datasource.tomcat.validation-query=SELECT 1
spring.datasource.tomcat.test-on-borrow=true


๋˜๋Š” XML์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

<property name="validationQuery" value="SELECT 1"/>
<property name="testOnBorrow" value="true"/>


๐Ÿšจ ์œ ์˜ ์‚ฌํ•ญ

  • ๋„ˆ๋ฌด ์ž์ฃผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋ฉด ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ ์ ˆํ•œ validation interval ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฟผ๋ฆฌ๋Š” ์ตœ๋Œ€ํ•œ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋‹จ์ˆœ ์ฟผ๋ฆฌ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉํ•˜๋Š” DBMS์— ๋”ฐ๋ผ ์ฟผ๋ฆฌ ๋ฌธ๋ฒ•์ด ๋‹ค๋ฅด๋‹ˆ ๋ฐ˜๋“œ์‹œ ํ™•์ธํ•˜์„ธ์š”.

✅ ๋งˆ๋ฌด๋ฆฌ

Spring์—์„œ ์ปค๋„ฅ์…˜ ํ’€ ์„ค์ • ์‹œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ฟผ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด, ๋ฌดํšจ ์ปค๋„ฅ์…˜์œผ๋กœ ์ธํ•œ ์žฅ์• ๋‚˜ ์˜ˆ์™ธ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์žฅ์‹œ๊ฐ„ ์œ ์ง€๋˜๋Š” ์„œ๋น„์Šค๋‚˜ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌAWS RDS ํ™˜๊ฒฝ์—์„œ๋Š” ํ•„์ˆ˜์ ์ธ ์„ค์ •์ž…๋‹ˆ๋‹ค.