OSIV νŒŒν—€μΉ˜κΈ° - sse κ΅¬ν˜„ 쀑 HikariPool-1 - Connection is not available μ—λŸ¬

sseλ₯Ό μ‚¬μš©ν•œ μ‹€μ‹œκ°„ μ•Œλ¦Ό μ„œλΉ„μŠ€ κ΅¬ν˜„ ν›„ μ„œλ²„κ°€ 잘 λŒμ•„κ°€λ‹€ λͺ‡ 번 μš”μ²­ μ‹œλ„ 끝에 λ»—λŠ” μ—λŸ¬κ°€ λ°œμƒν–ˆλ‹€. κ²°λ‘ λΆ€ν„° λ§ν•˜λ©΄ DBμ™€μ˜ 컀λ„₯μ…˜μ΄ λŠμ–΄μ§€μ§€μ•Šμ•„ 생긴 μ—λŸ¬μ˜€λ‹€. 

 

이 μ—λŸ¬λ₯Ό ν•΄κ²° ν•˜λ©΄μ„œJPA의 OSIV에 λŒ€ν•΄ λ‹€μ‹œκΈˆ 곡뢀할 수 μžˆμ—ˆλ‹€.

 

 

OSIV (open session in view)

 

OSIV의 λ™μž‘ μ›λ¦¬λŠ” μ•„λž˜μ™€ κ°™λ‹€

  • ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”청이 λ“€μ–΄μ˜€λ©΄ μ„œλΈ”λ¦Ώ ν•„ν„°λ‚˜, μŠ€ν”„링 μΈν„°μ…‰ν„°μ—μ„œ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•œλ‹€. λ‹¨ μ΄ μ‹œμ μ—μ„œ νŠΈλžœμž­μ…˜μ€ μ‹œμž‘ν•˜μ§€ μ•ŠλŠ”λ‹€. 
  • μ„œλΉ„μŠ€ κ³„μΈ΅μ—μ„œ @Transeactional둜 νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•  λ•Œ 1λ²ˆμ—μ„œ λ―Έλ¦¬ μƒμ„±ν•΄λ‘” μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλ₯Ό μ°Ύμ•„μ™€μ„œ νŠΈλžœμž­μ…˜μ„ μ‹œμž‘ν•œλ‹€. 
  • μ„œλΉ„μŠ€ κ³„측이 λλ‚˜λ©΄ νŠΈλžœμž­μ…˜μ„ μ»€λ°‹ν•˜κ³  μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλ₯Ό ν”ŒλŸ¬μ‹œν•œλ‹€. μ΄ μ‹œμ μ— νŠΈλžœμž­μ…˜μ€ λλ‚΄μ§€λ§Œ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλŠ” μ’…λ£Œλ˜μ§€ μ•ŠλŠ”λ‹€. 
  • μ»¨νŠΈλ‘€λŸ¬μ™€ λ·°κΉŒμ§€ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈκ°€ μœ μ§€λ˜λ―€λ‘œ μ‘°νšŒν•œ μ—”ν‹°ν‹°λŠ” μ˜μ† μƒνƒœλ₯Ό μœ μ§€ν•œλ‹€. 
  • μ„œλΈ”λ¦Ώ ν•„ν„°λ‚˜, μŠ€ν”„링 μΈν„°μ…‰ν„°λ‘œ μš”청이 λŒμ•„μ˜€λ©΄ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλ₯Ό μ’…λ£Œν•œλ‹€.

 

μ‚¬μ§„μ—μ„œ λ³Ό 수 μžˆλ“œμ‹œ μ„œλΉ„μŠ€ κ³„μΈ΅μ—μ„œ νŠΈλžœμž­μ…˜μ΄ λλ‚˜λ©΄ μ»¨νŠΈλ‘€λŸ¬μ™€ λ·°μ—λŠ” νŠΈλžœμž­μ…˜μ΄ μœ μ§€λ˜μ§€ μ•ŠλŠ” μƒνƒœμ΄λ‹€. μ—”ν‹°ν‹°λ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  λ‹¨μˆœνžˆ 쑰회만 κ°€λŠ₯ν•˜λ‹€.

μ΄λ•Œ λ§Œμ•½ ν”„λ‘μ‹œλ₯Ό λ·° λ Œλ”λ§ν•˜λŠ” κ³Όμ •μ— μ΄ˆκΈ°ν™”(Lazy loading)κ°€ μΌμ–΄λ‚˜κ²Œ λ˜μ–΄λ„ 쑰회 κΈ°λŠ₯μ΄λ―€λ‘œ νŠΈλžœμž­μ…˜μ΄ 없이 읽기가 κ°€λŠ₯ν•˜λ‹€.

ν•˜μ§€λ§Œ νŠΈλžœμž­μ…˜μ΄ λλ‚œ μ‹œμ μ΄κΈ° λ•Œλ¬Έμ— μˆ˜μ •μ€ λΆˆκ°€λŠ₯ν•˜λ‹€. 

 

 

OSIV μ „λž΅μ€ νŠΈλžœμž­μ…˜ μ‹œμž‘μ²˜λŸΌ 졜초 λ°μ΄ν„°λ² μ΄μŠ€ 컀λ„₯μ…˜ μ‹œμž‘ μ‹œμ λΆ€ν„° API 응닡이 끝날 λ•Œ κΉŒμ§€ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ™€ λ°μ΄ν„°λ² μ΄μŠ€ 컀λ„₯μ…˜μ„ μœ μ§€ν•œλ‹€.

κ·Έλž˜μ„œ View Templateμ΄λ‚˜ API μ»¨νŠΈλ‘€λŸ¬μ—μ„œ 지연 λ‘œλ”©μ΄ κ°€λŠ₯ν•˜λ‹€. 지연 λ‘œλ”©μ€ μ˜μ†μ„± μ»¨ν…μŠ€νŠΈκ°€ μ‚΄μ•„μžˆμ–΄μ•Ό κ°€λŠ₯ν•˜κ³ , μ˜μ†μ„± μ»¨ν…μŠ€νŠΈλŠ” 기본적으둜 λ°μ΄ν„°λ² μ΄μŠ€ 컀λ„₯μ…˜μ„ μœ μ§€ν•œλ‹€. 이것 μžμ²΄κ°€ 큰 μž₯점이닀.

 

ν•˜μ§€λ§Œ 이 μ „λž΅μ€ λ„ˆλ¬΄ μ˜€λžœμ‹œκ°„λ™μ•ˆ λ°μ΄ν„°λ² μ΄μŠ€ μ»€λ„₯μ…˜ λ¦¬μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ—, μ‹€μ‹œκ°„ νŠΈλž˜ν”½μ΄ μ€‘μš”ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” μ»€λ„₯μ…˜μ΄ λͺ¨μžλž„ μˆ˜ μžˆλ‹€. μ΄κ²ƒμ€ κ²°κ΅­ μž₯μ• λ‘œ μ΄μ–΄μ§„λ‹€.

 

 

OSIV와 SSE

OSIV와 SSEλ₯Ό ν•¨κ»˜ μ‚¬μš©ν•  땐 μ£Όμ˜ν•΄μ•Ό ν•  점이 μžˆλ‹€. SSE의 톡신 κ°œλ…μ€ 이전 κΈ€μ—μ„œ 닀룬 적이 κ°€λ³κ²Œ λ„˜μ–΄κ°€κ² λ‹€. SSEλŠ” μ„œλ²„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈμ™€μ˜ 컀λ„₯μ…˜μ„ λŠμ§€μ•Šκ³  λ¬Όκ³  μžˆλ‹€κ°€ event λ°œμƒ μ‹œ ν΄λΌμ΄μ–ΈνŠΈλ‘œ 데이터λ₯Ό μ£ΌλŠ” κ°œλ…μ΄λ‹€.  λ‚΄ μ½”λ“œμ—μ„œ λ¬Έμ œμ μ€ μ•Œλ¦Όμ„ λ³΄λ‚΄λŠ” μ„œλΉ„μŠ€ ν΄λž˜μŠ€μ— νŠΈλžœμž­μ…˜μ„ λΆ™μ—¬λ†¨λ˜ κ²ƒμ΄μ—ˆλ‹€. 

 

 

클래슀 μƒμ„±ν•˜λ©° 아무 생각없이 λΆ™μ˜€λ˜ νŠΈλžœμž­μ…˜μ΄ μ—λŸ¬μ˜ 원인이라곀 μƒκ°ν•˜μ§€ λͺ» ν–ˆλ‹€. μ§€κΈˆ μƒκ°ν•˜λ©΄ λ‹Ήμ—°ν•œκ±΄λ° 그땐 μ „ν˜€ μƒκ°ν•˜μ§€ λͺ»ν–ˆλ‹€ γ… γ… ..

헀더에 subscribe λ‘œμ§μ„ 넣어두고 νŽ˜μ΄μ§€ 이동할 λ•Œλ§ˆλ‹€ subscribe μš”μ²­μ„ λ³΄λƒˆλŠ”λ° @Transaction이 κ±Έλ €μžˆμ–΄ DBμ™€μ˜ 컀λ„₯μ…˜μ„ λŠμ§€ λͺ» ν–ˆλ˜ 것 κ°™λ‹€.

 

λ‹€λ₯Έ 뢄듀은 보톡 sseλ₯Ό κ΅¬ν˜„ν•  땐 OSIVλ₯Ό 끄고 ν•œλ‹€κ³  ν•œλ‹€. 일반적으둠 HTTP 호좜이 λλ‚˜κ³  DB 컀λ„₯μ…˜λ„ μ’…λ£Œλ˜λ‚˜, SSE μ‚¬μš©μ‹œμ—λŠ” 객체가 만료되기 μ „κΉŒμ§€ κ³„μ†ν•΄μ„œ DB 컀λ„₯μ…˜μ΄ μ—΄λ € 고갈되기 λ•Œλ¬Έμ΄λ‹€.

 

 

 

μΆ”κ°€λ‘œ OSIVλ₯Ό 끄면 λͺ¨λ“  μ§€μ—°λ‘œλ”©μ„ νŠΈλžœμž­μ…˜ μ•ˆμ—μ„œ μ²˜λ¦¬ν•΄μ•Ό ν•œλ‹€. ν•˜μ§€λ§Œ λ‚΄κ°€ μ§  μ½”λ“œλŠ” μ „λΆ€ νŠΈλžœμž­μ…˜ μ•ˆμ—μ„œ μ§€μ—°λ‘œλ”©μ„ μˆ˜ν–‰ν–ˆκΈ° λ•Œλ¬Έμ— μ‰½κ²Œ 끌 수 μžˆμ—ˆλ‹€.