EntityManager μμ± μμ
β’
νΈλμμ
μμ μ
β’
JpaTransactionManager
β¦
doBegin()
βͺ
createEntityManagerForTransaction() μΌλ‘ μλ‘μ΄ EM μμ± μμ²
β¦
createEntityManagerForTransaction()
βͺ
obtainEntityManagerFactory() λ‘ EMF νλ(νλλ‘ κ°μ§κ³ μμ)
βͺ
EntityManagerFactoryInfo μ createNativeEntityManager() νΈμΆ
β’
AbstractEntityManagerFactoryBean(EntityManagerFactoryInfo μΆμ ꡬν체)
β¦
createNativeEntityManager()
βͺ
SessionFactoryImpl μ createEntityManager() νΈμΆ
β’
SessionFactoryImpl
β¦
createEntityManager()
βͺ
openSession() νΈμΆ
β¦
openSession()
βͺ
new SessionImpl(sessionFactory, this);
β’
SessionImpl
β¦
μμ±μ
βͺ
μμμ± μ»¨ν
μ€νΈ, μ‘μ
ν λ± μμ±
EntityManager λΌμ΄νμ¬μ΄ν΄
β’
open-in-view κ° true λΌλ©΄
β¦
DispatcherServlet μ doDispatch λ©μλμμ
β¦
ha.handle() ν λ€(μ€μ 컨νΈλ‘€λ¬ λΆλ₯΄λ λ©μλ)
β¦
processDispatchResult() λ©μλλ₯Ό νΈμΆνμ¬ close λ₯Ό νλ€.
β’
false λΌλ©΄
β¦
APTM μ commit() λ©μλ μμ processCommit() νΈμΆ
β¦
processCommit() μμ cleanupAfterCompletion() νΈμΆ
β¦
cleanupAfterCompletion() μμ JTM μ doCleanupAfterCompletion() νΈμΆ
β¦
JTM μ doCleanupAfterCompletion() μμ EntityManagerFactoryUtils μ closeEntityManager() λ©μλλ₯Ό νΈμΆνμ¬ close
β’
κ·Έλ λ€λ©΄ μ΄ λμ μ°¨μ΄λ μ΄λμ λ°μνλκ°?
β¦
μΌλ¨ true λ©΄ HandlerInterceptor λ‘ WebRequestHandlerInterceptorAdapter κ° μΆκ°λ‘ λ±λ‘λλ€.
β¦
μ¬κΈ°μ close λ₯Ό νλ€.
β’
κ·Έλ λ€λ©΄ true μΌ λλ μ APTM μ commit λ©μλμμ processCommit() μ νΈμΆνμ§ μλκ°?
β¦
APTM μ cleanupAfterCompletion λ©μλμμ JTM μ doCleanupAfterCompletion() μ νΈμΆνκΈ° μν΄μλ if λΆκΈ°λ¬Έμ status.isNewTransaction() μ΄ true κ° λμ΄μΌ νλλ° μ¬κΈ°μ ν΅κ³Όνμ§ λͺ»νλ€.
β¦
μ¦ Service κ³μΈ΅μ Transactional μ΄λ
Έν
μ΄μ
μΌλ‘ νΈλμμ
μ μ΄κΈ° μ μ΄λ―Έ νΈλμμ
μ΄ μ΄λ € μλ μνμΈ κ².
β’
κ·Έλ¬λ€. μ΄λ―Έ νΈλμμ
μ μ΄μ΄λ²λ¦° κ²μ΄λ€. κ·ΈλΌ νΈλμμ
μ μ° κ°μ₯ μ λ ₯ν μ©μμλ WebRequestHandlerInterceptorAdapter μΈ κ² κ°μλ€. interceptor λΌμ preHandle μ΄ μλ€. μ¬κΈΈ λλ²κ·Έ μ°μ΄λ³΄μλ€.
β¦
DispatcherServlet μμ νΈλ€λ¬μ νΈλ€λ¬μ΄λν°λ₯Ό μ°Ύκ³ νΈλ€λ¬μ΄λν°μ handle μ νΈμΆνκΈ° μ preHandle λ‘ μΈν°μ
ν°λ₯Ό νΈμΆνλ€.
β¦
WebRequestHandlerInterceptorAdapter μ preHandle μμ νλλ‘ λ±λ‘λ requestInterceptor μ preHandle μ μμ²νλ€.
β¦
λ±λ‘λ requestInterceptor λ OpenEntityManagerInViewInterceptor μ΄κ³ μ΄ κ°μ²΄μ preHandle λ©μλμμ EMF λ₯Ό μ»μ λ€ createEntityManager λ‘ EM μ μμ±νλ€.
β¦
μ΄λ 컀λ₯μ
μ λΉλ €κ°μ§ μμ! λ¨μν μΈμ
μ μ΄κ³Ό em μ μμ±ν λΏ
OSIV μ κΈ°λ₯
β’
true μΌ λ
β¦
Lazy μΌ λ
βͺ
νλ‘μλ‘ μλ κ°μ²΄ μ‘°ν κ°λ₯(쿼리 λ°μ)
βͺ
νλ‘μλ‘ μλ κ°μ²΄ λ³κ²½ λΆκ°(λν° μ²΄νΉ λΆκ°λ₯) νμ§λ§ μλ¬ X
β’
false μΌ λ
β¦
Lazy μΌ λ
βͺ
νλ‘μλ‘ μλ κ°μ²΄ μ‘°ν μ LazyInitializationException: could not initialize proxy [com.example.tosstemp.Team#1] - no Session] with root cause μλ¬ λ°μ
βͺ
λ³κ²½λ λΉμ°ν λΆκ°
κ²°λ‘
β’
true μΌ λλ νΈλμμ
λ μ΄λ
Έν
μ΄μ
λ°κΉ₯μμλ emμ΄ μ΄λ €μλ€. νμ§λ§ μ€μμμνμ΄λ€. κ·Έλμ μ‘°νλ κ°λ₯νλ€. νμ§λ§ νΈλμμ
λ μ΄λ
Έν
μ΄μ
λ°κΉ₯μ΄κΈ°λλ¬Έμ λν°μ²΄νΉμ νμ§ μλλ€. κ·Έλμ λ³κ²½μ μ λν μ
λ°μ΄νΈλ₯Ό νμ§ μλλ€.
β’
κ·Έ μ΄μ λ νΈλμμ
λ μ΄λ
Έν
μ΄μ
μΌλ‘ μΈμ
μ μ° κ²μ΄ μλκ³ λ
λ€ interceptor μμ μΈμ
μ μμ±νκΈ° λλ¬Έμ΄λ€.
β’
false μΌ λλ 컀λ₯μ
, μΈμ
λͺ¨λ λ«νμλ€. κ·Έλμ λ μ΄μ§ λ‘λ© μ‘°νλ λμ§ μλλ€.
β’
EM μμ± β 컀λ₯μ
νλ β νΈλμμ
μμ± μ
β¦
setAutoCommit νλ©΄ 컀λ₯μ
μ λ€μμ νλνλλ° μ΄ λλ?
βͺ
ConnectionHandle μ μμ±ν΄μ 컀λ₯μ
μ μ€μ λ‘ μ»λ κ²κ³Όλ λ€λ₯΄λ€.
βͺ
ConnectionHandle μμ±μ μΈμ
λ§μΌλ‘ κ°λ₯νλ€.
βͺ
κ·Έλμ νΈλμμ
begin νΈμΆ μ TransactionStatus λ§ ACTIVE λ‘ λ°κΎΌλ€! μ€μ 컀λ₯μ
μ νλνμ§ μκ³ !