์ฆ์ ๋ก๋ฉ
FetchType.EAGER
- ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ์ฆ์ ์กฐํํ๋ค. ํ์ด๋ฒ๋ค์ดํธ๋ ๊ฐ๋ฅํ๋ฉด SQL ์กฐ์ธ์ ์ฌ์ฉํด์ ํ ๋ฒ์ ์กฐํํ๋ค.
- ์ฆ์ ๋ก๋ฉ์ ์ฌ์ฉํ๋ ค๋ฉด @ManyToOne์ fecth ์์ฑ์ FetchType.EAGER๋ก ์ง์ ํ๋ค.
- @ManyToOne(fetch = FetchType.EAGER)
- JPA ๊ตฌํ์ฒด๋ ์ฆ์ ๋ก๋ฉ์ ์ต์ ํํ๊ธฐ ์ํด ๊ฐ๋ฅํ๋ฉด ์กฐ์ธ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค. ํ์ด๋ฒ๋ค์ดํธ๋ ๊ฐ๋ฅํ๋ฉด SQL ์กฐ์ธ์ ์ฌ์ฉํด์ ํ ๋ฒ์ ์กฐํํ๋ค.
์ฃผ์์
- ์ปฌ๋ ์
์ ํ๋ ์ด์ ์ฆ์ ๋ก๋ฉํ๋ ๊ฒ์ ๊ถ์ฅํ์ง ์๋๋ค.
- ์ปฌ๋ ์ ๊ณผ ์กฐ์ธํ๋ค๋ ๊ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ๋ก ๋ณด๋ฉด ์ผ๋๋ค ์กฐ์ธ์ด๋ค.
- ์๋ฅผ๋ค์ด, A ํ ์ด๋ธ์ N, M ๋ ํ ์ด๋ธ๊ณผ ์ผ๋๋ค ์กฐ์ธํ๋ฉด SQL ์คํ ๊ฒฐ๊ณผ๊ฐ N*M์ด ๋๋ฉด์ ๋๋ฌด ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ ์ ์๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ ์ ํ๋ ์ ์๋ค.
- ๋ฐ๋ผ์ 2๊ฐ ์ด์์ ์ปฌ๋ ์ ์ ์ฆ์ ๋ก๋ฉ์ผ๋ก ์ค์ ํ๋ ๊ฒ์ ๊ถ์ฅํ์ง ์๋๋ค.
- ์ปฌ๋ ์
์ฆ์ ๋ก๋ฉ์ ํญ์ ์ธ๋ถ์กฐ์ธ(OUTER JOIN)์ ์ฌ์ฉํ๋ค. (์ธ๋ถ ์กฐ์ธ๋ณด๋ค ๋ด๋ถ ์กฐ์ธ์ด ์ฑ๋ฅ ์ต์ ํ์ ๋ ์ ๋ฆฌํจ p.298)
- ๋ค๋์ผ ๊ด๊ณ์ธ ํ์ ํ ์ด๋ธ๊ณผ ํ ํ ์ด๋ธ์ ์กฐ์ธํ ๋ ํ์ ํ ์ด๋ธ์ ์ธ๋ ํค์ not null ์ ์ฝ์กฐ๊ฑด์ ๊ฑธ์ด๋๋ฉด ๋ชจ๋ ํ์์ ํ์ ์์๋๋ฏ๋ก ํญ์ ๋ด๋ถ ์กฐ์ธ์ ์ฌ์ฉํด๋ ๋๋ค.
- ๋ฐ๋๋ก ํ ํ ์ด๋ธ์์ ํ์ ํ ์ด๋ธ๋ก ์ผ๋๋ค ๊ด๊ณ๋ฅผ ์กฐ์ธํ ๋ ํ์์ด ํ ๋ช ๋ ์๋ ํ์ ๋ด๋ถ ์กฐ์ธํ๋ฉด ํ๊น์ง ์กฐํ๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฝ์กฐ๊ฑด์ผ๋ก ์ด๋ฐ ์ํฉ์ ๋ง์ ์ ์๋ค.
- ๋ฐ๋ผ์ JPA๋ ์ผ๋๋ค ๊ด๊ณ๋ฅผ ์ฆ์ ๋ก๋ฉํ ๋ ํญ์ ์ธ๋ถ ์กฐ์ธ์ ์ฌ์ฉํ๋ค.
๊ธ๋ก๋ฒ ํ์น ์ ๋ต์ ์ฆ์ ๋ก๋ฉ ์ฌ์ฉ ์ ๋จ์
- ์ฌ์ฉํ์ง ์๋ ์ํฐํฐ๋ฅผ ๋ก๋ฉํ๋ค.
- 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 ํ์น ์กฐ์ธ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
์ง์ฐ ๋ก๋ฉ
FetchType.LAZY
- ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ํ๋ก์๋ก ์กฐํํ๋ค. ํ๋ก์๋ฅผ ์ค์ ์ฌ์ฉํ ๋ ์ด๊ธฐํํ๋ฉด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐํํ๋ค.
- ์ง์ฐ ๋ก๋ฉ์ ์ฌ์ฉํ๋ ค๋ฉด @ManyToOne์ fecth ์์ฑ์ FetchType.LAZY๋ก ์ง์ ํ๋ค.
- @ManyToOne(fetch = FetchType.LAZY)
- ์ฐธ๊ณ ) ์กฐํ ๋์์ด ์์์ฑ ์ปจํ ์คํธ์ ์ด๋ฏธ ์์ผ๋ฉด ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ด์ ๊ฐ ์๋ค. ๋ฐ๋ผ์ ์์์ฑ ์ปจํ ์คํธ์ ์ด๋ฏธ ๋ก๋ฉ๋์ด ์์ผ๋ฉด ํ๋ก์ ๊ฐ์ฒด๊ฐ ์๋ ์ค์ ๊ฐ์ฒด(์ํฐํฐ)๋ฅผ ์ฌ์ฉํ๋ค.
JPA ๊ธฐ๋ณธ ํ์น ์ ๋ต
- @ManyToOne, @OneToOne : ์ฆ์ ๋ก๋ฉ
- optional = false : ๋ด๋ถ ์กฐ์ธ
- optional = true : ์ธ๋ถ ์กฐ์ธ
- @OneToMany, @ManyToMany : ์ง์ฐ ๋ก๋ฉ
- optional = false : ์ธ๋ถ ์กฐ์ธ
- optional = true : ์ธ๋ถ ์กฐ์ธ
์ถ์ฒํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ ์ฐ๊ด๊ด๊ณ์ ์ง์ฐ ๋ก๋ฉ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ ์ฌ์ฉํ๋ ์ํฉ์ ๋ณด๊ณ ๊ผญ ํ์ํ ๊ณณ์๋ง ์ฆ์ ๋ก๋ฉ์ ์ฌ์ฉํ๋๋ก ์ต์ ํํ๋ฉด ๋๋ค.
์ฐธ๊ณ
- ์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ [๊น์ํ, ์์ด์ฝ]
- https://logical-code.tistory.com/140
'๐ > 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 |
๋๊ธ