2021-04-08(Thu)

ํ•ญ๋ชฉ

๋‚ด์šฉ

ํ•™์Šต ๋‚ ์งœ

2021-04-08(๋ชฉ)

ํ•™์Šต ์‹œ๊ฐ„

09:00~23:00

ํ•™์Šต ๋ฒ”์œ„ ๋ฐ ์ฃผ์ œ

Eager Loading vs Lazy Loading

ํ•™์Šต ๋ชฉํ‘œ

Rails๋ฅผ ํ—ท๊ฐˆ๋ ธ๋˜ ๋ถ€๋ถ„์„ ์ •๋ฆฌํ•œ๋‹ค.

๋™๋ฃŒ ํ•™์Šต ๋ฐฉ๋ฒ•

-

์ƒ์„ธ ํ•™์Šต ๋‚ด์šฉ

Rails ๊ฐœ๋… ๋ณด์ถฉ

Eager loading vs Lazy loading

Lazy Loading์€ ์—ฐ๊ด€๋œ ๋ฐ์ดํ„ฐ๋“ค์„ ์‹ค์ œ๋กœ ์ ‘๊ทผํ•˜๊ธฐ ์ „์—๋Š” ๋กœ๋”ฉํ•˜์ง€ ์•Š๋Š”๋‹ค. Lazy loading์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

users = User.where(status: 'active').joins(:profile)
users.each do |user|
  user_date << {
    name = user.name
    age = user.profile.age
  }
end

๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด users๋ฅผ ํ˜ธ์ถœํ•˜๋Š” 1๋ฒˆ์˜ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ๊ณ , ์ดํ›„ do ๋ฃจํ”„์—์„œ user.profile.age ๊ตฌ๋ฌธ์— ์˜ํ•ด profile์— ์ ‘๊ทผํ•  ๋•Œ๋งˆ๋‹ค N๋ฒˆ์˜ ์ฟผ๋ฆฌ๋ฅผ ์ถ”๊ฐ€๋กœ ๋‚ ๋ฆฌ๊ฒŒ๋œ๋‹ค.

์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ N+1 Problem๋ผ๊ณ  ํ•œ๋‹ค. ๊ทผ๋ณธ์ ์œผ๋กœ ORM์—์„œ Lazy Loading์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒ๋˜๋Š” ๋ฌธ์ œ์ธ ๊ฒƒ์ด๋‹ค.

Rails๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด includes๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ด์ค€๋‹ค.

With includes, Active Record ensures that all of the specified associations are loaded using the minimum possible number of queries

์ž ์•„๋ž˜์ฒ˜๋Ÿผ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด๋ณด์ž.

users = User.where(status: 'active').includes(:profile)
users.each do |user|
  user_date << {
    name = user.name
    age = user.profile.age
  }

์œ„ ์ฝ”๋“œ์—์„œ๋Š” ๋‘ ๋ฒˆ์˜ ์ฟผ๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. users ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ ํ•œ๋ฒˆ, users์— ๋Œ€ํ•œ profile์„ ์ฐพ๋Š”๋ฐ ํ•œ๋ฒˆ. ์ด๋Ÿฌํ•œ ๋กœ๋”ฉ ๋ฐฉ์‹์„ eager loading์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๊ทธ๋Ÿผ joins๊ฐ€ includes๋ณด๋‹ค ํšจ์œจ์ ์ธ ๊ฒฝ์šฐ๋Š” ๋ฌด์—‡์ผ๊นŒ? ์•„๋ž˜์ฒ˜๋Ÿผ ํ•„ํ„ฐ์˜ ์—ญํ• ์„ ํ•  ๊ฒฝ์šฐ ํšจ์œจ์ ์ด๋‹ค.

users = User.joins(:profile).where('profile.status = ?', 'active')
users.each do |user|
  user_date << {
    name = user.name
  }
end

do ๋ฃจํ”„์—์„œ profile์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , profile์€ ๋‹จ์ง€ filter์˜ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

MSA๋ž€?

  • ๋‹จ์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์€ ์„œ๋น„์Šค suite๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•.

  • ๊ฐ๊ฐ ์ž์ฒด ํ”„๋กœ์„ธ์Šค์—์„œ ์‹คํ–‰๋˜๊ณ  ๊ฐ€๋ฒผ์šด ์—ฐ๊ฒฐ๋ฐฉ์‹, ๋Œ€๊ฐœ๋Š” HTTP ๊ธฐ๋ฐ˜ API์™€ ํ†ต์‹ ํ•œ๋‹ค.

  • ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ์„ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์ถ•๋˜๋ฉฐ ์™„์ „ ์ž๋™ํ™” ๋œ ๋ฐฐํฌ ๋จธ์‹ ์„ ํ†ตํ•ด ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ตœ์†Œํ•œ์˜ ์ค‘์•™ ์ง‘์ค‘์‹ ๊ด€๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋˜๊ณ  ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์žฅ์ 

  • ์žฅ์•  ๊ฒฉ๋ฆฌ์™€ ๋ณต๊ตฌ๊ฐ€ ์‰ฝ๋‹ค. ์žฅ์• ๋‚œ ์„œ๋น„์Šค๋งŒ ์žฅ์• ๋‚˜๋‹ˆ๊นŒ.

  • ๋น„์šฉ ํšจ์œจ์ ์œผ๋กœ ์ฆ์„ค์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฆ์„ค์ด ํ•„์š”ํ•œ ์„œ๋น„์Šค๋งŒ ์ฆ์„ค์‹œํ‚ค๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • ์„œ๋น„์Šค ๊ฐœ์„  ์†๋„๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค. ๋น ๋ฅธ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ์ฝ”๋“œ์–‘์ด ์ ์–ด ์‰ฝ๊ฒŒ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ์‹ ๊ธฐ์ˆ  ๋„์ž…์ด ์‰ฝ๋‹ค.

  • Polyglot์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์„œ๋น„์Šค์— ์ตœ์ ํ™”๋œ ๊ฐœ๋ฐœ ์–ธ์–ด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ ํƒํ•˜๊ธฐ ์‰ฝ๋‹ค.

๊ณ ๋ คํ•ด์•ผํ•  ๊ฒƒ

  • MSA์— ์ ํ•ฉํ•œ ์„œ๋น„์Šค์ธ๊ฐ€?

    • ๋น ๋ฅด๊ณ  ์žฆ์€ ๋ฐฐํฌ๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š”๊ฐ€?

    • ์„ฑ๋Šฅ์— ๋ฏผ๊ฐํ•œ ์„œ๋น„์Šค์ธ๊ฐ€? ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฉด ์žฆ์€ ํ†ต์‹ ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

    • ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜์ด ์žˆ๋Š” ์„œ๋น„์Šค์ธ๊ฐ€? ํ•œ๋ฒˆ์— ํŠธ๋žœ์žญ์…˜์„ ์“ธ ์ˆ˜๊ฐ€ ์—†๋‹ค.

  • ๋ฐ์ดํ„ฐ์˜ ์ค‘๋ณต์„ฑ์„ ํ—ˆ์šฉํ•ด์•ผํ•œ๋‹ค.

  • ๋ฐฐํฌ ๋ฐ ๋ฆด๋ฆฌ์ฆˆ๋ฅผ ์ž๋™ํ™”ํ•ด์•ผํ•œ๋‹ค. ์„œ๋น„์Šค๊ฐ€ ๋งŽ๋‹ค๋ณด๋‹ˆ ์ž๋™ํ™”๊ฐ€ ๋˜์ง€ ์•Š์œผ๋ฉด ์šด์˜์— ๊ต‰์žฅํ•œ ๋ถ€๋‹ด์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

  • MSA ์„œ๋น„์Šค์— ๋งž๋Š” ํŒ€์ด ์šด์˜๋˜์–ด์•ผ ํ•œ๋‹ค.

image

NHN ํŽ˜์ด์ฝ”์˜ ๋„๋ฉ”์ธ๋ณ„ MSA ๊ตฌ์ถ• ์‚ฌ๋ก€.

image

์†Œ์Šค ์ค‘๋ณต, ๋ฐฐํฌ์ฃผ๊ธฐ, ํŠธ๋ž˜ํ”ฝ ์œ ์ž…, ๋ถ„์‚ฐํŠธ๋žœ์žญ์…˜ ์ค„์—ฌ์•ผํ•˜๋Š” ๋ถ€๋ถ„๋“ค ๊ณ ๋ คํ•ด์„œ ๋„๋ฉ”์ธ ๋‹ค์‹œ ๊ฒฐํ•ฉํ–ˆ๋‹ค๊ณ ํ•จ.

ํ•™์Šต ๋‚ด์šฉ์— ๋Œ€ํ•œ ๊ฐœ์ธ์ ์ธ ์ดํ‰

์ปค๋จธ์Šค ๋ถ„์•ผ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ  ์‹ถ๋‹ค.

๋‹ค์Œ ํ•™์Šต ๊ณ„ํš

  • QR ์ฝ”๋“œ ๋ฆฌ๋”๊ธฐ์— ํ…Œ์ด๋ธ” ๋ถ™์ด๊ธฐ

Last updated