HikariCP

์ตœ์ •ํ™˜ยท2025๋…„ 2์›” 27์ผ
0

HikariCP: ์ตœ๊ณ ์˜ JDBC ์ปค๋„ฅ์…˜ ํ’€์„ ์œ ์ง€ํ•˜๋Š” ๋น„๊ฒฐ

๐Ÿšจ ์ด ๊ธ€์€ DB < ๋ฐฉํ™”๋ฒฝ > ์„œ๋ฒ„ ๊ตฌ์กฐ์—์„œ ๋ฐฉํ™”๋ฒฝ์˜ ํŒจํ‚ท ์˜ค์ธ์œผ๋กœ ์ธํ•ด ๋„คํŠธ์›Œํฌ ์œ ์‹ค ๋ฐ ์ปค๋„ฅ์…˜ ๋Š๊น€ ์žฅ์• ๋ฅผ ๊ฒฝํ—˜ํ•œ ํ›„, ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด HikariCP๋ฅผ ๊ณต๋ถ€ํ•˜๋Š” ๊ณผ์ •์—์„œ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.


1. HikariCP๋ž€?

HikariCP๋Š” ๊ฐ€๋ณ๊ณ  ๋น ๋ฅด๋ฉฐ ์•ˆ์ •์ ์ธ JDBC ์ปค๋„ฅ์…˜ ํ’€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
์Šคํ”„๋ง ๋ถ€ํŠธ 2.0 ์ดํ›„ ๊ธฐ๋ณธ ์ปค๋„ฅ์…˜ ํ’€๋กœ ์ฑ„ํƒ๋  ๋งŒํผ ์„ฑ๋Šฅ๊ณผ ํšจ์œจ์„ฑ์ด ๊ฒ€์ฆ๋˜์—ˆ์œผ๋ฉฐ

โœ… ๋‚ฎ์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„(latency)
โœ… ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰(throughput)
โœ… ๊ฐ•๋ ฅํ•œ ์•ˆ์ •์„ฑ

์„ ์ž๋ž‘ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ HikariCP๊ฐ€ ๋‹จ์ˆœํžˆ "๋น ๋ฅด๋‹ค" ๋Š” ์ด์œ ๋งŒ์œผ๋กœ ์ตœ๊ณ ์˜ ์ปค๋„ฅ์…˜ ํ’€์ด ๋œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
๋ถˆํ•„์š”ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ด๊ณ , ๋น ๋ฅธ ์‘๋‹ต ์†๋„๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, ์•ˆ์ •์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๋‹ค์–‘ํ•œ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์ด ์ ์šฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


2. HikariCP๊ฐ€ ๋‹ค๋ฅธ ์ปค๋„ฅ์…˜ ํ’€๋ณด๋‹ค ๋น ๋ฅธ ์ด์œ 

HikariCP๋Š” ๊ธฐ์กด ์ปค๋„ฅ์…˜ ํ’€๊ณผ ๋น„๊ตํ•ด ๋ถˆํ•„์š”ํ•œ ๋™๊ธฐํ™”๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ , ์ปค๋„ฅ์…˜ ๊ด€๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ตœ์ ํ™”ํ•œ ๊ฒƒ์ด ํŠน์ง•์ž…๋‹ˆ๋‹ค.
์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ ๋Œ€ํ‘œ์ ์ธ ๊ธฐ์ˆ ๋“ค์„ ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

โ‘  FastPath Pooling: ์ตœ์†Œํ•œ์˜ ๋™๊ธฐํ™”

๊ธฐ์กด์˜ ์ปค๋„ฅ์…˜ ํ’€๋“ค์€ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋™๊ธฐํ™” ๋น„์šฉ์ด ๋ณ‘๋ชฉ(bottleneck)์ด ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

HikariCP๋Š” ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด FastPath Pooling ๊ธฐ๋ฒ•์„ ๋„์ž…ํ•˜์—ฌ ์ปค๋„ฅ์…˜ ํ’€์—์„œ ์ปค๋„ฅ์…˜์„ ๊ฐ€์ ธ์˜ค๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณผ์ •์„ ๊ทน๋‹จ์ ์œผ๋กœ ์ตœ์ ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • JIT ์ตœ์ ํ™” : Java์˜ Just-In-Time (JIT) ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ™œ์šฉํ•ด Hotspot ์ตœ์ ํ™” ๊ทน๋Œ€ํ™”
  • CAS (Compare-And-Swap) ํ™œ์šฉ : ๊ธฐ์กด ๋™๊ธฐํ™” ๋ฐฉ์‹ ๋Œ€์‹  ์›์ž์  ์—ฐ์‚ฐ(Atomic Operation)์œผ๋กœ ๋™๊ธฐํ™” ๋น„์šฉ ์ œ๊ฑฐ
  • Queue-Free ๊ตฌ์กฐ : ๊ธฐ์กด์˜ ํ(Queue) ๊ธฐ๋ฐ˜ ์ปค๋„ฅ์…˜ ๊ด€๋ฆฌ ๋Œ€์‹  ConcurrentBag์„ ํ™œ์šฉํ•œ ๋น ๋ฅธ ์ปค๋„ฅ์…˜ ํ•ธ๋“ค๋ง

โœ… FastPath Pooling ๋•๋ถ„์— ๋™๊ธฐํ™” ๋น„์šฉ์„ ์ค„์ด๊ณ  ์ปค๋„ฅ์…˜ ํš๋“ ์†๋„๋ฅผ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โ‘ก ์ตœ์ ํ™”๋œ Connection ๊ฐ์ฒด ๊ด€๋ฆฌ

HikariCP๋Š” ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ์ตœ์†Œํ™”ํ•˜์—ฌ ์ปค๋„ฅ์…˜์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

1. Proxy ๊ฐ์ฒด ์ตœ์†Œํ™”

  • ์ผ๋ฐ˜์ ์ธ ์ปค๋„ฅ์…˜ ํ’€์—์„œ๋Š” Connection, Statement, ResultSet ๊ฐ์ฒด๋ฅผ ๋งค๋ฒˆ Proxy๋กœ ๊ฐ์‹ธ ๊ด€๋ฆฌ โ†’ GC ๋ถ€๋‹ด ์ฆ๊ฐ€
  • HikariCP๋Š” ํ•„์š”ํ•  ๋•Œ๋งŒ ์ตœ์†Œํ•œ์˜ Proxy ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GC ๋ถ€๋‹ด์„ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ.

2. ์ตœ์†Œํ•œ์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น

  • ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ํ• ๋‹นํ•˜์—ฌ ์žฌ์‚ฌ์šฉ (Object Reuse)
  • ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ์ตœ์†Œํ™”ํ•˜์—ฌ GC(Garbage Collection) ๋ถ€๋‹ด ์ตœ์†Œํ™”
  • ํ•„์š” ์—†๋Š” ๊ธฐ๋Šฅ(์˜ˆ: Statement caching)์„ ์ œ๊ฑฐํ•˜์—ฌ ๊ฒฝ๋Ÿ‰ํ™”

โœ… ์ด ๊ฒฐ๊ณผ, HikariCP๋Š” ๋‚ฎ์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๋†’์€ ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.


3. Connection Validation: ๋„คํŠธ์›Œํฌ ์žฅ์•  ๋Œ€์‘

HikariCP๋Š” ๊ธฐ์กด์˜ "SELECT 1" ์ฟผ๋ฆฌ ๋ฐฉ์‹ ์ด ์•„๋‹Œ, ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜ ๊ฒ€์ฆ(Network Timeout-based Validation) ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฅผ ํ†ตํ•ด DB ๋ถ€ํ•˜๋ฅผ ์ค„์ด๊ณ  ๋น ๋ฅธ ์žฅ์•  ๊ฐ์ง€๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


๐Ÿš€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ๊นŒ?

HikariCP๋Š” Socket Keep-Alive์™€ Network Timeout์„ ํ™œ์šฉํ•œ ๊ฒ€์ฆ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

โœ… 1. TCP ๋„คํŠธ์›Œํฌ ์ƒํƒœ ํ™•์ธ

  • HikariCP๋Š” ์ปค๋„ฅ์…˜์„ ํš๋“ํ•  ๋•Œ DB ์†Œ์ผ“์˜ ๋„คํŠธ์›Œํฌ ์ƒํƒœ๋ฅผ ์ง์ ‘ ํ™•์ธ
  • ๋งŒ์•ฝ TCP ์—ฐ๊ฒฐ์ด ๋Š์–ด์กŒ๋‹ค๋ฉด, ์ฆ‰์‹œ ๋น„์ •์ƒ์ ์ธ ์ปค๋„ฅ์…˜์œผ๋กœ ํŒ๋‹จํ•˜๊ณ  ์ œ๊ฑฐ

โœ… 2. Socket Timeout์„ ํ™œ์šฉํ•œ ๋น ๋ฅธ ๊ฐ์ง€

  • connectionTimeout ๋‚ด์— ์‘๋‹ต์ด ์—†์œผ๋ฉด ํ•ด๋‹น ์ปค๋„ฅ์…˜์„ ์ฆ‰์‹œ ํ๊ธฐ
  • ๋ถˆํ•„์š”ํ•œ SQL ์‹คํ–‰ ์—†์ด ๋น ๋ฅด๊ฒŒ ๋น„์ •์ƒ ์ปค๋„ฅ์…˜์„ ๊ฐ์ง€

โœ… 3. ๋น ๋ฅธ ์žฅ์•  ๊ฐ์ง€ (Fast-Fail Detection)

  • DB ์„œ๋ฒ„ ์žฅ์•  ๋ฐœ์ƒ ์‹œ ์ฆ‰์‹œ ๊ฐ์ง€ํ•˜์—ฌ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”
  • validationTimeout ์„ค์ •์„ ํ†ตํ•ด ์ง€์ •๋œ ์‹œ๊ฐ„ ๋‚ด ์‘๋‹ต์ด ์—†์„ ๊ฒฝ์šฐ ์ฆ‰์‹œ ํƒ€์ž„์•„์›ƒ ์ฒ˜๋ฆฌ

๐Ÿ“Œ HikariCP ์„ค์ • (Spring Boot application.properties)

# ๋น ๋ฅธ ์žฅ์•  ๊ฐ์ง€๋ฅผ ์œ„ํ•œ ์„ค์ •
spring.datasource.hikari.validation-timeout=250
spring.datasource.hikari.connection-timeout=3000

4. ์ตœ์ ์˜ ์„ค์ •๊ฐ’ ์ถ”์ฒœ

์„ค์ •๊ฐ’์„ค๋ช…๊ธฐ๋ณธ๊ฐ’
minimumIdle์ตœ์†Œํ•œ์œผ๋กœ ์œ ์ง€ํ•  ์ปค๋„ฅ์…˜ ์ˆ˜10
maximumPoolSize์ตœ๋Œ€ ์ปค๋„ฅ์…˜ ๊ฐœ์ˆ˜10
idleTimeout์œ ํœด ์ƒํƒœ์˜ ์ปค๋„ฅ์…˜์„ ์œ ์ง€ํ•˜๋Š” ์‹œ๊ฐ„(ms)600000 (10๋ถ„)
maxLifetime์ปค๋„ฅ์…˜์˜ ์ตœ๋Œ€ ์ˆ˜๋ช…(ms)1800000 (30๋ถ„)
connectionTimeout์ปค๋„ฅ์…˜์„ ํš๋“ํ•˜๋Š” ์ตœ๋Œ€ ๋Œ€๊ธฐ ์‹œ๊ฐ„(ms)30000 (30์ดˆ)
validationTimeout์ปค๋„ฅ์…˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„(ms)5000 (5์ดˆ)
leakDetectionThresholdConnection Leak ๊ฐ์ง€ ์‹œ๊ฐ„(ms)0 (๋น„ํ™œ์„ฑํ™”)

๐Ÿ“Œ ์„ค์ •๊ฐ’ ์กฐ์ • ๊ฐ€์ด๋“œ

  • maximumPoolSize : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ตœ๋Œ€ ์ปค๋„ฅ์…˜ ์ˆ˜์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋™์‹œ ์š”์ฒญ๋Ÿ‰์„ ๊ณ ๋ คํ•˜์—ฌ ์„ค์ •
  • idleTimeout : ๋„ˆ๋ฌด ์งง๊ฒŒ ์„ค์ •ํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ์ปค๋„ฅ์…˜ ์žฌ์ƒ์„ฑ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ
  • maxLifetime : DB์˜ ์„ค์ •๊ฐ’๋ณด๋‹ค ์•ฝ๊ฐ„ ์งง๊ฒŒ ์„ค์ •ํ•˜์—ฌ, DB์—์„œ ์ปค๋„ฅ์…˜์ด ๊ฐ•์ œ ์ข…๋ฃŒ๋˜๊ธฐ ์ „์— ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐ˜ํ™˜๋˜๋„๋ก ์„ค์ •
  • leakDetectionThreshold : ํŠน์ • ๊ฐ’(์˜ˆ: 15000 ms)์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์ปค๋„ฅ์…˜ ๋ฐ˜ํ™˜์ด ๋Šฆ์–ด์ง€๋Š” ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ ๊ฐ€๋Šฅ

5. ๊ฒฐ๋ก 

HikariCP๋Š” ๋‹จ์ˆœํ•œ "๋น ๋ฅธ ์ปค๋„ฅ์…˜ ํ’€" ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋ถˆํ•„์š”ํ•œ ๋™๊ธฐํ™”๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , Connection ๊ฐ์ฒด๋ฅผ ์ตœ์ ํ™”ํ•˜๋ฉฐ, ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ตœ์ ํ™”๋œ JDBC ์ปค๋„ฅ์…˜ ํ’€์ž…๋‹ˆ๋‹ค.

โœ… ์žฅ์ ๐Ÿš€ ์„ค๋ช…
๋‚ฎ์€ ๋ ˆ์ดํ„ด์‹œ์™€ ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰FastPath Pooling๊ณผ ์ตœ์ ํ™”๋œ Connection ๊ด€๋ฆฌ
๋ถˆํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„ ์ตœ์†Œํ™”๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ์ตœ์ ํ™” ๋ฐ Proxy ๊ฐ์ฒด ์ตœ์†Œํ™”
๊ฐ•๋ ฅํ•œ ์žฅ์•  ๊ฐ์ง€ ๋ฐ ๋ณต๊ตฌNetwork Timeout ๊ธฐ๋ฐ˜ ๊ฒ€์ฆ๊ณผ Fast-Fail Detection
๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ์˜ ์•ˆ์ •์„ฑLock-Free ๊ตฌ์กฐ์˜ ConcurrentBag ์‚ฌ์šฉ

๊ทธ๋ƒฅ ์Šคํ”„๋ง ๋ถ€ํŠธ์— ๋ถ™์–ด์žˆ์œผ๋‹ˆ ์•„๋ฌด ์ƒ๊ฐ ์—†์ด ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ์™œ ๋ฉ”์ด์ € ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ฑ„ํƒํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ณต๋ถ€์‹œ๊ฐ„ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ฐธ๊ณ  ๋ฌธ์„œ
๐Ÿ”— Welcome to the Jungle (HikariCP ๊ณต์‹ ๋ฌธ์„œ)

0๊ฐœ์˜ ๋Œ“๊ธ€