ํ”„๋ก์‹œ

ํ”„๋ก์‹œ ๊ธฐ์ดˆ

entityManager.find()

  • DB๋ฅผ ํ†ตํ•ด ์‹ค์ œ entity ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•œ๋‹ค. ์‹ค์ œ๋กœ DB ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

entityManager.getReference()

  • DB ์กฐํšŒ๋ฅผ ๋ฏธ๋ฃจ๋Š” ๊ฐ€์งœ(ํ”„๋ก์‹œ) entity ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•œ๋‹ค. DB ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ๊ฐ์ฒด๊ฐ€ ์กฐํšŒ๊ฐ€ ๋œ๋‹ค.

// 1 : select query ๋ฐœ์ƒ. ์‹ค์ œ entity ํ˜ธ์ถœ
Member findMember = em.find(Member.class, member.getId());

// 2 : select query ๋ฐœ์ƒ x, ClassName$HibernateProxy$mp6j2WPz๊ฐ€ ์ฐํ˜€์žˆ๋‹ค.
Member findMember = em.getReference(Member.class, member.getId());
printf(findMemeber.getClass());

getReference()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ง„์งœ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Hibernate๊ฐ€ ๊ฐ€์งœ(ํ”„๋ก์‹œ) entity ๊ฐ์ฒด๋ฅผ ์ค€๋‹ค.

ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ์‹ค์ œ ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›์•„์„œ ๋งŒ๋“ค์–ด์ง€๊ณ , ์‹ค์ œ ํด๋ž˜์Šค์™€ ๊ฒ‰ ๋ชจ์–‘์ด ๋™์ผํ•˜๋‹ค.

ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ์‹ค์ œ ๊ฐ์ฒด์˜ ์ฐธ์กฐ(target)์„ ๋ณด๊ด€ํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ์‹ค์ œ ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ฒ˜์Œ target์˜ ์ƒํƒœ๋Š” null์ด๋‹ค.

๐ŸŒŸ ํ”„๋ก์‹œ ๊ฐ์ฒด์˜ ์ดˆ๊ธฐํ™”

์ฝ”๋“œ๋Š” ์ „๋ถ€ ์˜ˆ์‹œ์ด๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ Member.getName()์„ ํ˜ธ์ถœํ•œ๋‹ค.

  2. Member proxy์˜ target์€ null ์ด์˜€๊ณ , ํ˜ธ์ถœ์„ ํ†ตํ•ด์„œ JPA๊ฐ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ง„์งœ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋ผ๊ณ  ์š”์ฒญํ•จ.

  3. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” DB๋ฅผ ์กฐํšŒํ•ด์„œ ์‹ค์ œ Entity ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

  4. ๊ทธ๋Ÿฌ๋ฉด proxy ๋‚ด๋ถ€์˜ target์ด ์‹ค์ œ entity๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค.

ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ ค๋ฉด PK๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์†์„ฑ์„ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.

ํ”„๋ก์‹œ์˜ ํŠน์ง•

  • ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ์ฒ˜์Œ ์‚ฌ์šฉํ•  ๋•Œ ํ•œ๋ฒˆ๋งŒ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.

  • ์ดˆ๊ธฐํ™” ํ•  ๋•Œ ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ์‹ค์ œ entity๊ฐ€ ๋˜๋Š”๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™”๋˜๋ฉด ํ”„๋ก์‹œ๋ฅผ ํ†ตํ•ด ์‹ค์ œ entity์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ”„๋ก์‹œ ๊ฐ์ฒด๋Š” ์›๋ณธ entity๋ฅผ ์ƒ์†๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž… ์ฒดํฌ ์‹œ ์ฃผ์˜ ํ•ด์•ผํ•œ๋‹ค. (== ๋น„๊ต์‹คํŒจ, instaceof ์‚ฌ์šฉ)

  • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๋„์›€์„ ๋ฐ›์„ ์ˆ˜ ์—†๋Š” ์ค€์˜์† ์ƒํƒœ์ผ ๋•Œ ํ”„๋ก์‹œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด hibernate๋Š”org.hibernate.LazyInitializationException ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ๊ฐ•์ œ๋กœ em.detach()๋‚˜ em.close()๋ฅผ ์‹คํ–‰ํ•ด์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ง„์งœ ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•˜๊ณ  ํ”„๋ก์‹œ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ

์œ„ ์ƒํ™ฉ์€ entity๋ฅผ ๋จผ์ € ๊ฐ€์ ธ์˜ค๊ณ  proxy๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ๋‘ ๊ฐœ์˜ ์ถœ๋ ฅ์„ ํ™•์ธ ํ•ด๋ณด๋ฉด ๋‘˜ ๋‹ค Memeber์˜ entity๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ์ด๋ฏธ ๋จผ์ € Member๊ฐ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ 1์ฐจ ์บ์‹œ์— ์กด์žฌํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ๋‹ค์‹œ ํ”„๋ก์‹œ๋กœ ์กฐํšŒ ํ•ด๋ดค์ž ์ด์ ์ด ์—†๋‹ค.

ํ•œ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ m1 == m2 ๊ฐ€ ํ•ญ์ƒ ๋ณด์žฅ๋˜์–ด์•ผ ํ•œ๋‹ค.

์œ„ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

๊ฒฐ๊ณผ๋Š” ๋‘˜ ๋‹ค ํ”„๋ก์‹œ ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ๋‘ ๊ฐœ์˜ ๋ ˆํผ๋Ÿฐ์Šค ์ฃผ์†Œ๋ฅผ ๋งž์ถฐ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋ก์‹œ๋ฅผ ํ•œ๋ฒˆ ๋ฐ˜ํ™˜ํ–ˆ์œผ๋ฉด ๊ทธ ๋‹ค์Œ์—๋„ ํ”„๋ก์‹œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

ํ”„๋ก์‹œ ํ™•์ธ

ํ”„๋ก์‹œ ์ธ์Šคํ„ด์Šค ์ดˆ๊ธฐํ™”

1๋ฒˆ์€ ์•„์ง proxy๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•„์„œ false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 2๋ฒˆ์€ true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ํ”„๋ก์‹œ ํด๋ž˜์Šค ํ™•์ธ

ํ”„๋ก์‹œ ๊ฐ•์ œ ์ดˆ๊ธฐํ™”

Last updated