OSIV (Open Session In View)
- OSIV λ μμμ± μ»¨ν μ€νΈλ₯Ό λ·°κΉμ§ μ΄μ΄λλ κΈ°λ₯
- μμμ± μ»¨ν μ€νΈκ° μ μ§λλ©΄ μν°ν°λ μμ μνλ‘ μ μ§λ¨
- λ·°κΉμ§ μμμ± μ»¨ν μ€νΈκ° μ΄μμλ€λ©΄ λ·°μμλ μ§μ° λ‘λ©μ μ¬μ© κ°λ₯
OSIV λμ μ리
μ€νλ§ νλ μμν¬κ° μ 곡νλ OSIVλ λΉμ¦λμ€ κ³μΈ΅μμ νΈλμμ
μ μ¬μ©νλ OSIV
μμμ± μ»¨ν
μ€νΈλ μ¬μ©μμ μμ² μμ μμ μμ±λμ§λ§, λ°μ΄ν°λ₯Ό μ°κ±°λ μμ ν μ μλ νΈλμμ
μ λΉμ¦λμ€ κ³μΈ΅μμλ§ μ¬μ©ν μ μλλ‘ νΈλμμ
μ΄ μΌμ΄λ¨
spring.jpa.open-in-view:true
κΈ°λ³Έκ°
Spring Boot JPA μμ‘΄μ±μ μ£Όμ
λ°μ μ ν리μΌμ΄μ
μ ꡬμ±ν κ²½μ° spring.jpa.open-in-view
μ κΈ°λ³Έκ°μΈ trueλ‘ μ§μ λμ΄ μμ΄ OSIVκ° μ μ©λ μνλ‘ μ ν리μΌμ΄μ
μ΄ κ΅¬μ±λ¨
- ν΄λΌμ΄μΈνΈμ μμ²μ΄ λ€μ΄μ€λ©΄ μλΈλ¦Ώ νν°λ, μ€νλ§ μΈν°μ
ν°μμ μμμ± μ»¨ν
μ€νΈλ₯Ό μμ±
λ¨, μ΄ μμ μμ νΈλμμ μ μμνμ§ μμ
- μλΉμ€ κ³μΈ΅μμ
@Transactional
λ‘ νΈλμμ μ΄ μμν λ 1λ²μμ 미리 μμ±ν΄λ μμμ± μ»¨ν μ€νΈλ₯Ό μ°Ύμμμ νΈλμμ μ μμ - μλΉμ€ κ³μΈ΅μ΄ λλλ©΄ νΈλμμ
μ 컀λ°νκ³ μμμ± μ»¨ν
μ€νΈλ₯Ό νλ¬μ
μ΄ μμ μ νΈλμμ μ λλ΄μ§λ§ μμμ± μ»¨ν μ€νΈλ μ’ λ£λμ§ μμ
- 컨νΈλ‘€λ¬μ λ·°κΉμ§ μμμ± μ»¨ν μ€νΈκ° μ μ§λλ―λ‘ μ‘°νν μν°ν°λ μμ μνλ₯Ό μ μ§
- μλΈλ¦Ώ νν°λ, μ€νλ§ μΈν°μ
ν°λ‘ μμ²μ΄ λμμ€λ©΄ μμμ± μ»¨ν
μ€λ₯Ό μ’
λ£
μ΄ λ, νλ¬μλ₯Ό νΈμΆνμ§ μκ³ λ°λ‘ μ’ λ£
μλΉμ€ κ³μΈ΅μμ νΈλμμ
μ΄ λλλ©΄ 컨νΈλ‘€λ¬μ λ·°μλ νΈλμμ
μ΄ μ μ§λμ§ μλ μνμ΄λ€. μν°ν°λ₯Ό λ³κ²½νμ§ μκ³ λ¨μν μ‘°νλ§ ν λλ νΈλμμ
μ΄ μμ΄λ λμνλλ°, μ΄κ²μ νΈλμμ
μμ΄ μ½κΈ°(Nontransactional reads)
λΌ νλ€. νμ¬ λ§μ½ νλ‘μλ₯Ό λ·° λ λλ§νλ κ³Όμ μ μ΄κΈ°ν(Lazy Loading)
μ΄ μΌμ΄λκ² λμ΄λ μ‘°ν κΈ°λ₯μ΄λ―λ‘ νΈλμμ
μμ΄ μ½κΈ°κ° κ°λ₯νλ€.
- μμμ± μ»¨ν μ€νΈλ κΈ°λ³Έμ μΌλ‘ νΈλμμ λ²μ μμμ μν°ν°λ₯Ό μ‘°ννκ³ μμ ν μ μλ€.
- μμμ± μ»¨ν
μ€νΈλ νΈλμμ
λ²μ λ°μμ μν°ν°λ₯Ό μ‘°νλ§ ν μ μλ€. μ΄κ²μ νΈλμμ
μμ΄ μ½κΈ°
(Nontransactional reads)
λΌ νλ€.
λ§μ½ νΈλμμ λ²μ λ°μΈ 컨νΈλ‘€λ¬μ λ·°μμ μν°ν°λ₯Ό μμ νμ¬λ μμμ± μ»¨ν μ€νΈμ λ³κ²½ κ°μ§μ μν λ°μ΄ν° μμ μ΄ λ€μ 2κ°μ§ μ΄μ λ‘ λμνμ§ μλλ€.
- μμμ± μ»¨ν μ€νΈμ λ³κ²½ λ΄μ©μ λ°μ΄ν°λ² μ΄μ€μ λ°μνλ €λ©΄ μμμ± μ»¨ν μ€νΈλ₯Ό νλ¬μ(flush)ν΄μΌ νλ€. μ€νλ§μ΄ μ 곡νλ OSIVλ μμ²μ΄ λλλ©΄ νλ¬μλ₯Ό νΈμΆνμ§ μκ³ em.close()λ‘ μμμ± μ»¨ν μ€νΈλ§ μ’ λ£μμΌ λ²λ¦°λ€.
- νλ μ ν
μ΄μ
κ³μΈ΅μμ em.flush()λ₯Ό νΈμΆνμ¬ κ°μ λ‘ νλ¬μν΄λ νΈλμμ
λ²μ λ°μ΄λ―λ‘ λ°μ΄ν°λ₯Ό μμ ν μ μλ€λ μμΈκ° μΌμ΄λλ€.
→javax.persistence.TransactionRequiredException
OSIV μ¬μ© μ μ£Όμμ
spring.jpa.open-in-view
μ κ°μ κΈ°λ³Έκ°(true)μΌλ‘ μ ν리μΌμ΄μ
μ ꡬλνλ©΄, μ ν리μΌμ΄μ
μμ μμ μ μμ κ°μ warn λ‘κ·Έλ₯Ό λ¨κΈ°κ² λλ€.
κ·Έλ°λ° μ λμ λ°©μμ²λΌ νλ‘μλ₯Ό μ΄κΈ°ννλ μμ
μ Service κ³μΈ΅μ λλ΄μ§ μκ³ λ λ λλ§ μ μλμΌλ‘ ν΄κ²°νκ² ν΄μ£Όλ μ₯μ μ΄ μλ OSIV μ λ΅μ μ κ²½κ³ λ₯Ό μ€κΉ???????π€
OSIV μ λ΅μ νΈλμμ
μμμ²λΌ μ΅μ΄ λ°μ΄ν°λ² μ΄μ€ 컀λ₯μ
μμ μμ λΆν° API μλ΅μ΄ λλ λ κΉμ§ μμμ± μ»¨ν
μ€νΈμ λ°μ΄ν°λ² μ΄μ€ 컀λ₯μ
μ μ μ§νλ€. κ·Έλμ View Templateμ΄λ API 컨νΈλ‘€λ¬μμ μ§μ° λ‘λ©μ΄ κ°λ₯νλ€.
μ§μ° λ‘λ©μ μμμ± μ»¨ν
μ€νΈκ° μ΄μμμ΄μΌ κ°λ₯νκ³ , μμμ± μ»¨ν
μ€νΈλ κΈ°λ³Έμ μΌλ‘ λ°μ΄ν° 컀λ₯μ
μ μ μ§νλ€. μ΄κ² μμ²΄κ° ν° μ₯μ πβοΈ
κ·Έλ°λ° μ΄ μ λ΅μ λ무 μ€λ μκ°λμ λ°μ΄ν°λ² μ΄μ€ 컀λ₯μ 리μμ€λ₯Ό μ¬μ©νκΈ° λλ¬Έμ, μ€μκ° νΈλν½μ΄ μ€μν μ ν리μΌμ΄μ μμλ 컀λ₯μ μ΄ λͺ¨μλ μ μλ€. μ΄κ²μ κ²°κ΅ μ₯μ λ‘ μ΄μ΄μ§λ€.
μλ₯Ό λ€μ΄, 컨νΈλ‘€λ¬μμ μΈλΆ APIλ₯Ό νΈμΆνλ©΄ μΈλΆ API λκΈ° μκ° λ§νΌ 컀λ₯μ
리μμ€λ₯Ό λ°ννμ§ λͺ»νκ³ , μ μ§ν΄μΌ νλ€.
→ OSIVμ μΉλͺ
μ μΈ λ¨μ , 컀λ₯μ
μ μμμ± μ»¨ν
μ€νΈκ° μ’
λ£λ λκΉμ§ 1:1λ‘ κ³μ λ¬Όκ³ μμ
OSIV OFF
spring.jpa.open-in-view: false
OSIV μ’ λ£
OSIV λ₯Ό λλ©΄ νΈλμμ
μ μ’
λ£ν λ μμμ± μ»¨ν
μ€νΈλ₯Ό λ«κ³ , λ°μ΄ν°λ² μ΄μ€ 컀λ₯μ
λ λ°ννλ€. λ°λΌμ 컀λ₯μ
리μμ€λ₯Ό λλΉνμ§ μλλ€.
OSIVλ₯Ό λλ©΄ λͺ¨λ μ§μ°λ‘λ©μ νΈλμμ
μμμ μ²λ¦¬ν΄μΌ νλ€. λ°λΌμ μ§κΈκΉμ§ μμ±ν λ§μ μ§μ° λ‘λ© μ½λλ₯Ό νΈλμμ
μμΌλ‘ λ£μ΄μΌ νλ λ¨μ μ΄ μλ€. κ·Έλ¦¬κ³ view templateμμ μ§μ° λ‘λ©μ΄ λμνμ§ μλλ€.
κ²°λ‘ μ μΌλ‘ νΈλμμ
μ΄ λλκΈ° μ μ μ§μ° λ‘λ©μ κ°μ λ‘ νΈμΆν΄ λμ΄μΌ νλ€.
컀맨λμ 쿼리 λΆλ¦¬
μ€λ¬΄μμ OSIVλ₯Ό λ μνλ‘ λ³΅μ‘μ±μ κ΄λ¦¬νλ μ’μ λ°©λ²μ΄ μλ€. λ°λ‘ Commandμ Queryλ₯Ό λΆλ¦¬νλ κ²μ΄λ€.
λ³΄ν΅ λΉμ¦λμ€ λ‘μ§μ νΉμ μν°ν° λͺ κ°λ₯Ό λ±λ‘νκ±°λ μμ νλ κ²μ΄λ―λ‘ μ±λ₯μ΄ ν¬κ² λ¬Έμ κ° λμ§ μλλ€. κ·Έλ°λ° 볡μ‘ν νλ©΄μ μΆλ ₯νκΈ° μν 쿼리λ νλ©΄μ λ§μΆμ΄ μ±λ₯μ μ΅μ ν νλ κ²μ΄ μ€μνλ€. νμ§λ§ κ·Έ 볡μ‘μ±μ λΉν΄ ν΅μ¬ λΉμ¦λμ€μ ν° μν₯μ μ£Όλ κ²μ μλλ€.
κ·Έλμ ν¬κ³ 볡μ‘ν μ ν리μΌμ΄μ μ κ°λ°νλ€λ©΄, μ΄ λμ κ΄μ¬μ¬λ₯Ό λͺ ννκ² λΆλ¦¬νλ μ νμ μ μ§λ³΄μ κ΄μ μμ μΆ©λΆν μλ―Έμλ€.
λ³΄ν΅ μλΉμ€ κ³μΈ΅μμ νΈλμμ μ μ μ§νλ€. λ μλΉμ€ λͺ¨λ νΈλμμ μ μ μ§νλ©΄μ μ§μ° λ‘λ©μ μ¬μ©ν μ μλ€.
OSIV μ 리
νΉμ§
- OSIVλ ν΄λΌμ΄μΈνΈ μμ²μ΄ λ€μ΄μ¬ λ μμμ± μ»¨ν μ€νΈλ₯Ό μμ±ν΄μ μμ²μ΄ λλ λκΉμ§ κ°μ μμμ± μ»¨ν μ€νΈλ₯Ό μ μ§νλ€. νμ¬ ν λ² μ‘°νλ μν°ν°λ μμ²μ΄ λλ λκΉμ§ μμ μνλ₯Ό μ μ§νλ€.
- μν°ν° μμ μ νΈλμμ μ΄ μλ κ³μΈ΅μμλ§ λμνλ€. νΈλμμ μ΄ μλ νλ μ ν μ΄μ κ³μΈ΅μ μ§μ° λ‘λ©μ ν¬ν¨ν΄ μ‘°νλ§ ν μ μλ€.
λ¨μ
- μμμ± μ»¨ν μ€νΈμ DB 컀λ₯μ μ 1:1λ‘ λ¬Όκ³ μλ κ΄κ³μ΄κΈ° λλ¬Έμ νλ μ ν μ΄μ λ‘μ§κΉμ§ DB 컀λ₯μ μμμ λλΉνκ² λ¨
- OSIVλ₯Ό μ μ©νλ©΄ κ°μ μμμ± μ»¨ν μ€νΈλ₯Ό μ¬λ¬ νΈλμμ μ΄ κ³΅μ νκ² λ μλ μλ€.
- νλ μ ν μ΄μ μμ μν°ν°λ₯Ό μμ νκ³ λΉμ¦λμ€ λ‘μ§μ μννλ©΄ μν°ν°κ° μμ λ μ μλ€.
- νλ μ ν μ΄μ κ³μΈ΅μμ λ λλ§ κ³Όμ μμ μ§μ° λ‘λ©μ μν΄ SQLμ΄ μ€νλλ€. λ°λΌμ μ±λ₯ νλμμ νμΈν΄μΌ ν λΆλΆμ΄ λμ΄μ§λ€.
'μ€νλ§ > κ²μν λ§λ€κΈ°' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
JPA κ²μ κΈ°λ₯ (0) | 2023.05.18 |
---|---|
Spring Security - CSRF(Cross-Site Request Forgery) (0) | 2023.01.23 |
κ²μν νμ΄μ§ λ§λ€κΈ° (0) | 2023.01.18 |
λ°μ΄ν° λ² μ΄μ€ μ κ·Ό λ‘μ§ (0) | 2023.01.18 |
λλ©μΈ μ€κ³ (0) | 2023.01.18 |