Spring/JPA

컀λ„₯μ…˜μ΄λž€ (컀λ„₯μ…˜ ν’€, 컀λ„₯μ…˜ 고갈)

Huijinn 2024. 12. 7. 21:44

컀λ„₯μ…˜(Connection)μ΄λž€?

DB와 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μž‡λŠ” 'ν†΅λ‘œ'

일반적으둜 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μš”μ²­μ„ λ°›μœΌλ©΄ λ°μ΄ν„°λ² μ΄μŠ€(DB)에 정보λ₯Ό μ‘°νšŒν•˜κ±°λ‚˜ λ³€κ²½ν•œ λ’€ κ·Έ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€. μ΄λ•Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ DB와 λŒ€ν™”ν•˜κΈ° μœ„ν•΄μ„œλŠ” 연결이 ν•„μš”ν•˜λ‹€. 이 ν†΅λ‘œκ°€ λ°”λ‘œ 컀λ„₯μ…˜(Connection)이닀.

 

컀λ„₯μ…˜ μƒμ„±μ—”λŠ” λΉ„μš©μ΄ λ“ λ‹€.

컀λ„₯μ…˜μ„ μƒμ„±ν•˜λŠ” λ°μ—λŠ” 생각보닀 λ§Žμ€ λΉ„μš©μ΄ λ“ λ‹€. 예λ₯Ό λ“€μ–΄,

  1. λ„€νŠΈμ›Œν¬ μ†ŒμΌ“μ„ μ—΄κ³ 
  2. 인증(μ‚¬μš©μžλͺ…/λΉ„λ°€λ²ˆν˜Έ) 과정을 거치고
  3. DB와 ν•Έλ“œμ…°μ΄ν¬(λŒ€ν™” μ€€λΉ„) ν•˜λŠ” κ³Όμ •

등이 ν•„μš”ν•˜λ‹€. 이런 과정을 λ§€ μš”μ²­λ§ˆλ‹€ μƒˆλ‘œ ν•˜λ©΄ λΆˆν•„μš”ν•œ μ‹œκ°„ λ‚­λΉ„κ°€ 컀진닀.


컀λ„₯μ…˜ ν’€(Connection Pool)μ΄λž€?

미리 컀λ„₯μ…˜μ„ λ§Œλ“€μ–΄λ‘λŠ” μ „λž΅

컀λ„₯μ…˜μ„ 맀번 μƒˆλ‘œ λ§Œλ“œλŠ” λŒ€μ‹ , 컀λ„₯μ…˜ ν’€(Connection Pool)μ΄λΌλŠ” μ €μž₯μ†Œμ— 일정 개수의 컀λ„₯μ…˜μ„ 미리 λ§Œλ“€μ–΄ λ†“λŠ”λ‹€. 그리고 μš”μ²­μ΄ λ“€μ–΄μ˜¬ λ•Œλ§ˆλ‹€ 이 ν’€μ—μ„œ 컀λ„₯μ…˜μ„ ν•˜λ‚˜ λŒ€μ—¬(νšλ“)ν•΄ μ‚¬μš©ν•œ λ’€, μ‚¬μš©μ΄ λλ‚˜λ©΄ λ‹€μ‹œ ν’€λ‘œ λŒλ €μ£ΌλŠ” λ°©μ‹μœΌλ‘œ κ΄€λ¦¬ν•œλ‹€.

컀λ„₯μ…˜ ν’€μ˜ μž₯점

  • μ„±λŠ₯ ν–₯상: 맀번 컀λ„₯μ…˜μ„ μƒμ„±ν•˜μ§€ μ•Šκ³  μž¬μ‚¬μš©ν•˜λ―€λ‘œ DB μ ‘κ·Ό 속도가 빨라진닀.
  • μžμ› 관리 용이: μ‚¬μš© κ°€λŠ₯ν•œ 컀λ„₯μ…˜ 수λ₯Ό ν•œμ •ν•˜κ³  λͺ¨λ‹ˆν„°λ§ν•˜κΈ° μ‰½κ²Œ λ§Œλ“€μ–΄ μ‹œμŠ€ν…œ μ•ˆμ •μ„±μ„ 높인닀.

컀λ„₯μ…˜ ν’€ μ„€μ •

컀λ„₯μ…˜ ν’€μ—λŠ” μ΅œμ†Œ/μ΅œλŒ€ 컀λ„₯μ…˜ 개수, 컀λ„₯μ…˜ λŒ€κΈ° μ‹œκ°„, 컀λ„₯μ…˜ μœ μ§€ μ‹œκ°„ λ“±μ˜ 섀정이 μžˆλ‹€. 이 섀정을 톡해 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ νŒ¨ν„΄(νŠΈλž˜ν”½, 쿼리 처리 μ‹œκ°„ λ“±)에 맞게 ν’€μ˜ 크기와 λ™μž‘ 방식을 νŠœλ‹ν•  수 μžˆλ‹€.


컀λ„₯μ…˜ 고갈(Connection Exhaustion)μ΄λž€?

1. 컀λ„₯μ…˜μ΄ λͺ¨λ‘ λ°”λ‹₯났닀면?

컀λ„₯μ…˜ 풀에 컀λ„₯μ…˜μ€ μœ ν•œν•˜λ‹€. λ§Žμ€ μš”μ²­μ΄ ν•œκΊΌλ²ˆμ— λͺ°λ € λͺ¨λ“  컀λ„₯μ…˜μ΄ 이미 μ‚¬μš© 쀑인 상황을 μƒκ°ν•΄λ³΄μž. μƒˆλ‘œ λ“€μ–΄μ˜¨ μš”μ²­μ€ μ‚¬μš©ν•  수 μžˆλŠ” 컀λ„₯μ…˜μ„ ν’€μ—μ„œ λ°›μ§€ λͺ»ν•œλ‹€.
μ΄λ ‡κ²Œ ν’€ μ•ˆμ— 남은 컀λ„₯μ…˜μ΄ ‘0’이 λ˜μ–΄ μš”μ²­μ΄ λŒ€κΈ°ν•˜κ±°λ‚˜ μ‹€νŒ¨ν•˜λŠ” ν˜„μƒμ„ 컀λ„₯μ…˜ 고갈(Connection Exhaustion)이라고 ν•œλ‹€.

2. μ™œ 컀λ„₯μ…˜ 고갈이 μΌμ–΄λ‚ κΉŒ?

  • κ³Όλ„ν•œ νŠΈλž˜ν”½: λ™μ‹œμ— 맀우 λ§Žμ€ μš”μ²­μ΄ DB에 μ ‘κ·Όν•˜λ € ν•  λ•Œ.
  • κΈ΄ 쿼리 처리 μ‹œκ°„: ν•˜λ‚˜μ˜ μš”μ²­μ΄ DB 컀λ„₯μ…˜μ„ μž₯μ‹œκ°„ μ μœ ν•˜λ©΄, λ‹€λ₯Έ μš”μ²­μ΄ μ‚¬μš©ν•  컀λ„₯μ…˜μ΄ μ—†μ–΄μ§ˆ 수 μžˆλ‹€.
  • 컀λ„₯μ…˜ λ°˜λ‚© λˆ„λ½: 컀λ„₯μ…˜μ„ μ‚¬μš©ν•œ λ’€ 풀에 λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ” ν”„λ‘œκ·Έλž˜λ° μ‹€μˆ˜λ‘œ 컀λ„₯μ…˜μ΄ 사라진 듯이 λ³΄μ΄λŠ” 상황.

3. 컀λ„₯μ…˜ 고갈 μ‹œ λ°œμƒν•˜λŠ” 문제

  • μƒˆ μš”μ²­μ΄ DB에 μ ‘κ·Όν•˜μ§€ λͺ»ν•΄ 응닡 μ§€μ—° λ˜λŠ” μ—λŸ¬ λ°œμƒ
  • 전체 μ‹œμŠ€ν…œ 응닡성 μ €ν•˜, μ‹¬ν•˜λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μž₯μ• 
  • μ˜ˆμ™Έ λ°œμƒ

컀λ„₯μ…˜ 관리와 μ΅œμ ν™”λ₯Ό μœ„ν•œ 팁

1. μ μ ˆν•œ ν’€ μ‚¬μ΄μ¦ˆ μ„€μ •

ν’€ 크기가 λ„ˆλ¬΄ μž‘μœΌλ©΄ 쑰금만 λΆ€ν•˜κ°€ 와도 고갈될 수 있고, λ„ˆλ¬΄ 크면 DB μ„œλ²„μ— κ³Όλ„ν•œ λΆ€ν•˜λ₯Ό 쀄 수 μžˆλ‹€. λͺ¨λ‹ˆν„°λ§ 도ꡬ(예: Prometheus, New Relic)λ‚˜ 벀치마크 ν…ŒμŠ€νŠΈλ₯Ό 톡해 μ μ ˆν•œ 값을 μ°ΎλŠ” 것이 μ€‘μš”ν•˜λ‹€.

2. 쿼리 μ΅œμ ν™”

쿼리 μ‹œκ°„μ΄ 쀄어듀면 컀λ„₯μ…˜ λ°˜ν™˜λ„ 빨라진닀. 인덱슀 νŠœλ‹, 쿼리 μž¬μž‘μ„±, 캐싱 등을 톡해 DB λΆ€ν•˜λ₯Ό 쀄일 수 μžˆλ‹€.

3. νƒ€μž„μ•„μ›ƒ μ„€μ •

컀λ„₯μ…˜ νšλ“ λŒ€κΈ° μ‹œκ°„μ΄λ‚˜ μ΅œλŒ€ 쿼리 μ‹€ν–‰ μ‹œκ°„ 등을 μ œν•œν•΄, λΉ„μ •μƒμ μœΌλ‘œ 였래 κ±Έλ¦¬λŠ” μš”μ²­μ„ κ°•μ œλ‘œ μ€‘λ‹¨ν•˜κ³  λ¦¬μ†ŒμŠ€λ₯Ό νšŒμˆ˜ν•  수 μžˆλ‹€.

4. 정상적인 컀λ„₯μ…˜ λ°˜λ‚© 보μž₯

μŠ€ν”„λ§ νŠΈλžœμž­μ…˜ 관리(@Transactional) ν™œμš©μœΌλ‘œ 컀λ„₯μ…˜μ„ μžλ™μœΌλ‘œ κ΄€λ¦¬ν•˜λ„λ‘ ν•΄, 컀λ„₯μ…˜ λ°˜λ‚© λˆ„λ½μ„ λ°©μ§€ν•œλ‹€.


@Transactionalκ³Ό 컀λ„₯μ…˜

μŠ€ν”„λ§μ—μ„œ @Transactional μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λ©΄, νŠΈλžœμž­μ…˜ κ²½κ³„μ—μ„œ 컀λ„₯μ…˜μ„ νšλ“ν•˜κ³ , λ©”μ†Œλ“œ 싀행이 λλ‚˜λ©΄ 컀λ„₯μ…˜μ„ ν’€λ‘œ λ°˜ν™˜ν•˜λŠ” 과정을 μžλ™μœΌλ‘œ μ²˜λ¦¬ν•œλ‹€. μ΄λŠ” μ•ˆμ •μ μΈ 컀λ„₯μ…˜ 관리에 도움이 λœλ‹€.

  • readOnly νŠΈλžœμž­μ…˜: @Transactional(readOnly = true)λ₯Ό μ‚¬μš©ν•˜λ©΄ 더티 체킹(Dirty Checking) 등을 μƒλž΅ν•΄ 컀λ„₯μ…˜ μ‚¬μš©μ„ μ΅œμ ν™”ν•  수 μžˆλ‹€.

정리

  • 컀λ„₯μ…˜: μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό DB μ‚¬μ΄μ˜ λŒ€ν™” ν†΅λ‘œ.
  • 컀λ„₯μ…˜ ν’€: 미리 λ§Œλ“€μ–΄λ‘” 컀λ„₯μ…˜μ„ μ‚¬μš©ν•˜λŠ” ν’€.
  • 컀λ„₯μ…˜ 고갈: 컀λ„₯μ…˜μ΄ λͺ¨λ‘ μ†Œμ§„λ˜μ–΄ μƒˆλ‘œμš΄ μš”μ²­μ΄ DB에 μ ‘κ·Ό λΆˆκ°€λŠ₯ν•œ μƒνƒœ.