N+1 ๋ฌธ์ ๋?
N+1 ๋ฌธ์ ๋ 1๊ฐ์ ๋ฉ์ธ ์ฟผ๋ฆฌ ํ, N๊ฐ์ ์ถ๊ฐ ์ฟผ๋ฆฌ๊ฐ ๋ฐ์ํ๋ ์ฑ๋ฅ ๋ฌธ์ ์ ๋๋ค.๋ฌธ์ ์์
- 100๋ช ์ฌ์ฉ์ โ 101๋ฒ ์ฟผ๋ฆฌ
- 1000๋ช ์ฌ์ฉ์ โ 1001๋ฒ ์ฟผ๋ฆฌ
- ๋คํธ์ํฌ ์๋ณต ์๊ฐ ๋์
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ถํ ์ฆ๊ฐ
Sonamu์ ํด๊ฒฐ ๋ฐฉ๋ฒ
Sonamu๋ Subset์ ํตํด N+1 ๋ฌธ์ ๋ฅผ ์๋์ผ๋ก ํด๊ฒฐํฉ๋๋ค.1. Subset ์ ์
Entity์์ Subset์ ์ ์ํฉ๋๋ค:2. Subset ์ฌ์ฉ
- ์ฌ์ฉ์ ์กฐํ (1๋ฒ)
- ๋ชจ๋ ์ฌ์ฉ์ ID๋ก ์ฃผ๋ฌธ ์ผ๊ด ์กฐํ (1๋ฒ)
- ๋ฉ๋ชจ๋ฆฌ์์ ์กฐ์ธ
Subset ํ์ฉ ํจํด
๋จ์ผ Relation
๋ค์ค Relations
์ค์ฒฉ Relations
whereIn์ ํ์ฉํ ์๋ ํด๊ฒฐ
Subset์ด ์๋ ๊ฒฝ์ฐ whereIn์ผ๋ก ์ต์ ํํ ์ ์์ต๋๋ค:DataLoader ํจํด
๋ฐ๋ณต์ ์ธ ์กฐํ๊ฐ ํ์ํ ๊ฒฝ์ฐ DataLoader ํจํด์ ์ฌ์ฉํฉ๋๋ค:์ค์ ์์
API ์๋ํฌ์ธํธ ์ต์ ํ
๋์๋ณด๋ ๋ฐ์ดํฐ
N+1 ๊ฐ์งํ๊ธฐ
์ฟผ๋ฆฌ ๋ก๊น
ํ ์คํธ๋ก ๊ฐ์ง
์ฑ๋ฅ ๋น๊ต
N+1 ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ
Subset์ผ๋ก ์ต์ ํํ ๊ฒฝ์ฐ
Best Practices
1. ํญ์ Subset ๋จผ์ ๊ณ ๋ ค
2. API ์๋ต์๋ ํ์ํ Subset ์ ์
3. ๋ณต์กํ ์ฟผ๋ฆฌ๋ JOIN ๊ณ ๋ ค
4. ๊ฐ๋ฐ ์ค ์ฟผ๋ฆฌ ๋ชจ๋ํฐ๋ง
์ฒดํฌ๋ฆฌ์คํธ
N+1 ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด:- ๋ฐ๋ณต๋ฌธ ์์์ DB ์กฐํํ์ง ์๊ธฐ
- Subset์ผ๋ก ๊ด๊ณ ๋ฐ์ดํฐ ๋ฏธ๋ฆฌ ๋ก๋
- whereIn์ผ๋ก ์ผ๊ด ์กฐํ
- JOIN์ ํ์ฉํ ์ง๊ณ
- ๊ฐ๋ฐ ์ค ์ฟผ๋ฆฌ ๋ก๊น ํ์ฑํ
- ํ ์คํธ๋ก ์ฟผ๋ฆฌ ์ ๊ฒ์ฆ
- API ์๋ต ์๊ฐ ๋ชจ๋ํฐ๋ง