Skip to main content
N+1 ์ฟผ๋ฆฌ ๋ฌธ์ œ๋ฅผ ์ดํ•ดํ•˜๊ณ  Sonamu์˜ Subset๊ณผ Relation ๊ธฐ๋Šฅ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

N+1 ๋ฌธ์ œ๋ž€?

N+1 ๋ฌธ์ œ๋Š” 1๊ฐœ์˜ ๋ฉ”์ธ ์ฟผ๋ฆฌ ํ›„, N๊ฐœ์˜ ์ถ”๊ฐ€ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ ์˜ˆ์‹œ

์„ฑ๋Šฅ ์˜ํ–ฅ:
  • 100๋ช… ์‚ฌ์šฉ์ž โ†’ 101๋ฒˆ ์ฟผ๋ฆฌ
  • 1000๋ช… ์‚ฌ์šฉ์ž โ†’ 1001๋ฒˆ ์ฟผ๋ฆฌ
  • ๋„คํŠธ์›Œํฌ ์™•๋ณต ์‹œ๊ฐ„ ๋ˆ„์ 
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ถ€ํ•˜ ์ฆ๊ฐ€

Sonamu์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

Sonamu๋Š” Subset์„ ํ†ตํ•ด N+1 ๋ฌธ์ œ๋ฅผ ์ž๋™์œผ๋กœ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

1. Subset ์ •์˜

Entity์—์„œ Subset์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค:

2. Subset ์‚ฌ์šฉ

๋‚ด๋ถ€ ๋™์ž‘:
  1. ์‚ฌ์šฉ์ž ์กฐํšŒ (1๋ฒˆ)
  2. ๋ชจ๋“  ์‚ฌ์šฉ์ž ID๋กœ ์ฃผ๋ฌธ ์ผ๊ด„ ์กฐํšŒ (1๋ฒˆ)
  3. ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์กฐ์ธ

Subset ํ™œ์šฉ ํŒจํ„ด

๋‹จ์ผ Relation

๋‹ค์ค‘ Relations

์ค‘์ฒฉ Relations

whereIn์„ ํ™œ์šฉํ•œ ์ˆ˜๋™ ํ•ด๊ฒฐ

Subset์ด ์—†๋Š” ๊ฒฝ์šฐ whereIn์œผ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

DataLoader ํŒจํ„ด

๋ฐ˜๋ณต์ ์ธ ์กฐํšŒ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ DataLoader ํŒจํ„ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

์‹ค์ „ ์˜ˆ์ œ

API ์—”๋“œํฌ์ธํŠธ ์ตœ์ ํ™”

๋Œ€์‹œ๋ณด๋“œ ๋ฐ์ดํ„ฐ

N+1 ๊ฐ์ง€ํ•˜๊ธฐ

์ฟผ๋ฆฌ ๋กœ๊น…

์‹คํ–‰ ํ›„ ์ฝ˜์†”์„ ํ™•์ธํ•˜์„ธ์š”:
๋ฐ˜๋ณต์ ์ธ ๋น„์Šทํ•œ ์ฟผ๋ฆฌ๊ฐ€ ๋ณด์ด๋ฉด N+1 ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค!

ํ…Œ์ŠคํŠธ๋กœ ๊ฐ์ง€

์„ฑ๋Šฅ ๋น„๊ต

N+1 ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ

Subset์œผ๋กœ ์ตœ์ ํ™”ํ•œ ๊ฒฝ์šฐ

40๋ฐฐ ์ด์ƒ ์„ฑ๋Šฅ ํ–ฅ์ƒ!

Best Practices

1. ํ•ญ์ƒ Subset ๋จผ์ € ๊ณ ๋ ค

2. API ์‘๋‹ต์—๋Š” ํ•„์š”ํ•œ Subset ์ •์˜

3. ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋Š” JOIN ๊ณ ๋ ค

4. ๊ฐœ๋ฐœ ์ค‘ ์ฟผ๋ฆฌ ๋ชจ๋‹ˆํ„ฐ๋ง

์ฒดํฌ๋ฆฌ์ŠคํŠธ

N+1 ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด:
  • ๋ฐ˜๋ณต๋ฌธ ์•ˆ์—์„œ DB ์กฐํšŒํ•˜์ง€ ์•Š๊ธฐ
  • Subset์œผ๋กœ ๊ด€๊ณ„ ๋ฐ์ดํ„ฐ ๋ฏธ๋ฆฌ ๋กœ๋“œ
  • whereIn์œผ๋กœ ์ผ๊ด„ ์กฐํšŒ
  • JOIN์„ ํ™œ์šฉํ•œ ์ง‘๊ณ„
  • ๊ฐœ๋ฐœ ์ค‘ ์ฟผ๋ฆฌ ๋กœ๊น… ํ™œ์„ฑํ™”
  • ํ…Œ์ŠคํŠธ๋กœ ์ฟผ๋ฆฌ ์ˆ˜ ๊ฒ€์ฆ
  • API ์‘๋‹ต ์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง

๊ด€๋ จ ๋ฌธ์„œ