OSIV
๊ฒฐ๋ก ๋ถํฐ ์๊ธฐํ๋ฉด OSIV๋ ์์์ฑ ์ปจํ ์คํธ๋ฅผ View๊น์ง ์ด์ด๋๋ ๊ธฐ๋ฅ์ด๋ค.
Springboot ์๋
spring.jpa.open.in-view๋ผ๋ ์ต์ ์ด ์๋ค. (true/false)default๋ true์ด๋ค.
์์์ฑ ์ปจํ ์คํธ๋ ์ธ์ ์๊ธฐ๊ณ ์ธ์ ์ฌ๋ผ์ง๊น?
ํธ๋์ญ์
๋ฒ์์ ์์์ฑ ์ปจํ
์คํธ
์๋น์ค์ ํธ๋์ญ์ ์ด ์์๋๋ฉด์ ์์์ฑ ์ปจํ ์คํธ๊ฐ ๋ง๋ค์ด์ง๊ณ ์ํฐํฐ๋ ์์ ์ํ๊ฐ ๋๋ค.
์์์ฑ ์ปจํ ์คํธ๋ ํธ๋์ญ์ ์ด ์์๋ ๋ ๋ง๋ค์ด์ง๊ณ ํธ๋์ญ์ ์ด ์ปค๋ฐ๋ ํ ์ฌ๋ผ์ง๋ค.
์๋น์ค๊ฐ ๋๋๊ณ ํธ๋์ญ์ ์์ ๋์ค๋ฉด ์ค์์ ์ํ๊ฐ ๋ ๊ฒ์ด๋ค.
์์์ฑ ์ปจํ ์คํธ๋ ์ฌ์ฉ์๊ฐ ์์ฒญํ๋ ์์ ์ ์์ฑ๋์ง๋ง ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฐ๋ DB ํธ๋์ญ์ ์ ๋น์ฆ๋์ค ๋ ์ด์ด์์๋ง ์ฌ์ฉ๋๋๋ก ํธ๋์ญ์ ์ด ๋ฐ์ํ๋ค.
๊ทธ๋์ OSIV๊ฐ ๋ญ๋๋ฉด ํธ๋์ญ์ ์ด ๋๋๋ ์์์ฑ ์ปจํ ์คํธ์ DB ์ปค๋ฅ์ ์ ์ด๋ ค๋๋ ๊ฒ์ด๋ค.
API์ ๊ฒฝ์ฐ์๋ ์๋ต์ ๋ฐํํ ๋๊น์ง, ํ๋ฉด์ ๊ฒฝ์ฐ ๋ทฐ ํ ํ๋ฆฟ์ ๋ ๋๋ง ํ ๋๊น์ง
๊ฒฐ๊ตญ, ์ ์ ์๊ฒ response ํ ๋๊น์ง ์์์ฑ ์ปจํ ์คํธ์ DB ์ปค๋ฅ์ ์ด ๊ณ์ ์ด์์๋ ๊ฒ์ด๋ค.
OSIV์ ์ต๋ ์ฅ์ ์ ์ปจํธ๋กค๋ฌ๋ ๋ทฐ์์๋ Entity๋ฅผ Lazy ๋ก๋ฉํด์ ํ์ฉํ ์ ์๋ค.
OSIV-false

ํธ๋์ญ์ ์ ์ข ๋ฃํ ๋ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋ซ๊ณ DB ์ปค๋ฅ์ ์ ๋ฐํํ๋ค.
๋ฐํํ๊ณ ๋์ DB ์ปค๋ฅ์ ์ ์ฌ์ฉํ์ง ์๋๋ค.
๋ชจ๋ ์ง์ฐ ๋ก๋ฉ์ ํธ๋์ญ์ ์์์ ํด๊ฒฐํด์ผ ํ๋ค.
์ง์ฐ ๋ก๋ฉ์ ํ๊ธฐ ์ํด์๋ ์์์ฑ ์ปจํ ์คํธ๊ฐ ์ด์์์ด์ผ ํ๋ค.
ํธ๋์ญ์ ์ด ์ข ๋ฃ๋๊ธฐ ์ ์ ์ง์ฐ ๋ก๋ฉ์ ํธ์ถํ๊ฑฐ๋ fetch join์ ์ฌ์ฉํด์ผ ํ๋ค.
์๋ฅผ ๋ค์ด, User์ ๋งคํ๋ Review๊ฐ ์กด์ฌํ๋ค. OSIV๋ฅผ ๋๊ณ Controller์์ User๋ก Review๋ฅผ ๊ฐ์ ธ์ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
could not initialize proxy ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ๊ทธ ์ด์ ๋ ํธ๋์ญ์
์ด ์ข
๋ฃ๋๊ณ ์์์ฑ ์ปจํ
์คํธ๊ฐ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ํ๋ก์๋ฅผ ์ด๊ธฐํ ํ ์ ์๋ค. Review๋ฅผ Lazy Loading ํ์ง๋ง User๋ ์ค์์ ์ํ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
OSIV๋ฅผ ๋๊ณ ์ API๋ฅผ ํธ์ถํ๋ฉด review.getUser().getName() ์์ Could not initalize proxy no Session์๋ฌ๊ฐ ๋ฐ์ํ๋ค. getUser()๋ ํ๋ก์์ธ๋ฐ ์์ง ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ์ง ์๋๋ค. ๊ทธ๋์ getName()์ ํธ์ถํ๋ ์๊ฐ ์์์ฑ ์ปจํ
์คํธ์์ ํ๋ก์๋ฅผ ์ด๊ธฐํํด์ผ ํ๋๋ฐ ์ฌ๊ธฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
๊ฐ๋จํ๊ฒ ํด๊ฒฐํ๊ธฐ ์ํด์๋ fetch join์ ์ฌ์ฉํ๊ฑฐ๋ ํธ๋์ญ์ ์์์ ์ฒ๋ฆฌํ๋ฉด ๋๋๋ฐ, ์ฒ์๋ถํฐ ์ค๊ณ๋ฅผ ์ ํ๋ค๋ฉด ์ด ๋ถ๋ถ์ ์ด๋ฏธ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋ ๊ฒ์ด๋ค. ๋ค์ ํ๋ฒ ์ค๊ณ๊ฐ ์ค์ํ ์ด์ ๋ฅผ ์ ๊ฒ ๊ฐ๊ธฐ๋ํ๋ค.
OSIV-true

ํธ๋์ญ์ ๋ฐ์์๋ ์์์ฑ ์ปจํ ์คํธ๊ฐ ์กด์ฌํ์ฌ DB ์ปค๋ฅ์ ์ ์ ์งํ๊ณ ์๋ค.
์ฆ, API ์๋ต ํ ํ๋ฉด์ด ๋ ๋๋ง ๋ ๋๊น์ง ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋ฌผ๊ณ ์๋๋ค.
DB ์ปค๋ฅ์ ์ ๊ณ์ ๋ฌผ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ค์๊ฐ ํธ๋ํฝ์ด ์ค์ํ ์๋น์ค์์๋ ์ปค๋ฅ์ ์ด ๋ถ์กฑํ ์ ์๋ค.
Controller์์๋ ์ง์ฐ ๋ก๋ฉ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
์์ฒญ์ด ๋ค์ด์ค๋ฉด Servlet Filter๋ Spring Interceptior์์ ์์์ฑ ์ปจํ ์คํธ(Entity Manager)๋ฅผ ์์ฑํ๋ค. ---> ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์์ฑํ๋ค๊ณ ํธ๋์ญ์ ์ด ์์๋๋ ๊ฒ์ ์๋๋ค.
Service Layer์์ ํธ๋์ญ์ ์ด ์์ํ ๋ ๊ธฐ์กด์ ์์ฑ๋ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ด์ฉํด์ ํธ๋์ญ์ ์ ์์ํ๋ค.
Service ๋ก์ง์ด ๋๋๋ฉด ํธ๋์ญ์ ์ ์ปค๋ฐํ๊ณ ์ข ๋ฃํ๋ค. ํ์ง๋ง ์์์ฑ ์ปจํ ์คํธ๋ ์๋ฉธ๋์ง ์๋๋ค. ---> DB ์ปค๋ฅ์ ์ด ์์ง ์ข ๋ฃ๋์ง ์์๋ค.
Controller์ View์์๋ ์์์ฑ ์ปจํ ์คํธ๊ฐ ์ ์ง๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ๋ Entity๋ ์์ ์ํ๋ฅผ ์ ์งํ๋ค.
Servlet Filter ํน์ Spring Interceptor๋ก ๋ก์ง์ด ๋ค์ ํ๊ท๋ ๊ฒฝ์ฐ, ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ข ๋ฃํ๋ค. ---> ์ด ๋, flush ๋ฉ์๋๊ฐ ์๋ close๋ฅผ ํธ์ถํ๋ค.
3๋ฒ ์ดํ์๋ Controller๋ถํฐ Entity๊ฐ ์์ ๋ถ๊ฐ๋ฅํ ์ํ๊ฐ ๋๋๋ฐ, ์ด ๋๋ ํธ๋์ญ์ ์ด ์ข ๋ฃ๋ ์ํ์ด๋ค.
ํ์ง๋ง Entity๋ฅผ ์์ /์ญ์ ํ๋ ์์ ์ด ์๋๋ผ ์กฐํ๋ ์๋ฌด๋ฐ ์๊ด์ด ์๋ค.
๋ฐ๋ผ์ Entity ๊ฐ์ฒด๋ฅผ ๋ ๋๋งํ๋ ๊ณผ์ ์์ ์ง์ฐ ๋ก๋ฉ์ด ๋ฐ์ํด๋ ์กฐํ๋ง ํ๊ธฐ ๋๋ฌธ์ Controller์์๋ ๊ฐ๋ฅํ๋ค. ---> JPA๋ฅผ ์ฌ์ฉํด์ Entity๋ฅผ ์์ /์ญ์ ํ๋ ํ์๋ ๋ฐ๋์ ํธ๋์ญ์ ๋ฒ์์์ ์ํํด์ผ ํ๋ค.
์์์ฑ ์ปจํ ์คํธ๋ ๋ณ๊ฒฝ ๊ฐ์ง(Dirty Checking) ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ด์ ํธ๋์ญ์ ๋ฐ์์ ์์ /์ญ์ ๋ฅผ ์๋ํ๋ค๋ฉด ๋ฐ์ดํฐ๊ฐ ์์ ๋์ง ์๋๋ค.
์์์ฑ ์ปจํ ์คํธ์ ๋ณ๊ฒฝ ๋ด์ฉ์ DB์ ๋ฐ์ํ๋ ค๋ฉด ์์์ฑ ์ปจํ ์คํธ๋ฅผ flush ํด์ผํ๋๋ฐ, Spring์ด ์ ๊ณตํ๋ OSIV ์์ฒญ์ด ๋๋๋ฉด flush๋ฅผ ํธ์ถํ์ง ์๊ณ , close ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฏ๋ก Entity์ ๋ณ๊ฒฝ์ DB์ ๋ฐ์ํ์ง ์๊ณ ์ข ๋ฃํจ.
๊ฐ์ ๋ก DI๋ฅผ ์ด์ฉํด์ Spring์ EntityManager๋ฅผ ์ฌ์ฉํด์ flush๋ฅผ ํธ์ถํด๋ ์ด๋ฅผ ์์ธ ์ฒ๋ฆฌ๋ก ๋ง์๋ฒ๋ฆฌ๋ ์ฝ๋ ๋๋ฌธ์ ์๋จ.
OSIV๋ฅผ ์ธ์ ์ฌ์ฉํ๋ฉด ์ข์๊น?
OSIV๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ
์๋น์ค์ ํธ๋ํฝ์ด ๋ง์ ์ค์๊ฐ API
Controller์ Service๊ฐ 1:1 ๋งคํ์ธ ๊ฒฝ์ฐ
Service์์ ํธ๋์ญ์ ์ด ์ข ๋ฃ๋๋ ๊ฒฝ์ฐ
OSIV๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
View์์ Entity ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ ๋ ๋๋ง ํด์ผํ๋ ๊ฒฝ์ฐ (Spring MVC)
View์์ Entity ์ฐ๊ด ๊ฐ์ฒด๋ฅผ ์ ์ดํด์ผ ํ๋ ๊ฒฝ์ฐ
๊ฐ์ ์์์ฑ ์ปจํ ์คํธ์์ ์ฌ๋ฌ ํธ๋์ญ์ ์ ๊ณต์ ํ๋ ๊ฒฝ์
Spring MVC์ ๊ฒฝ์ฐ Entity๋ฅผ Service ๊ณ์ธต ์๊น์ง ์ฌ์ฉํ๊ฑฐ๋ ํธ๋์ญ์ ์ ๊ณต์ ํด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
๊ทธ๋ฐ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด OSIV ์ฌ์ฉ์ DB ์ปค๋ฅ์ ์ ์ค๋ ์ฌ์ฉํ๊ฒ ๋์ด ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์๋ค.
Last updated