JPA _ proxy, eager loading, lazyloading
๐ ์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊น์ํ๋ ๊ฐ์๋ฅผ ๋ค์ผ๋ฉด์ ํ๊ธฐ!
๐คโ ๋ฌธ์ ์์
Member์ Team์ด ์ฐ๊ด ๋งคํ์ด ๋์ด ์๋ค๊ณ ํ์.
๊ทธ๋ผ Member๊ฐ ์กฐํ๋ ๋๋ง๋ค ๊ทธ ์์์ ์ฐธ์กฐ๋๋ Team๋ ๋ชจ๋ ํจ๊ป ๊ณง์ฅ ์กฐํ๋์ด์ผ ํ ๊น?
์๋๋ฉด ํ์ํ ๋๊ฐ ๋์ด์์ผ Team์ ๋ฐ๋ก ๋ถ๋ฌ๋ด๋ ๊ฒ์ด ์ข์๊น?
๐ ๊ฐ๋จํ ๋ต์, ๋ฌด์์ด ๋ ๋์์ง์ ๋ํ ํ๋จ์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ฐ๋ผ ๋ค๋ฅด๋ค!
(1) ๋น์ฆ๋์ค ๋ก์ง ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ Member ์ถ๋ ฅ์ ๊ฑฐ์ Team๋ ํจ๊ป ํธ์ถํ๋ค๋ฉด?
=> ํ๋ฒ์ ๋ชจ๋ ๋ก๊ฒจ์ค๋ ๊ฒ์ด ๋ซ๋ค.
(2) ๊ทธ๋ ์ง ์๋ค๋ฉด?
=> ๋ฐ๋ก ๋ฐ๋ก ๋ถ๋ฌ์ฌ ์ ์๋๋ก ํ๋ ๊ฒ์ด ๋ซ๋ค.
(์๋ฅผ ๋ค์ด Member๋ง ํ์ํ๊ณ Team๊น์ง๋ ์ ํ์ํ๋ฐ๋ ๊ตณ์ด ๋ค ๋ถ๋ฌ์ค๋ ๊ฒ์ ๋นํจ์จ์ ์ด๋๊น)
๐ ๊ทธ๋ฐ๋ฐ ์ด๋ฐ ํ์์ ๋ฐ๋ผ ์ฐ๋ฆฌ๊ฐ ๋ค๋ฅธ ์ ํ/์ฒ๋ฆฌ๋ฅผ ํ ์ ์์๊น?
๊ทธ๋ ๋ค! JPA์ ์ํด ๊ฐ๋ฅํ๋ค.
์ด๋ป๊ฒ? JPA์์ ์ฐ๊ด๋งคํํ column์ fetch์ต์ ์ ์ค์ผ๋ก์จ!
(1) LAZY - ์ง์ฐ ๋ก๋ฉ
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="TEAM_ID")
private Team team;
- ์ด ๊ฒฝ์ฐ์๋ team ์ ํ๋ก์(๊ฐ์ง)๋ก ๋ถ๋ฌ๋ค ๋๊ณ , ์ดํ์ team ๋ด๋ถ์ ์ค์ ๊ฐ๋ค์ ์กฐํํ๋ ๋ฑ ํธ์ถํ ๋(ex. team.getName() ๋ฑ)์์์ผ ์ค์ ๊ฐ๋ค์ด ๊ป๋ฐ๊ธฐ๋ง ์๋ team์ ์ฑ์์ง๋ ๊ฒ(์ด๊ธฐํ).
(2) EAGER - ์ฆ์ ๋ก๋ฉ (Default)
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="TEAM_ID")
private Team team;
๐ค ๊ทธ๋ ๋ค๋ฉด ์ค๋ฌด์์ ๋ฌด์์ ์จ์ผ ํ ๊น?
๐ ๊ฐ๊ธ์ ์ง์ฐ๋ก๋ฉ๋ง ์ฌ์ฉ!!
์ฆ์ ๋ก๋ฉ์ ์ฌ์ฉํ ๋ ๋ฐ์ํ๋ ๋ฌธ์ : "JPQL์์์ N+1 ๋ฌธ์ "
์ค๋ฌด์์๋ JPQL์ ๋ง์ด ์ฌ์ฉํ๋ค๊ณ ํ๋ค. ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋๊น.
๊ทธ๋ฐ๋ฐ JPQL์ SQL๋ก ๋ฒ์ญ์ด ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Team ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ Member์ ๋ํ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ๋ฉด?
์ผ๋จ SQL๋ฌธ์ member๋ง selectํ ๊ฒ์ด๋ค.
๊ทธ๋ฐ๋ฐ ๊ฐ์ ธ์๋ดค๋๋, Team์ด ์ฆ์ ๋ก๋ฉ์ผ๋ก ๋์ด์๋ค? ๊ทธ๋์ ์ด์ Team์ ๋ํ query๋ ๋ค์ ๋ณด๋.
์ฆ, N+1์ ๋ฌธ์ ๋, ์ต์ด์ ์ฟผ๋ฆฌ 1๋ฟ๋ง ์๋๋ผ N๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๋ ์คํํ๊ฒ ๋๋ค๋ ๊ฒ.
๊ทธ๋์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ FetchType.LAZY ๋ก ์ค์ ํ๋ค๊ณ ํจ!
๋ค๋ง ์ค๋ฌด์์ ์ด๋ค ๊ฒฝ์ฐ๋ ์ฐ๊ด ์ํฐํฐ๋ค์ ํ๋ฒ์ ๊ฐ์ด ๊ฐ์ ธ์ค๊ณ ์ถ์ ์ ์์. ์ด๋ด ๋๋ ๊ธฐ๋ณธ ์ธํ ์ FetchType.LAZY๋ก ํ๋ FetchJoin์ ์ฌ์ฉํ ์ ์๋ค๊ณ ํจ.
โ ๐ค ์ด๋ป๊ฒ ๊ฐ๋ฅํ ๊น?
JPA์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋ค๋ฃจ๋ EntityManager๊ฐ ๊ฐ์ง ๋ฉ์๋ ์ค ๋ค์์ ๋ ๊ฐ์ง๋ฅผ ๋น๊ตํด๋ณด์.
EntityManager em;
- em.find() : ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํตํด์ ์ค์ entity ๊ฐ์ฒด ์กฐํ
- em.getReference() : ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ๋ฅผ ๋ฏธ๋ฃจ๋ ๊ฐ์ง(ํ๋ก์) entity ์กฐํ
- getReference()๋ก ๊ฐ์ ธ์ค๋ proxy๋ ์ค์ entity๋ฅผ ์์๋ฐ์ ๋ง๋ค์ด์ ธ์, ๊ป๋ฐ๊ธฐ๋ ๊ฐ๋ค.