SPRING๊ณผ JPA๋ฅผ ์ฌ์ฉํ ํ๋ก์ ํธ๋ฅผ ์์ ์ ํ์๋ค๊ณผ N+1 ๋ฌธ์ ์ ๋ํด ์ด์ผ๊ธฐ๋ฅผ ๋๋ด๋ค.
๋ค์ด๋ ๋ดค์ง๋ง ์์ง ๋ง์ฃผ์น์ ์์๊ธฐ์ ๋ฏธ๋ฆฌ ๊ณต๋ถํด ๋ณด๊ณ ์ ํ๋ค.
์ค๋์ ํ ์ผ์ด ๋ง์๊ธฐ์ chatGPT์๊ฒ ๋ฌผ์ด๋ด์ ์งง๊ณ ๋น ๋ฅด๊ฒ ์ดํดํด๋ณธ๋ค.
JPA์์ N+1 ๋ฌธ์ ์์ธ๊ณผ ํด๊ฒฐ๋ฐฉ๋ฒ ์๋ ค์ค
JPA N+1 ๋ฌธ์ ์์ธ ๋ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ
JPA (Java Persistence API)์์ N+1 ๋ฌธ์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํฐํฐ๋ฅผ ์กฐํํ ๋ ๋ฐ์ํ๋ ์ฑ๋ฅ ๋ฌธ์ ์ ์ผ์ข ์ ๋๋ค. ์ด ๋ฌธ์ ๋ ์ฃผ๋ก ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ํจ๊ป ์กฐํํ ๋ ๋ฐ์ํ๋ฉฐ, ์์๋ณด๋ค ๋ง์ ์์ ์ฟผ๋ฆฌ๊ฐ ์คํ๋์ด ์ฑ๋ฅ ์ ํ๋ฅผ ์ ๋ฐํฉ๋๋ค.
N+1 ๋ฌธ์ ์ ์์ธ
N+1 ๋ฌธ์ ๋ ์ฃผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์ ๋ฐ์ํฉ๋๋ค.
- 1:N ๊ด๊ณ์ ์ํฐํฐ ์กฐํ: ์๋ฅผ ๋ค์ด, Author ์ํฐํฐ์ Book ์ํฐํฐ๊ฐ 1:N ๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค. Author ์ํฐํฐ๋ฅผ ์กฐํํ ๋, ๊ฐ Author์ ๋ํ Book ์ํฐํฐ๋ฅผ ํจ๊ป ์กฐํํ๋ ค๊ณ ํ๋ฉด N+1 ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์ง์ฐ ๋ก๋ฉ (Lazy Loading): JPA๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ฐ ๋ก๋ฉ์ ์ฌ์ฉํฉ๋๋ค. ์ฆ, ์ํฐํฐ๋ฅผ ์กฐํํ ๋ ์ฐ๊ด๋ ์ํฐํฐ๋ ์ค์ ๋ก ์ฌ์ฉ๋ ๋๊น์ง ๋ก๋ฉํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ 1:N ๊ด๊ณ์์ Author ์ํฐํฐ๋ฅผ ์กฐํํ ํ ๊ฐ Author์ Book ์ํฐํฐ์ ์ ๊ทผํ ๋๋ง๋ค ์ถ๊ฐ์ ์ธ ์ฟผ๋ฆฌ๊ฐ ์คํ๋ฉ๋๋ค.
N+1 ๋ฌธ์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
N+1 ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
1. Fetch Join
Fetch Join์ JPQL (Java Persistence Query Language)์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ผ๋ก, ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ํจ๊ป ์กฐํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. Fetch Join์ ์ฌ์ฉํ๋ฉด N+1 ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ํ ๋ฒ์ ์ฟผ๋ฆฌ๋ก ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
2. @EntityGraph
@EntityGraph ์ด๋ ธํ ์ด์ ์ ์ํฐํฐ๋ฅผ ์กฐํํ ๋ ํจ๊ป ๋ก๋ฉํ ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. @EntityGraph๋ฅผ ์ฌ์ฉํ๋ฉด Fetch Join๊ณผ ์ ์ฌํ ํจ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
3. Batch Size
@BatchSize ์ด๋ ธํ ์ด์ ์ ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ํ ๋ฒ์ ๋ก๋ฉํ ๊ฐ์๋ฅผ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. @BatchSize๋ฅผ ์ฌ์ฉํ๋ฉด N+1 ๋ฌธ์ ๋ฅผ ์๋ฒฝํ๊ฒ ํด๊ฒฐํ ์๋ ์์ง๋ง, ์ฟผ๋ฆฌ ์คํ ํ์๋ฅผ ์ค์ฌ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
4. CascadeType.ALL
CascadeType.ALL์ ๋ถ๋ชจ ์ํฐํฐ์ ๋ํ ๋ชจ๋ ์์ ์ ์์ ์ํฐํฐ์๋ ์ ํํ๋ ์ต์ ์ ๋๋ค. CascadeType.ALL์ ์ฌ์ฉํ๋ฉด ๋ถ๋ชจ ์ํฐํฐ๋ฅผ ์กฐํํ ๋ ์์ ์ํฐํฐ๋ ํจ๊ป ๋ก๋ฉ๋๋ฏ๋ก N+1 ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ํ์ง๋ง CascadeType.ALL์ ์์์น ์์ ๋ถ์์ฉ์ ์ผ์ผํฌ ์ ์์ผ๋ฏ๋ก ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ฃผ์ ์ฌํญ
- N+1 ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์ํฉ์ ๋ง๋ ์ ์ ํ ๋ฐฉ๋ฒ์ ์ ํํด์ผ ํฉ๋๋ค.
- Fetch Join์ ์นดํ ์์ ๊ณฑ (Cartesian Product)์ ๋ฐ์์ํฌ ์ ์์ผ๋ฏ๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
- @EntityGraph๋ JPA 2.1 ์ด์์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
N+1 ๋ฌธ์ ๋ JPA์์ ๋ฐ์ํ ์ ์๋ ํํ ์ฑ๋ฅ ๋ฌธ์ ์ด์ง๋ง, ์ ์ ํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค. Fetch Join, @EntityGraph, @BatchSize ๋ฑ์ ๋ฐฉ๋ฒ์ ํ์ฉํ์ฌ N+1 ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฅ์์ํค์ธ์.
์์ผ๋ก ํ๋ก์ ํธ์์ ์์ ๋ฌธ์ ๋ฅผ ๋ง์ฃผ์ณค์๋, ์ํํ ํด๊ฒฐํ ์ ์์ ๊ฒ ๊ฐ๋ค.
'๊ณต๋ถ > TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [20250217] webclient ๊ธฐ๋ณธ ์์๋ก ์ฌ์ฉ๋ฐฉ๋ฒ ์์๋ณด๊ธฐ! (0) | 2025.02.17 |
|---|---|
| [20250214] querydsl ๊ธฐ๋ณธ ์์๋ก ์ฌ์ฉ๋ฐฉ๋ฒ ์์๋ณด๊ธฐ! (0) | 2025.02.14 |
| [20250213] 1:1, 1:n, n:m ํ ์ด๋ธ ๊ด๊ณ ์ ๋ฆฌ (0) | 2025.02.13 |
| [20250211] JPA ์ฌํ๊ณผ์ ํ๊ธฐ (0) | 2025.02.11 |
| [~20250210] Spring ์ ๋ฌธ์ฃผ์ฐจ ํ๊ธฐ (2) | 2025.02.11 |