컀λ₯μ μ΄λ (컀λ₯μ ν, 컀λ₯μ κ³ κ°)
컀λ₯μ (Connection)μ΄λ?
DBμ μ ν리μΌμ΄μ μ μλ 'ν΅λ‘'
μΌλ°μ μΌλ‘ μΉ μ ν리μΌμ΄μ μ μμ²μ λ°μΌλ©΄ λ°μ΄ν°λ² μ΄μ€(DB)μ μ 보λ₯Ό μ‘°ννκ±°λ λ³κ²½ν λ€ κ·Έ κ²°κ³Όλ₯Ό λ°ννλ€. μ΄λ μ ν리μΌμ΄μ μ΄ DBμ λννκΈ° μν΄μλ μ°κ²°μ΄ νμνλ€. μ΄ ν΅λ‘κ° λ°λ‘ 컀λ₯μ (Connection)μ΄λ€.
컀λ₯μ
μμ±μλ λΉμ©μ΄ λ λ€.
컀λ₯μ μ μμ±νλ λ°μλ μκ°λ³΄λ€ λ§μ λΉμ©μ΄ λ λ€. μλ₯Ό λ€μ΄,
- λ€νΈμν¬ μμΌμ μ΄κ³
- μΈμ¦(μ¬μ©μλͺ /λΉλ°λ²νΈ) κ³Όμ μ κ±°μΉκ³
- 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μ μ κ·Ό λΆκ°λ₯ν μν.