๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’Ž/Spring

[JPA] ์ฆ‰์‹œ ๋กœ๋”ฉ, ์ง€์—ฐ ๋กœ๋”ฉ | FetchType.EAGER, FetchType.LAZY

by dar0m! 2021. 8. 31.

์ฆ‰์‹œ ๋กœ๋”ฉ

FetchType.EAGER
  • ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ฆ‰์‹œ ์กฐํšŒํ•œ๋‹ค. ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๋Š” ๊ฐ€๋Šฅํ•˜๋ฉด SQL ์กฐ์ธ์„ ์‚ฌ์šฉํ•ด์„œ ํ•œ ๋ฒˆ์— ์กฐํšŒํ•œ๋‹ค.
  • ์ฆ‰์‹œ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด @ManyToOne์˜ fecth ์†์„ฑ์„ FetchType.EAGER๋กœ ์ง€์ •ํ•œ๋‹ค.
  • @ManyToOne(fetch = FetchType.EAGER)
  • JPA ๊ตฌํ˜„์ฒด๋Š” ์ฆ‰์‹œ ๋กœ๋”ฉ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€๋Šฅํ•˜๋ฉด ์กฐ์ธ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํ•˜์ด๋ฒ„๋„ค์ดํŠธ๋Š” ๊ฐ€๋Šฅํ•˜๋ฉด SQL ์กฐ์ธ์„ ์‚ฌ์šฉํ•ด์„œ ํ•œ ๋ฒˆ์— ์กฐํšŒํ•œ๋‹ค.

์ฃผ์˜์ 

  1. ์ปฌ๋ ‰์…˜์„ ํ•˜๋‚˜ ์ด์ƒ ์ฆ‰์‹œ ๋กœ๋”ฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ์ปฌ๋ ‰์…˜๊ณผ ์กฐ์ธํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๋กœ ๋ณด๋ฉด ์ผ๋Œ€๋‹ค ์กฐ์ธ์ด๋‹ค.
    • ์˜ˆ๋ฅผ๋“ค์–ด, A ํ…Œ์ด๋ธ”์„ N, M ๋‘ ํ…Œ์ด๋ธ”๊ณผ ์ผ๋Œ€๋‹ค ์กฐ์ธํ•˜๋ฉด SQL ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ N*M์ด ๋˜๋ฉด์„œ ๋„ˆ๋ฌด ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค. 
    • ๋”ฐ๋ผ์„œ 2๊ฐœ ์ด์ƒ์˜ ์ปฌ๋ ‰์…˜์„ ์ฆ‰์‹œ ๋กœ๋”ฉ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
  2. ์ปฌ๋ ‰์…˜ ์ฆ‰์‹œ ๋กœ๋”ฉ์€ ํ•ญ์ƒ ์™ธ๋ถ€์กฐ์ธ(OUTER JOIN)์„ ์‚ฌ์šฉํ•œ๋‹ค. (์™ธ๋ถ€ ์กฐ์ธ๋ณด๋‹ค ๋‚ด๋ถ€ ์กฐ์ธ์ด ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ๋” ์œ ๋ฆฌํ•จ p.298)
    • ๋‹ค๋Œ€์ผ ๊ด€๊ณ„์ธ ํšŒ์› ํ…Œ์ด๋ธ”๊ณผ ํŒ€ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•  ๋•Œ ํšŒ์› ํ…Œ์ด๋ธ”์˜ ์™ธ๋ž˜ ํ‚ค์— not null ์ œ์•ฝ์กฐ๊ฑด์„ ๊ฑธ์–ด๋‘๋ฉด ๋ชจ๋“  ํšŒ์›์€ ํŒ€์— ์†Œ์†๋˜๋ฏ€๋กœ ํ•ญ์ƒ ๋‚ด๋ถ€ ์กฐ์ธ์„ ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค.
    • ๋ฐ˜๋Œ€๋กœ ํŒ€ ํ…Œ์ด๋ธ”์—์„œ ํšŒ์› ํ…Œ์ด๋ธ”๋กœ ์ผ๋Œ€๋‹ค ๊ด€๊ณ„๋ฅผ ์กฐ์ธํ•  ๋•Œ ํšŒ์›์ด ํ•œ ๋ช…๋„ ์—†๋Š” ํŒ€์„ ๋‚ด๋ถ€ ์กฐ์ธํ•˜๋ฉด ํŒ€๊นŒ์ง€ ์กฐํšŒ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ œ์•ฝ์กฐ๊ฑด์œผ๋กœ ์ด๋Ÿฐ ์ƒํ™ฉ์„ ๋ง‰์„ ์ˆ˜ ์—†๋‹ค.
    • ๋”ฐ๋ผ์„œ JPA๋Š” ์ผ๋Œ€๋‹ค ๊ด€๊ณ„๋ฅผ ์ฆ‰์‹œ ๋กœ๋”ฉํ•  ๋•Œ ํ•ญ์ƒ ์™ธ๋ถ€ ์กฐ์ธ์„ ์‚ฌ์šฉํ•œ๋‹ค. 

๊ธ€๋กœ๋ฒŒ ํŽ˜์น˜ ์ „๋žต์— ์ฆ‰์‹œ ๋กœ๋”ฉ ์‚ฌ์šฉ ์‹œ ๋‹จ์ 

  1. ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋กœ๋”ฉํ•œ๋‹ค.
  2. N+1๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
    • ๋ฌธ์ œ๋Š” JPQL์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค. JPA๊ฐ€ JPQL์„ ๋ถ„์„ํ•ด์„œ SQL์„ ์ƒ์„ฑํ•  ๋•Œ๋Š” ๊ธ€๋กœ๋ฒŒ ํŽ˜์น˜ ์ „๋žต์„ ์ฐธ๊ณ ํ•˜์ง€ ์•Š๊ณ  ์˜ค์ง JPQL ์ž์ฒด๋งŒ ์‚ฌ์šฉํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ฆ‰์‹œ ๋กœ๋”ฉ์ด๋“  ์ง€์—ฐ ๋กœ๋”ฉ์ด๋“  ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๊ณ  JPQL ์ฟผ๋ฆฌ ์ž์ฒด์— ์ถฉ์‹คํ•˜๊ฒŒ SQL์„ ๋งŒ๋“ ๋‹ค.
    • ๋งŒ์•ฝ order : member = N : 1 ์ธ ManyToOne ๊ด€๊ณ„์—์„œ ์กฐํšŒํ•œ order ์—”ํ‹ฐํ‹ฐ๊ฐ€ 10๊ฐœ์ด๋ฉด member๋ฅผ ์กฐํšŒํ•˜๋Š” SQL๋„ 10๋ฒˆ ์‹คํ–‰ํ•œ๋‹ค. ์ด์ฒ˜๋Ÿผ ์ฒ˜์Œ ์กฐํšŒํ•œ ๋ฐ์ดํ„ฐ ์ˆ˜๋งŒํผ ๋‹ค์‹œ SQL์„ ์‚ฌ์šฉํ•ด์„œ ์กฐํšŒํ•˜๋Š” ๊ฒƒ์„ N+1 ๋ฌธ์ œ๋ผ ํ•œ๋‹ค. N+1์ด ๋ฐœ์ƒํ•˜๋ฉด SQL์ด ์ƒ๋‹นํžˆ ๋งŽ์ด ํ˜ธ์ถœ๋˜๋ฏ€๋กœ ์กฐํšŒ ์„ฑ๋Šฅ์— ์น˜๋ช…์ ์ด๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ๋Š” JPQL ํŽ˜์น˜ ์กฐ์ธ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
 

JPA N+1 ๋ฌธ์ œ ๋ฐ ํ•ด๊ฒฐ๋ฐฉ์•ˆ

์•ˆ๋…•ํ•˜์„ธ์š”? ์ด๋ฒˆ ์‹œ๊ฐ„์—” JPA์˜ N+1 ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฝ”๋“œ๋Š” Github์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•จ๊ป˜ ๋ณด์‹œ๋ฉด ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šฐ์‹ค ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. (๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜๋Š” Github์™€ ์„ธ๋ฏธ

jojoldu.tistory.com

 

์ง€์—ฐ ๋กœ๋”ฉ

FetchType.LAZY
  • ์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ”„๋ก์‹œ๋กœ ์กฐํšŒํ•œ๋‹ค. ํ”„๋ก์‹œ๋ฅผ ์‹ค์ œ ์‚ฌ์šฉํ•  ๋•Œ ์ดˆ๊ธฐํ™”ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐํšŒํ•œ๋‹ค.
  • ์ง€์—ฐ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด @ManyToOne์˜ fecth ์†์„ฑ์„ FetchType.LAZY๋กœ ์ง€์ •ํ•œ๋‹ค.
  • @ManyToOne(fetch = FetchType.LAZY)
  • ์ฐธ๊ณ ) ์กฐํšŒ ๋Œ€์ƒ์ด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ด๋ฏธ ์žˆ์œผ๋ฉด ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ด์œ ๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ด๋ฏธ ๋กœ๋”ฉ๋˜์–ด ์žˆ์œผ๋ฉด ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ๊ฐ์ฒด(์—”ํ‹ฐํ‹ฐ)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 

 

JPA ๊ธฐ๋ณธ ํŽ˜์น˜ ์ „๋žต

  • @ManyToOne, @OneToOne : ์ฆ‰์‹œ ๋กœ๋”ฉ
    • optional = false : ๋‚ด๋ถ€ ์กฐ์ธ
    • optional = true : ์™ธ๋ถ€ ์กฐ์ธ
  • @OneToMany, @ManyToMany : ์ง€์—ฐ ๋กœ๋”ฉ
    • optional = false : ์™ธ๋ถ€ ์กฐ์ธ
    • optional = true : ์™ธ๋ถ€ ์กฐ์ธ

์ถ”์ฒœํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ์—ฐ๊ด€๊ด€๊ณ„์— ์ง€์—ฐ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ์‚ฌ์šฉํ•˜๋Š” ์ƒํ™ฉ์„ ๋ณด๊ณ  ๊ผญ ํ•„์š”ํ•œ ๊ณณ์—๋งŒ ์ฆ‰์‹œ ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ตœ์ ํ™”ํ•˜๋ฉด ๋œ๋‹ค.

 

์ฐธ๊ณ 

'๐Ÿ’Ž > Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Spring] DI(Dependency Injection)  (0) 2021.05.02
[Spring] PSA (Portable Service Abstraction)  (0) 2021.05.02
[Spring] AOP  (0) 2021.04.18
[Spring] Pageable ๋‹ค์ค‘ Sorting | PageableDefault | Pagination  (1) 2020.01.09

๋Œ“๊ธ€