Home > Spring > ๐Ÿƒ[Spring] ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌด์—‡์ด ์ข‹์„๊นŒ์š”?

๐Ÿƒ[Spring] ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌด์—‡์ด ์ข‹์„๊นŒ์š”?
Spring Framework

๐Ÿƒ[Spring] ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌด์—‡์ด ์ข‹์„๊นŒ์š”?

  • JPA์—์„œ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ” ๊ฐ„ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๊ณ , ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ฉฐ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • JPA ์—ฐ๊ด€๊ด€๊ณ„๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์—”ํ‹ฐํ‹ฐ๋“ค ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๊ฐ์ฒด ๋ชจ๋ธ๋กœ ๊ทธ๋Œ€๋กœ ํ‘œํ˜„ํ•˜๋ฏ€๋กœ, SQL ์ค‘์‹ฌ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ๋ณด๋‹ค ์ง๊ด€์ ์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šด ์ฝ”๋“œ ์ž‘์„ฑ์„ ๋•์Šต๋‹ˆ๋‹ค.

1๏ธโƒฃ JPA ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์˜ ์žฅ์ .

1๏ธโƒฃ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง.

  • ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ํ†ตํ•ด ์—”ํ‹ฐํ‹ฐ๋“ค์ด ์‹ค์ œ ๋น„์ฆˆ๋‹ˆ์Šค ๋„๋ฉ”์ธ์—์„œ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ํ‘œํ˜„๋˜๋ฏ€๋กœ, ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • User์™€ Order์˜ ๊ด€๊ณ„์ฒ˜๋Ÿผ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์„œ๋กœ ์ฐธ์กฐํ•˜๋ฉฐ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ํ†ตํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฝ”๋“œ๋กœ ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ๋ณด๋‹ค ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋” ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃ ์ž๋™์œผ๋กœ SQL์„ ์ƒ์„ฑํ•˜์—ฌ ๊ด€๋ฆฌ ๋ถ€๋‹ด ๊ฐ์†Œ.

  • JPA๋Š” ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜๋ฉด ํ•„์š”ํ•œ SQL์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•ด์ฃผ๋ฏ€๋กœ, ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์ง์ ‘ SQL๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ถ€๋‹ด์„ ๋œ์–ด์ค๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, User์™€ Order ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด, User ๊ฐ์ฒด์—์„œ Order ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•  ๋•Œ JPA๊ฐ€ ์ž๋™์œผ๋กœ SQL์„ ์ƒ์„ฑํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

3๏ธโƒฃ ์ผ๊ด€์„ฑ๊ณผ ๋ฌด๊ฒฐ์„ฑ ์œ ์ง€.

  • ์—ฐ๊ด€๊ด€๊ณ„์™€ Cascade ์˜ต์…˜, orphanRemoval ์˜ต์…˜์„ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„ ๊ด€๊ณ„๋ฅผ JPA๊ฐ€ ๊ด€๋ฆฌํ•ด ์ฃผ๋ฏ€๋กœ, ๋ถ€๋ชจ์™€ ์ž์‹ ์—”ํ‹ฐํ‹ฐ ๊ฐ„ ์ผ๊ด€์„ฑ์„ ์‰ฝ๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์‚ญ์ œ๋˜๋ฉด ์ž์‹ ์—”ํ‹ฐํ‹ฐ๋„ ์ž๋™์œผ๋กœ ์‚ญ์ œ๋˜๊ฑฐ๋‚˜ ์—ฐ๊ด€๋œ ์ž์‹ ์—”ํ‹ฐํ‹ฐ๊ฐ€ Orphan Object(๊ณ ์•„ ๊ฐ์ฒด)๋กœ ๋‚จ์ง€ ์•Š๋„๋ก ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

4๏ธโƒฃ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์ง€์›.

  • JPA๋Š” ์—ฐ๊ด€๊ด€๊ณ„ ์„ค์ •์„ ํ†ตํ•ด ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading), ์ฆ‰์‹œ ๋กœ๋”ฉ(Eager Loading), ํŽ˜์น˜ ์กฐ์ธ(Fetch Join) ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•  ๋•Œ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, fetch = FetchType.LAZY๋กœ ์„ค์ •ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฆ‰์‹œ ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ  ์‹ค์ œ๋กœ ํ•„์š”ํ•  ๋•Œ ์กฐํšŒํ•˜๊ฒŒ ๋˜์–ด ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

5๏ธโƒฃ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ์‘์ง‘๋„ ํ–ฅ์ƒ.

  • ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋„๋ฉ”์ธ ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์บก์Šํ™”ํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด ์‘์ง‘๋„๊ฐ€ ๋†’์•„์ง‘๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, Order ๊ฐ์ฒด์— addOrderItem() ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•ด OrderItem์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • Order ๊ฐ์ฒด์— ์—ฐ๊ด€๋œ ๋ชจ๋“  OrderItem์ด ์ž๋™์œผ๋กœ ๊ด€๋ฆฌ๋˜๋ฏ€๋กœ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๋ณด๋‹ค ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

6๏ธโƒฃ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์ž‘์„ฑ ์ตœ์†Œํ™”.

  • ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„์˜ ์ฐธ์กฐ๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ง์ ‘ ์กฐ์ธ์„ ์ž‘์„ฑํ•˜๋Š” ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŠนํžˆ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ํ†ตํ•ด ์—”ํ‹ฐํ‹ฐ ๊ฐ„ ๊ด€๊ณ„๋ฅผ ์‰ฝ๊ฒŒ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์–ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌํ˜„ํ•  ๋•Œ ์ฝ”๋“œ๊ฐ€ ๋‹จ์ˆœํ•ด์ง‘๋‹ˆ๋‹ค.

2๏ธโƒฃ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ์˜ ์žฅ์ .

  • ์˜ˆ๋ฅผ ๋“ค์–ด, Team๊ณผ Member๊ฐ€ ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ, Team ๊ฐ์ฒด์—์„œ Member ๊ฐ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    Team team = entityManager.find(Team.class, teamId);
    List<Member> members = team.getMembers();
    
  • ์œ„์™€ ๊ฐ™์ด Team์—์„œ Member๋ฅผ ์‰ฝ๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ณต์žกํ•œ SQL์„ ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด JPA๊ฐ€ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๊ด€๋ฆฌํ•˜์—ฌ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ ์š”์•ฝ.

  • JPA์—์„œ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ํ‘œํ˜„ํ•˜๊ณ , SQL์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ๊ณผ ์ผ๊ด€์„ฑ์„ ์‰ฝ๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ง€์—ฐ ๋กœ๋”ฉ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์œผ๋กœ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ณ , ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋” ์ง๊ด€์ ์ด๊ณ  ์‘์ง‘๋ ฅ ์žˆ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.