Backend/spring (Boot)

Connection Pool๊ณผ Size ์„ ์ • ๊ธฐ์ค€ (with HikariCP)

dddzr 2025. 9. 1. 22:16

 

 

๐Ÿ” 1. ์ปค๋„ฅ์…˜ ํ’€(Connection Pool)์ด๋ž€?

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐ(Connection)์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ํ’€(Pool)์— ๋ณด๊ด€ํ•ด๋‘๊ณ , ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์ฆ‰์‹œ ๊บผ๋‚ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ๋‹ค์‹œ ๋ฐ˜๋‚ฉํ•˜๋Š” ๊ตฌ์กฐ.

 

โœ… ์žฅ์ 

  • ๋งค๋ฒˆ DB ์—ฐ๊ฒฐ์„ ์ƒˆ๋กœ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ ๋ผ์„œ ์†๋„ ๋น ๋ฆ„
  • DB ์ปค๋„ฅ์…˜ ์ˆ˜๋ฅผ ์ œํ•œํ•ด ๊ณผ๋ถ€ํ•˜ ๋ฐฉ์ง€

 

๐Ÿ” 2. HikariCP๋ž€?

  • Spring Boot์˜ ๊ธฐ๋ณธ ์ปค๋„ฅ์…˜ ํ’€ ๊ตฌํ˜„์ฒด.
  • ๋น ๋ฅด๊ณ  ๊ฐ€๋ฒผ์šด ์ปค๋„ฅ์…˜ ํ’€๋กœ, ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚˜์„œ ๋„๋ฆฌ ์“ฐ์ธ๋‹ค.

๐Ÿ“Œ 3. HikariCP ์„ค์ •

โœ… 3-0. yaml ์˜ˆ์‹œ

spring:
  datasource:
    hikari:
      maximum-pool-size: 30
      minimum-idle: 30
      idle-timeout: 60000
      connection-timeout: 3000

 

โœ… 3-1. maximum-pool-size

  • ์ปค๋„ฅ์…˜ ํ’€์— ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ปค๋„ฅ์…˜ ์ˆ˜
  • ์˜ˆ: 30 → ๋™์‹œ์— 30๊ฐœ์˜ ์ปค๋„ฅ์…˜๊นŒ์ง€ ์ƒ์„ฑ ๊ฐ€๋Šฅ
  • ๋„ˆ๋ฌด ์ž‘์œผ๋ฉด ์š”์ฒญ ๋Œ€๊ธฐ ๋งŽ์•„์ง€๊ณ , ๋„ˆ๋ฌด ํฌ๋ฉด DB์— ๋ถ€ํ•˜ ์ƒ๊น€

๐Ÿ“– ์˜ˆ์‹œ

์‚ฌ์šฉ์ž 100๋ช…์ด ๋™์‹œ์— ์ ‘์†ํ•˜์ง€๋งŒ DB ์ž‘์—…์€ 20๋ช… ์ •๋„๋งŒ ๋™์‹œ์— ๋ฐœ์ƒํ•œ๋‹ค๋ฉด, 30 ์ •๋„๊ฐ€ ์ ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค.

์‚ฌ์šฉ์ž 1๋ช…์ด ๋ณ‘๋ ฌ๋กœ ์—ฌ๋Ÿฌ๊ฐœ ์š”์ฒญ ํ•  ์ˆ˜ ์žˆ์Œ.

 

โœ… 3-2. minimum-idle

  • ์œ ํœด ์ƒํƒœ๋กœ ์œ ์ง€๋˜๋Š” ์ปค๋„ฅ์…˜ ์ˆ˜
  • ์˜ˆ: 30 → ํ•ญ์ƒ 30๊ฐœ์˜ ์ปค๋„ฅ์…˜์„ ์œ ์ง€ (ํ’€ ๊ณ ์ • ๋А๋‚Œ)
  • ์š”์ฒญ์ด ์—†๋”๋ผ๋„ 30๊ฐœ๋ฅผ ๋งŒ๋“ค์–ด ๋†“๊ธฐ ๋•Œ๋ฌธ์—, ์ดˆ๊ธฐ ์‘๋‹ต์ด ๋น ๋ฆ„

๐Ÿ”ฅ ์ฃผ์˜

minimum-idle์ด maximum-pool-size๋ณด๋‹ค ํฌ๋ฉด ๋ฌด์‹œ๋˜๊ณ , ๊ธฐ๋ณธ๊ฐ’ maximum-pool-size๋กœ ์„ค์ •๋จ  (ํ’€ ์ „์ฒด๋ฅผ ํ•ญ์ƒ ๋Œ€๊ธฐ ์ƒํƒœ๋กœ ์œ ์ง€)

 

โœ… 3-3. idle-timeout

  • ์œ ํœด ์ปค๋„ฅ์…˜์„ ์ •๋ฆฌํ•˜๋Š” ์‹œ๊ฐ„ (ms)
  • ์˜ˆ: 60000 → 60์ดˆ ์ด์ƒ ์•„๋ฌด ์ž‘์—…๋„ ์•ˆ ํ•œ ์ปค๋„ฅ์…˜์€ ์ •๋ฆฌ๋จ
  • ๋‹จ, ์ตœ์†Œ ์œ ํœด ์ˆ˜(minimum-idle)๋Š” ํ•ญ์ƒ ์œ ์ง€๋˜๊ธฐ ๋•Œ๋ฌธ์—
    60์ดˆ ์ง€๋‚˜๋„ ์ •๋ฆฌ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ.

โญ ๊ธฐ๋ณธ๊ฐ’: 600000ms (10๋ถ„)
๐Ÿ”ฅ ์ตœ์†Œ 10์ดˆ ์ด์ƒ (10000)์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•จ

 

โœ… 3-4. connection-timeout

  • ์ปค๋„ฅ์…˜์„ ์–ป๊ธฐ ์œ„ํ•ด ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„ (ms)
  • ์˜ˆ: 3000 → 3์ดˆ ๋™์•ˆ ์ปค๋„ฅ์…˜์ด ์—†์œผ๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒ (ex: SQLTransientConnectionException)
  • ๋„ˆ๋ฌด ์งง์œผ๋ฉด ์˜ค๋ฅ˜ ๋นˆ๋ฒˆ, ๋„ˆ๋ฌด ๊ธธ๋ฉด ์‚ฌ์šฉ์ž ์‘๋‹ต ์ง€์—ฐ

๐Ÿ“– ์˜ˆ์‹œ

DB๊ฐ€ ์ˆœ๊ฐ„์ ์œผ๋กœ ๋ถ€ํ•˜ ๊ฑธ๋ฆด ๋•Œ, ์ปค๋„ฅ์…˜์ด ์—†์œผ๋ฉด 3์ดˆ ๊ธฐ๋‹ค๋ฆฌ๋‹ค ํฌ๊ธฐํ•˜๊ฒŒ ํ•จ

 

๐Ÿš€ 3-5. ํ•ต์‹ฌ ์ •๋ฆฌ

ํ•ญ๋ชฉ๋ช… ์˜๋ฏธ ์ถ”์ฒœ๊ฐ’ ์˜ˆ์‹œ
maximum-pool-size ๋™์‹œ์— ์—ฐ๊ฒฐ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ์ปค๋„ฅ์…˜ ์ˆ˜ 20~50
minimum-idle ํ•ญ์ƒ ์œ ์ง€ํ•  ์œ ํœด ์ปค๋„ฅ์…˜ ์ˆ˜ maximum๊ณผ ๊ฐ™๊ฒŒ ์„ค์ • ์‹œ ์„ฑ๋Šฅ↑
idle-timeout ์œ ํœด ์ปค๋„ฅ์…˜์„ ํšŒ์ˆ˜ํ•˜๋Š” ์‹œ๊ฐ„ 60000~300000
connection-timeout ์ปค๋„ฅ์…˜ ๋ชป ์–ป์—ˆ์„ ๋•Œ ์ตœ๋Œ€ ๋Œ€๊ธฐ ์‹œ๊ฐ„ 2000~5000

 

 

โš ๏ธ ์ฃผ์˜ํ•  ์ 

  • maximum-pool-size๋Š” DB ์„œ๋ฒ„์˜ ์ตœ๋Œ€ ์ปค๋„ฅ์…˜ ์ˆ˜๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ์•ˆ ๋จ.
  • ์œ ํœด ์ปค๋„ฅ์…˜์ด ๋งŽ์•„์ง€๋ฉด, ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„์™€ DB ์ปค๋„ฅ์…˜ ๊ณ ๊ฐˆ ์šฐ๋ ค ์žˆ์Œ.
  • ์‹ค์ œ ์„œ๋น„์Šค ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์กฐ์ • ํ•„์ˆ˜ (ํŠธ๋ž˜ํ”ฝ ๋ถ„์„, DB ์„ค์ • ์ฐธ๊ณ )

๐Ÿ“Œ 4. ์‹ค์ „์—์„œ  minimum-idle ์„ค์ •

๐Ÿค” 4-1. minimum-idle์„ ์„ค์ •ํ•˜๋ฉด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ

  1. minimum-idle: 5 ์„ค์ •
  2. ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•ด์„œ ์ปค๋„ฅ์…˜ 5๊ฐœ๋ฅผ ๋‹ค ์‚ฌ์šฉ ์ค‘
  3. ์ถ”๊ฐ€ ์š”์ฒญ์ด ์™€์„œ ์ปค๋„ฅ์…˜ 1๊ฐœ๋ฅผ ์ถ”๊ฐ€ ์ƒ์„ฑํ•จ → ์ด 6๊ฐœ
  4. ์š”์ฒญ ๋๋‚˜๋ฉด ๊ทธ ์ถ”๊ฐ€ ์ƒ์„ฑ๋œ ์ปค๋„ฅ์…˜์€ "idle์ด 5๋ณด๋‹ค ๋งŽ์œผ๋‹ˆ๊นŒ" ๋ฐ”๋กœ ์ œ๊ฑฐ๋จ
  5. ๊ทธ๋Ÿฐ๋ฐ ์ž ์‹œ ๋’ค์— ์š”์ฒญ ํญ์ฃผ! ์ปค๋„ฅ์…˜ 4๊ฐœ ๋” ํ•„์š”!
    → ๋‹ค์‹œ 4๊ฐœ ์ƒ์„ฑ → ๊ทธ๋™์•ˆ ์š”์ฒญ์€ ๋Œ€๊ธฐ!
    → โ— ์ปค๋„ฅ์…˜ ๋งŒ๋“ค ์‹œ๊ฐ„ = ์‘๋‹ต ์ง€์—ฐ ๋ฐœ์ƒ

 ๐Ÿšจ ํ•ต์‹ฌ ๋ฌธ์ œ ์š”์•ฝ

  • minimum-idle๋กœ ์ ๊ฒŒ ์œ ์ง€ํ•˜๋ฉด
    → ํŠธ๋ž˜ํ”ฝ ๊ธ‰์ฆ ์‹œ ์ปค๋„ฅ์…˜ ์ƒ์„ฑ ์ง€์—ฐ
    → ์‘๋‹ต ๋А๋ฆผ / ์„ฑ๋Šฅ ์ €ํ•˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ

  • ๋ฐ˜๋ฉด, ํ’€์„ ํ•ญ์ƒ ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ฉด
    → ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ปค๋„ฅ์…˜์ด ์žˆ์–ด์„œ ๋น ๋ฆ„
    → ์„ฑ๋Šฅ ์•ˆ์ •์„ฑ ๋†’์Œ

๐Ÿ“Œ 4-2. ๊ทธ๋ž˜์„œ ๊ฒฐ๋ก ์€?

๐ŸŽฏ "์„ฑ๋Šฅ ์šฐ์„ "์ด๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ํ•˜์ž!

minimum-idle: ์ƒ๋žตํ•˜๊ฑฐ๋‚˜ maximum-pool-size์™€ ๋™์ผํ•˜๊ฒŒ ์„ค์ •

maximum-pool-size: ์˜ˆ์ƒ ๋™์‹œ ์ ‘์† ์ˆ˜ + ์—ฌ์œ ๋ถ„์œผ๋กœ ์„ค์ •

 

โญ ์ฆ‰, "ํ’€ ์‚ฌ์ด์ฆˆ๋Š” ๊ณ ์ •ํ•ด๋ผ! ์œ ๋™์ ์ธ ๊ฑด ์„ฑ๋Šฅ ์ €ํ•˜์˜ ์›์ธ์ด๋‹ค!"

์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ์„ ๋งบ์„๋•Œ๊นŒ์ง€ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ์ •์ ์ธ ์„ฑ๋Šฅ์„ ๋‚ผ ์ˆ˜ ์—†์œผ๋‹ˆ ๋‚ญ๋น„๋˜๋Š” ์ปค๋„ฅ์…˜ ์ž์›์ด ์žˆ๋”๋ผ๋„ minimum๊ณผ maximum์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ๊ณ ์ •์‹œํ‚ค๋Š”๊ฒŒ ๋” ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค!

 

 

๐Ÿ“Œ 4-3. ๊ทธ๋Ÿผ minimum-idle ์™œ ๋งŒ๋“ค์—ˆ์„๊นŒ?

  • ๋ฆฌ์†Œ์Šค ์•„๋ผ๋Š” ๊ฒŒ ๋” ์ค‘์š”ํ•œ ๊ฒฝ์šฐ
  • AWS Lambda์ฒ˜๋Ÿผ ๋ถ€ํ•˜ ์ ์€ ์„œ๋ฒ„์—์„  ํ•„์š” ์ด์ƒ์œผ๋กœ ์—ฐ๊ฒฐ ์œ ์ง€ํ•˜๋ฉด ๋‚ญ๋น„

 

โžก๏ธ ๊ทธ๋ž˜์„œ "์„ฑ๋Šฅ vs ๋ฆฌ์†Œ์Šค ์ ˆ์•ฝ"์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ ๊ฒƒ!

 

๐Ÿš€4-4. ์š”์•ฝ

ํ•ญ๋ชฉ ์„ค์ •ํ•˜๋ฉด ์ข‹์€ ๊ฒฝ์šฐ ์ฃผ์˜์ 
minimum-idle ์ž‘๊ฒŒ ์„ค์ • ๋ฆฌ์†Œ์Šค ์ ˆ์•ฝ ์ค‘์š”ํ•  ๋•Œ ํŠธ๋ž˜ํ”ฝ ๊ธ‰์ฆ ์‹œ ์ปค๋„ฅ์…˜ ์ƒ์„ฑ ์ง€์—ฐ
minimum-idle = maximum-pool-size ๋˜๋Š” ์ƒ๋žต ์„ฑ๋Šฅ ์šฐ์„ , ์‘๋‹ต์†๋„ ์ค‘์š” ๋ฉ”๋ชจ๋ฆฌ/DB ์ปค๋„ฅ์…˜ ์ž์› ๋งŽ์ด ์”€

 



๐Ÿ“Œ 5. ์ปค๋„ฅ์…˜ ํ’€ ์‚ฐ์ • ์˜ˆ์‹œ (์ชฝ์ง€ ์‹œ์Šคํ…œ)

์˜ˆ๋ฅผ ๋“ค์–ด "์ด์šฉ์ž 1000๋ช…์ธ ์ชฝ์ง€ ์‹œ์Šคํ…œ"์ด๋ผ๋ฉด?
๐Ÿ‘‰ ํ•ต์‹ฌ์€ "ํ‰๊ท  ๋™์‹œ ์š”์ฒญ ์ˆ˜”๋ฅผ ์ž˜ ์ถ”์ •ํ•˜๋Š” ๊ฒƒ!!

 

โœ… 5-1. ์ชฝ์ง€ ์‹œ์Šคํ…œ ํŠน์ง• ๋ถ„์„

  • ์ฝ๊ธฐ: ์ชฝ์ง€ ๋ชฉ๋ก ๋ณด๊ธฐ, ์ฝ๊ธฐ (DB read)
  • ์“ฐ๊ธฐ: ์ชฝ์ง€ ๋ณด๋‚ด๊ธฐ (DB write)
  • ์ฃผ๊ธฐ์  ํด๋ง or ์•Œ๋ฆผ ํ™•์ธ: ์ชฝ์ง€ ๋„์ฐฉ ์—ฌ๋ถ€ ํ™•์ธ (read or API polling)

โžก๏ธ ๋Œ€๋ถ€๋ถ„ ์งง์€ ์š”์ฒญ, ์งง์€ ํŠธ๋žœ์žญ์…˜์ด ๋งŽ๊ณ ,์ง€์†์ ์ธ ์ปค๋„ฅ์…˜ ์ ์œ ๋Š” ๋“œ๋ฌผ๋‹ค.

 

โœ… 5-2. ๋™์‹œ ์ ‘์† ์‚ฌ์šฉ์ž ์ˆ˜ ์ถ”์ •

  • ์ด์šฉ์ž ์ˆ˜: 1000๋ช…
  • ์ผ๋ฐ˜์ ์œผ๋กœ 10~20% ์ •๋„๊ฐ€ ๋™์‹œ ์ ‘์† ์ค‘์ด๋ผ๊ณ  ๋ด„

๐Ÿ‘‰ ์ถ”์ • ๋™์‹œ ์ ‘์†์ž ์ˆ˜: 100~200๋ช…. ๊ทธ๋Ÿฌ๋‚˜, ๋ชจ๋“  ์š”์ฒญ์ด ๋™์‹œ์— DB๋ฅผ ๋•Œ๋ฆฌ๋Š” ๊ฑด ์•„๋‹˜!

  • ๋„คํŠธ์›Œํฌ/ํ”„๋ก ํŠธ ์ฒ˜๋ฆฌ + ์บ์‹ฑ ๋“ฑ์œผ๋กœ ๋ถ„์‚ฐ๋จ
  • ๋™์‹œ DB ์ปค๋„ฅ์…˜์€ ๊ทธ๋ณด๋‹ค ํ›จ์”ฌ ์ ์Œ -> ์‹ค์ œ DB ์ปค๋„ฅ์…˜ ์˜ˆ์ƒ: 10~50๊ฐœ

โœ… 5-3. ์ปค๋„ฅ์…˜ ํ’€ ์ถ”์ฒœ๊ฐ’ (HikariCP ๊ธฐ์ค€)

# application.yml ์˜ˆ์‹œ
spring:
  datasource:
    hikari:
      maximum-pool-size: 30      # ์˜ˆ์ƒ ๋™์‹œ ์ปค๋„ฅ์…˜ ์ˆ˜ + ์—ฌ์œ 
      minimum-idle: 30           # ํ’€ ๊ณ ์ •์œผ๋กœ ๋น ๋ฅธ ์‘๋‹ต
      idle-timeout: 60000        # 1๋ถ„ ์ด์ƒ ์œ ํœด๋ฉด ์ œ๊ฑฐ
      connection-timeout: 3000   # ์ปค๋„ฅ์…˜ ๋ชป ์–ป์œผ๋ฉด 3์ดˆ๋งŒ ๋Œ€๊ธฐ

 

๐Ÿš€ 5-4. ์ถ”๊ฐ€ ํŒ

  • ํ”ผํฌ ํƒ€์ž„์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์„œ ํŠœ๋‹ ํ•„์š”
  • DB๊ฐ€ ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ปค๋„ฅ์…˜ ์ˆ˜๋„ ํ™•์ธํ•ด์•ผ ํ•จ!
  • ์บ์‹ฑ(Memcached, Redis ๋“ฑ) ๊ณ ๋ คํ•˜๋ฉด ํ’€ ๋” ์ž‘๊ฒŒ ํ•ด๋„ ๋จ.