Skip to main content
LoaderQuery๋Š” 1:N, N:M ๊ด€๊ณ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋กœ๋”ฉํ•˜๋Š” ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

LoaderQuery ๊ฐœ์š”

1:N ๊ด€๊ณ„

๋ถ€๋ชจ โ†’ ์ž์‹ ์—ฌ๋Ÿฌ ๊ฐœ HasMany

N:M ๊ด€๊ณ„

์–‘๋ฐฉํ–ฅ ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„ ManyToMany

N+1 ํ•ด๊ฒฐ

ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ Batch Loading

์ค‘์ฒฉ Loader

์žฌ๊ท€์  ๊ด€๊ณ„ ๋กœ๋”ฉ Nested Relations

LoaderQuery vs SubsetQuery

SubsetQuery (JOIN)

OneToOne ๋˜๋Š” BelongsTo ๊ด€๊ณ„์— ์ ํ•ฉ:

LoaderQuery (Separate Query)

HasMany ๋˜๋Š” ManyToMany ๊ด€๊ณ„์— ์ ํ•ฉ:

LoaderQuery ์ •์˜

LoaderQuery๋Š” subset-loaders.ts ํŒŒ์ผ์—์„œ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค:
LoaderQuery๋Š” ์ž๋™์œผ๋กœ Batch Loading์„ ์ˆ˜ํ–‰ํ•˜์—ฌ N+1 ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

1:N ๊ด€๊ณ„ (HasMany)

๋ถ€์„œ โ†’ ์ง์›๋“ค

์‚ฌ์šฉ ์˜ˆ์‹œ:

N:M ๊ด€๊ณ„ (ManyToMany)

ํ”„๋กœ์ ํŠธ โ†” ์ง์›

์‚ฌ์šฉ ์˜ˆ์‹œ:

์ค‘์ฒฉ LoaderQuery

์ค‘์ฒฉ LoaderQuery ๊ตฌ์กฐ
LoaderQuery๋Š” ์žฌ๊ท€์ ์œผ๋กœ ์ค‘์ฒฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
๊ฒฐ๊ณผ ๊ตฌ์กฐ:

Batch Loading ๋™์ž‘ ์›๋ฆฌ

N+1 ๋ฌธ์ œ์™€ Batch Loading ํ•ด๊ฒฐ

N+1 ๋ฌธ์ œ

Batch Loading ํ•ด๊ฒฐ

์‹ค์ „ ์˜ˆ์ œ

๋ถ€์„œ๋ณ„ ์ง์› ๋ชฉ๋ก

ํ”„๋กœ์ ํŠธ ๋Œ€์‹œ๋ณด๋“œ

์‚ฌ์šฉ์ž ํ™œ๋™ ์š”์•ฝ

LoaderQuery ์„ค๊ณ„ ์›์น™

1. ํ•„์š”ํ•œ ํ•„๋“œ๋งŒ SELECT

2. ์ •๋ ฌ๊ณผ ์ œํ•œ

3. ์กฐ๊ฑด ํ•„ํ„ฐ๋ง

์‹ค์ „ ๋ณต์žกํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค

์‹ค๋ฌด์—์„œ ์ž์ฃผ ๋งˆ์ฃผ์น˜๋Š” ๋ณต์žกํ•œ Subset ํŒจํ„ด๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์‹œ๋‚˜๋ฆฌ์˜ค 1: ๋™์  Subset ์„ ํƒ

์‚ฌ์šฉ์ž ๊ถŒํ•œ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ Subset์„ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด
ํ•ต์‹ฌ ํฌ์ธํŠธ:
  • ์‚ฌ์šฉ์ž Context๋ฅผ ํ™•์ธํ•˜์—ฌ ์ ์ ˆํ•œ Subset ์„ ํƒ
  • ํƒ€์ž… ๋‹จ์–ธ(as T)์œผ๋กœ ํƒ€์ž… ์•ˆ์ „์„ฑ ์œ ์ง€
  • ๊ถŒํ•œ๋ณ„ ์ถ”๊ฐ€ ํ•„ํ„ฐ๋ง ์ ์šฉ

์‹œ๋‚˜๋ฆฌ์˜ค 2: ๊นŠ์€ ์ค‘์ฒฉ ๊ด€๊ณ„ (3๋‹จ๊ณ„ ์ด์ƒ)

์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ์ค‘์ฒฉ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋กœ๋“œ
์„ฑ๋Šฅ ๊ณ ๋ ค์‚ฌํ•ญ:
  • 3๋‹จ๊ณ„ ์ด์ƒ ์ค‘์ฒฉ ์‹œ ์ฟผ๋ฆฌ ์ˆ˜ ์ฆ๊ฐ€ (N+1 ๋ฌธ์ œ ์ฃผ์˜)
  • ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ๊นŠ์€ ์ค‘์ฒฉ ์‚ฌ์šฉ
  • ํŽ˜์ด์ง€๋„ค์ด์…˜๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์–‘ ์ œํ•œ

์‹œ๋‚˜๋ฆฌ์˜ค 3: ์กฐ๊ฑด๋ถ€ ์ค‘์ฒฉ ๋กœ๋”ฉ

ํŠน์ • ์กฐ๊ฑด์ผ ๋•Œ๋งŒ ์ค‘์ฒฉ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œ
ํ™œ์šฉ ์‚ฌ๋ก€:
  • ๋ชจ๋ฐ”์ผ vs ์›น์—์„œ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ๋กœ๋“œ
  • ์‚ฌ์šฉ์ž ์„ค์ •์— ๋”ฐ๋ฅธ ์„ ํƒ์  ๋ฐ์ดํ„ฐ ๋กœ๋“œ
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ํ•„์š”์‹œ์—๋งŒ ๋กœ๋“œ

์‹œ๋‚˜๋ฆฌ์˜ค 4: N+1 ๋ฌธ์ œ ํ•ด๊ฒฐ

์—ฌ๋Ÿฌ ๊ด€๊ณ„๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋กœ๋“œํ•˜์—ฌ N+1 ๋ฌธ์ œ ๋ฐฉ์ง€
N+1 ๋ฌธ์ œ ๋น„๊ต:

์‹œ๋‚˜๋ฆฌ์˜ค 5: ์ˆœํ™˜ ์ฐธ์กฐ ์ฒ˜๋ฆฌ (์ž๊ธฐ ์ฐธ์กฐ)

๋Œ“๊ธ€ ๋Œ€๋Œ“๊ธ€, ์กฐ์ง๋„ ๋“ฑ ์ž๊ธฐ ์ฐธ์กฐ ๊ด€๊ณ„ ์ฒ˜๋ฆฌ
์ž๊ธฐ ์ฐธ์กฐ ํŒจํ„ด ๋น„๊ต:
์ˆœํ™˜ ์ฐธ์กฐ ์ฃผ์˜์‚ฌํ•ญ: 1. ๋ฌดํ•œ ๋ฃจํ”„ ๋ฐฉ์ง€: ์ตœ๋Œ€ ๊นŠ์ด ์ œํ•œ ํ•„์ˆ˜ 2. ์ˆœํ™˜ ๋ฐ์ดํ„ฐ: A โ†’ B โ†’ A ๊ฐ™์€ ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ 3. ์„ฑ๋Šฅ: ๊นŠ์ด๊ฐ€ ๊นŠ์–ด์งˆ์ˆ˜๋ก ์žฌ๊ท€ ํ˜ธ์ถœ ์ฆ๊ฐ€ 4. ๋ฉ”๋ชจ๋ฆฌ: ํฐ ํŠธ๋ฆฌ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ฃผ์˜

์‹œ๋‚˜๋ฆฌ์˜ค 6: ๋™์  ํ•„ํ„ฐ๋ง with Subset

์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•˜๋ฉด์„œ Subset ํ™œ์šฉ
๋™์  ํ•„ํ„ฐ๋ง Best Practice:
  1. ์„ ํƒ์  ํ•„ํ„ฐ: undefined ์ฒดํฌ๋กœ ์กฐ๊ฑด๋ถ€ ์ ์šฉ
  2. ํƒ€์ž… ์•ˆ์ „์„ฑ: TypeScript๋กœ ํ•„ํ„ฐ ํŒŒ๋ผ๋ฏธํ„ฐ ์ •์˜
  3. SQL Injection ๋ฐฉ์ง€: ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ ์‚ฌ์šฉ
  4. ์„ฑ๋Šฅ ์ตœ์ ํ™”: ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ์ปฌ๋Ÿผ ์šฐ์„  ํ•„ํ„ฐ๋ง

๋‹ค์Œ ๋‹จ๊ณ„

Subset ์ •์˜

Entity์—์„œ Subset ์ƒ์„ฑ

Subset ์‚ฌ์šฉ

Model์—์„œ Subset ํ™œ์šฉ

Model ๋ฉ”์„œ๋“œ

Model CRUD ๋ฉ”์„œ๋“œ

Puri ์กฐ์ธ

Puri JOIN ์ฟผ๋ฆฌ