Search
Duplicate
โ˜•

OSIV ์— ๊ด€ํ•˜์—ฌ

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 ์ผ ๋•Œ๋Š” ํŠธ๋žœ์žญ์…”๋„ ์–ด๋…ธํ…Œ์ด์…˜ ๋ฐ”๊นฅ์—์„œ๋„ ์ปค๋„ฅ์…˜์ด ์—ด๋ ค์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ค€์˜์†์ƒํƒœ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ปค๋„ฅ์…˜์ด ์—ด๋ ค์žˆ์–ด์„œ ์กฐํšŒ๋Š” ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ํŠธ๋žœ์žญ์…”๋„ ์–ด๋…ธํ…Œ์ด์…˜ ๋ฐ”๊นฅ์ด๊ธฐ๋•Œ๋ฌธ์— ๋”ํ‹ฐ์ฒดํ‚น์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ๋ณ€๊ฒฝ์ ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
โ€ข
๊ทธ ์ด์œ ๋Š” ํŠธ๋žœ์žญ์…”๋„ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์„ธ์…˜์„ ์—ฐ ๊ฒƒ์ด ์•„๋‹ˆ๊ณ  ๋ƒ…๋‹ค interceptor ์—์„œ ์„ธ์…˜์„ ์ƒ์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
โ€ข
false ์ผ ๋•Œ๋Š” ์ปค๋„ฅ์…˜, ์„ธ์…˜ ๋ชจ๋‘ ๋‹ซํ˜€์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ ˆ์ด์ง€ ๋กœ๋”ฉ ์กฐํšŒ๋„ ๋˜์ง€ ์•Š๋Š”๋‹ค.
โ€ข
EM ์ƒ์„ฑ โ†’ ์ปค๋„ฅ์…˜ ํš๋“ โ†’ ํŠธ๋žœ์žญ์…˜ ์ƒ์„ฑ ์ˆœ
โ—ฆ
setAutoCommit ํ•˜๋ฉด ์ปค๋„ฅ์…˜์„ ๋’ค์—์„œ ํš๋“ํ•˜๋Š”๋ฐ ์ด ๋•Œ๋Š”?
โ–ช
ConnectionHandle ์„ ์ƒ์„ฑํ•ด์„œ ์ปค๋„ฅ์…˜์„ ์‹ค์ œ๋กœ ์–ป๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅด๋‹ค.
โ–ช
ConnectionHandle ์ƒ์„ฑ์€ ์„ธ์…˜๋งŒ์œผ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค.
โ–ช
๊ทธ๋ž˜์„œ ํŠธ๋žœ์žญ์…˜ begin ํ˜ธ์ถœ ์‹œ TransactionStatus ๋งŒ ACTIVE ๋กœ ๋ฐ”๊พผ๋‹ค! ์‹ค์ œ ์ปค๋„ฅ์…˜์„ ํš๋“ํ•˜์ง€ ์•Š๊ณ !