Skip to content

Latest commit

Β 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Β 
Β 

README.md

Open session in view (OSIV)?

  • 말 κ·ΈλŒ€λ‘œ 해석해보면 μ„Έμ…˜μ„ view λ ˆμ΄μ–΄μ—λ„ μ—΄μ–΄λ‘”λ‹€.
  • μ„Έμ…˜μ€ λ°μ΄ν„°λ² μ΄μŠ€μ™€ μ—°κ²°λœ 객체은 session을 μ˜λ―Έν•˜λŠ” λ“―ν•˜κ³ .
  • 보톡 μ΄λŸ¬ν•œ μ„Έμ…˜μ€ νŠΈλžœμž­μ…˜κ³Ό 생λͺ…μ£ΌκΈ°λ₯Ό 같이 ν•˜λŠ” 걸둜 μ•Œκ³  μžˆλŠ”λ°, 이 뢀뢄을 λ„˜μ–΄μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” κΈ°μˆ μ„ λ§ν•˜λŠ” λ“―.
  • LazyInitializationException 와도 많이 연관이 μžˆλŠ” ν‚€μ›Œλ“œ μž„.
    • 이 μ—λŸ¬λŠ” νŠΈλžœμž­μ…˜ λ²”μœ„λ₯Ό λ„˜μ–΄μ„œ, lazy field에 μ ‘κ·Όν•˜λ € ν•˜λ©΄ λ˜μ Έμ§€λŠ” μ—λŸ¬ 인듯.

Spring / Hibernate..

  • Springμ—μ„œλŠ” Hibernate.support νŒ¨ν‚€μ§€ μ•„λž˜μ— 이 κΈ°λŠ₯을 λ„μ™€μ£ΌλŠ” ν΄λž˜μŠ€κ°€ μžˆλŠ”λ“―.
  • OpenSessionInViewInterceptor
    • μƒμ„±μžμ—λŠ” sessionFactory κ°€ 듀어감.
    • Spring web request interceptor that binds a Hibernate Session to the thread for the entire processing of the request.
    • μ›Ή requestκ°€ 듀어왔을 λ•Œ, λ§€μΉ­λ˜λŠ” μŠ€λ ˆλ“œμ— λ°”μΈλ”©λ˜λŠ” session을 κ°€μ§€κ³  μžˆλŠ” interceptor class인듯.
  • μ–΄λ–»κ²Œ μŠ€ν”„λ§μ—μ„œ μ΄μš©ν•  μ§€ 정리해보면,
    1. request μ‹œμž‘μ—, μŠ€ν”„λ§μ€ OpenSessionInViewInterceptor 생성. 이 μš”μ²­μ— λ§€μΉ­λ˜λŠ” interceptor 클래슀λ₯Ό λ§Œλ“€μ–΄λ†“λŠ”λ“―.
    2. μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ, μ„Έμ…˜μ΄ ν•„μš”ν•΄μ§€λŠ” νŠΉμ • μ‹œμ μ΄ μžˆλ‹€λ©΄ (νŠΈλžœμž­μ…˜ λ²”μœ„λ₯Ό λ²—μ–΄λ‚œ Lazy loading), OpenSessionInViewInterceptor μ—μ„œ λ°˜ν™˜λ°›μ€ μ„Έμ…˜μ„ 톡해 ν•΄κ²°ν•˜λŠ” λ“―
    3. request μ‹œμ  λ§ˆμ§€λ§‰μ—λŠ”, μ‚¬μš©λ˜μ—ˆλ˜ μ„Έμ…˜μ„ λͺ¨λ‘ μ •λ¦¬ν•˜λŠ” 과정이 있고.
  • κ·ΈλŸ¬λ‹ˆκΉŒ 핡심은, 이름 처럼 view λ‹¨μ—μ„œ (html...) μ—μ„œλ§Œ μ‚¬μš©λ˜λŠ” 것이 μ•„λ‹Œ λ“―.
  • νŠΈλžœμž­μ…˜ λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜ μ ‘κ·Όν•˜λŠ” 경우, μ‚¬μš©λ˜κ²Œ λ˜λŠ”λ“―.

On Developer Productivity

  • osivλ₯Ό μ‚¬μš©ν•˜λ©΄ 쒋은 점은 μš°μ„  νŽΈν•¨ 즉 LazyInitializationException 을 κ±±μ •ν•˜μ§€ μ•Šμ•„λ„ 됨.

    • λ˜ν•œ Session 의 생λͺ…μ£ΌκΈ°λ₯Ό 관리해주기 λ•Œλ¬Έμ—.
  • osiv κ°€ μΌœμ ΈμžˆλŠ” μƒνƒœμ—μ„œ νŠΈλžœμž­μ…˜ λ²”μœ„ λ°–μ—μ„œ lazy fieldλ₯Ό μ‘°νšŒν•œλ‹€λ©΄ μ•„λž˜μ™€ 같은 λ¬Έμ œκ°€ λ°œμƒν•  수 있음.

    1. exhausting the Connection Pool
      • μ„Έμ…˜μ΄ request μ’…λ£Œμ‹œκΉŒμ§€ λ‚¨μ•„μžˆμ„ μˆ˜λ„ 있기 λ•Œλ¬Έμ—, μœ„μ™€ 같은 λ¬Έμ œκ°€ λ°œμƒν•  수 있음.
      • 더 심해지면, application 응닡이 μ•„μ˜ˆ μ•ˆλ˜λŠ” λ¬Έμ œλ„ μžˆμ„ 수 있음.
    2. unnecessary Queries
      • λΆˆν•„μš”ν•œ 쿼리가 λ°œμƒν•œλ‹€.
      • 즉 μ§„μ§œ ν•„μš”ν•œ ν•„λ“œ 이외에 λ‹€λ₯Έ ν•„λ“œ (lazy) μ ‘κ·Όλ§ŒμœΌλ‘œλ„ κ°œλ°œμžκ°€ μƒκ°ν•˜μ§€ λͺ»ν•œ 쿼리가 싀행될 수 있음.
      • μ΄λŸ¬ν•œ μΏΌλ¦¬λŠ” auto-commit λͺ¨λ“œλ‘œ 싀행됨.
  • 그리고 osivκ°€ κΊΌμ Έμžˆλ‹€λ©΄, νŠΈλžœμž­μ…˜ λ²”μœ„ μ•ˆμ—μ„œ, ν•„μš”ν•œ ν•„λ“œ (lazy field) λ₯Ό initialize ν•΄μ€˜μ•Όν•¨.

    • κ·Έ κ³Όμ •μ—μ„œ Hibernate.initialize() λ₯Ό μ΄μš©ν•˜λŠ”λ“―.

Alternatives

  • osivλ₯Ό μ΄μš©ν•˜λŠ” κ±° 말고, λŒ€μ•ˆμ€?

Entity Graphs

  • @EntityGraph λΌλŠ” μ–΄λ…Έν…Œμ΄μ…˜μ—, 미리 fetchν•˜κ³  싢은 속성을 κΈ°μž¬ν•¨μœΌλ‘œμ¨, 쿼리 λ ˆλ²¨μ—μ„œ ν•„μš”ν•œ ν•„λ“œμ— λŒ€ν•œ 정보λ₯Ό λͺ¨λ‘ κ°€μ Έμ˜€λ„λ‘ ν•˜λŠ” 방법

Hibernate.initialize()

  • μœ„μ—μ„œλ„ μ–ΈκΈ‰ν–ˆμ§€λ§Œ, 쑰회 후에, ν•΄λ‹Ή μ—”ν‹°ν‹°μ˜ Lazy field (좔후에 ν•„μš”ν•œ ν•„λ“œ) 에 hibernate μ—μ„œ μ œκ³΅ν•˜λŠ” λ©”μ„œλ“œλ₯Ό 이용. Lazy ν•œ 쿼리λ₯Ό λ°œμƒ μ‹œμΌœμ„œ ν•„μš”ν•œ ν•„λ“œλ§Œ μ‘°νšŒν•˜λ„λ‘ ν•˜λŠ” 방법.
  • 이 방법은 좔가적인 쿼리(μ΅œμ†Œν•œ ν•œ 개 이상)κ°€ λ°œμƒλœλ‹€λŠ” 단점이 있음.

Fetch Joins

  • ν•˜λ‚˜μ˜ 쿼리에, ν•„μš”ν•œ 정보λ₯Ό λͺ¨λ‘ κ°€μ Έμ˜€κ²Œ 함.
  • Entity graph와 거의 λ™μΌν•œ λͺ©μ μœΌλ‘œ λ³΄μ΄μ§€λ§Œ, μ•„λ§ˆ λ°©λ²•λ‘ μ—μ„œ 차이가 μžˆμ„λ“―.

Conclusion

Reference