๐ก ์๋ณธ ๊ธ : https://blog.appsignal.com/2021/07/07/general-ruby-on-rails-problems-and-takeaways.html
Ruby On Rails ํจํด ๋ฐ ์ํฐ ํจํด ์๋ฆฌ์ฆ ๋ง์ง๋ง ํํธ์ ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค. ์ด ๋ชจ๋ ์ฃผ์ ๋ฅผ ๋ฆฌ์์นํ๊ณ ์์ฑํ๋ ๊ฒ์ ๊ฝค๋ ์ฆ๊ฑฐ์ด ์ผ์ด์์ต๋๋ค. ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์๋ ์๋ ๋์ Ruby On Rails ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๊ณ ์ถ์ ํ ๋ ๊ฒช์๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ค์ ์ดํด๋ณผ ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ์ ์ดํด๋ณผ ์๊ฐ๋ค์ ์ฝ๋์ ๊ฑฐ์ ๋ชจ๋ ๊ณณ์ ์ ์ฉ๋ฉ๋๋ค. ๋ฐ๋ผ์ MVC ํจํด๊ณผ ๊ด๋ จ๋ ๊ฒ์ด ์๋๋ผ ์ผ๋ฐ์ ์ธ ์๊ฐ๋ค๋ก ๋ด์ฃผ์๋ฉด ์ข๊ฒ ์ต๋๋ค. Rails MVC์ ๊ด๋ จ๋ ํจํด ๋ฐ ์ํฐ ํจํด์ ๊ด์ฌ์ด ์๋ค๋ฉด Model(๋ฒ์ญ), View(๋ฒ์ญ), Controller(๋ฒ์ญ) ๋ธ๋ก๊ทธ ํฌ์คํ ์ ํ์ธํด๋ณด์ธ์.
๊ทธ๋ผ ์ด์ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ์ ํด๊ฒฐ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ด๊ธฐ์ ์ธ ๊ฐ์ฒด์ ๋๋ฏธํฐ์ ๋ฒ์น
๋๋ฏธํฐ์ ๋ฒ์น์ ๋๋ฏธํฐ ํ๋ก์ ํธ์์ ์ฌ๋ฌ ์ฌ๋๋ค์ด ํจ๊ป ์์ ํ๋ฉด์ ๊ทธ ์ด๋ฆ์ ์ป์ ํด๋ฆฌ์คํฑ ์ ๋๋ค. ์ด ๋ฒ์น์ ๊ฐ์ฒด๊ฐ ํ๋ฒ์ ํ๋์ ๋ฉ์๋๋ง ํธ์ถํ๊ณ ์ฌ๋ฌ ๋ฉ์๋์ ํธ์ถ์ ์ฐ์์ ์ผ๋ก ํ์ง ์๋๊ฒ์ด ์ข๋ค๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด ์ค์ ๋ก ์๋ฏธํ๋ ๋ฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
# Bad
song.label.address
# Good
song.label_address
์ด์ song ๊ฐ์ฒด๋ ๋ ์ด์ address๊ฐ ์ด๋์ ๊ฐ์ง๊ณ ์๋์ง ์ ํ์๊ฐ ์์ต๋๋ค. address๋ label ๊ฐ์ฒด์ ์ฑ ์์ ๋๋ค. ๋ฉ์๋ ํธ์ถ์ ํ ๋ฒ๋ง ํ๊ณ , ๊ฐ์ฒด๋ฅผ ์ด๊ธฐ์ ์ผ๋ก ๋ง๋ค์ด ์ ์ฒด ์ ๋ณด๋ฅผ ๊ณต์ ํ์ง ์๊ณ helper ๋ฉ์๋๋ฅผ ํตํด ๊ณต์ ํ๋๋ก ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
Rails์์๋ helper ๋ฉ์๋ ์์ฒด๋ฅผ ์์ฑํ ํ์๊ฐ ์์ด delegate ํฌํผ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
def Label < ApplicationModel
belongs_to :song
delegate :address, to: :song
end
delegate๊ฐ ๊ฐ๋ฅํ ์ต์ ์ ๋ฌธ์์์ ํ์ธํด๋ณผ์ ์์ต๋๋ค. ํ์ง๋ง ๊ด๋ จํ ๋ด์ฉ๊ณผ ์คํ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ๋๋ฏธํฐ์ ๋ฒ์น์ ์ ์ฉํ๋ฉด ๊ตฌ์กฐ์ ๊ฒฐํฉ์ ์ค์ผ ์ ์์ต๋๋ค. ๊ฐ๋ ฅํ delegate์ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋ ์ ์ ์ค๋ก, ๋ ๋ง์ ์ต์ ์ด ํฌํจ๋ ์ํ๋ก ์ด ์์ ์ ์ํํ ์ ์์ต๋๋ค.
๋๋ฏธํฐ์ ๋ฒ์น๊ณผ ๋งค์ฐ ์ ์ํ ๋ ๋ค๋ฅธ ์์ด๋์ด๋ ๋จ์ผ์ฑ ์์์น(SRP)์ ๋๋ค. ์ด ์์น์ ๋ชจ๋, ํด๋์ค ๋๋ ๋ฉ์๋๊ฐ ์์คํ ํ ๋ถ๋ถ์ ์ฑ ์์ ธ์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์๋์ ๊ฐ์ ๋ง๋ก ํํํฉ๋๋ค.
๊ฐ์ ์ด์ ๋ก ๋ณ๊ฒฝ๋๋ ํญ๋ชฉ์ ํ๊ตฐ๋ฐ๋ก ๋ชจ์๋๋ค. ๋ค๋ฅธ ์ด์ ๋ก ๋ณ๊ฒฝ๋๋ ํญ๋ชฉ์ ๋ถ๋ฆฌํฉ๋๋ค.
์ฌ๋๋ค์ ์ข ์ข SRP์ ๋ํด ์๋ก ๋ค๋ฅธ ์ดํด๋ฅผ ๊ฐ์ง์ ์์ง๋ง, ์ด๊ฒ์ ๋ธ๋ก์ด ํ ๊ฐ์ง ์ผ์ ๋ด๋นํ๋๋ก ํ๋ ๊ฒ์ ๋๋ค. Rails ์ฑ์ด ํ์ฅ๋จ์ ๋ฐ๋ผ SRP๋ฅผ ๋ฌ์ฑํ๋ ๊ฒ์ด ์ด๋ ค์ธ ์ ์์ง๋ง, ๋ฆฌํฉํ ๋ง ํ ๋ ์ด๋ฅผ ์ผ๋ํด ๋์ธ์.
๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ณ LOC๋ฅผ ๋๋ฆด ๋ ์ฌ๋๋ค์ ์ข ์ข ๋น ๋ฅธ ํด๊ฒฐ์ฑ ์ ์ฐพ๋ ๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. ๊ทธ๋ผ ๋น ๋ฅธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
LOC๋?
LOC๋ Lines of Code์ ์ฝ์๋ก, ์ฝ๋์ ๊ธธ์ด๋ ๋ณต์ก๋๋ฅผ ๋ํ๋ด๋ ์งํ ์ค ํ๋์ ๋๋ค. LOC๊ฐ ๋ง์ผ๋ฉด ์ฝ๋๊ฐ ๋ ๋ณต์กํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
๋ด๊ฐ ์๋ ๋จ์ (Ruby Gem์ด ํ์ํ์ ๊ฐ์?)
Rails๊ฐ ํ์ ๊ฐ ๋๋ ์์ ์๋ ์คํ์์ค ํ์ ์ด ๋ถ์ ์ด๋ฃจ๋ฉด์ ์๋ก์ด Ruby Gem์ด ๊ณณ๊ณณ์์ ๋ฑ์ฅํ์ต๋๋ค.(์์ฆ์ ๋ชจ๋ ์๋ก์ด JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฑ์ฅํ๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ๊ท๋ชจ๋ ํจ์ฌ ์์ง๋ง์.)
๐ ๋ชจ๋ ๊ฐฏ์์ ์ ๋ณด
์ด์จ๋ , ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ์ ์๋ Gem์ ์ฐพ๋ ๊ฒ์ด์์ต๋๋ค.
์ด ๋ฐฉ๋ฒ์ด ์๋ชป๋ ๊ฒ์ ์๋์ง๋ง, Gem์ ์ค์นํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ธฐ ์ ์ ๋ช ๊ฐ์ง ์กฐ์ธ์ ๋๋ฆด๋ ค๊ณ ํฉ๋๋ค.
๋จผ์ ์ค์ค๋ก์๊ฒ ์๋์ ๊ฐ์ ์ง๋ฌธ์ ํด๋ณด์ธ์.
- Gem์ ๊ธฐ๋ฅ ์ค ์ด๋ค ๋ถ๋ถ์ ์ฌ์ฉํ๋ ค๊ณ ํ์๋์?
- ๋ ‘๋จ์’ํ๊ฑฐ๋ ๋ ์ต์ ์ ์ ์ฌํ Gem์ด ์๋์?
- ํ์ํ ๊ธฐ๋ฅ์ ์ฝ๊ณ ํ์คํ๊ฒ ๊ตฌํํ ์ ์๋์?
Gem์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๊ณํ์ด ์๋๋ผ๋ฉด ๊ตฌํํ ๊ฐ์น๊ฐ ์๋์ง๋ ํ๊ฐํด๋ณด์ธ์. ๋๋ Gem์ ๊ตฌํ์ด ๋๋ฌด ๋ณต์กํด์ ๋ ๊ฐ๋จํ๊ฒ ๊ตฌํํ ์ ์๋ค๊ณ ์๊ฐ๋๋ฉด ๊ทธ๊ฑธ๋ก ์ ํํ๋ ๊ฒ๋ ์ข์ต๋๋ค.
์ ๊ฐ ๊ณ ๋ คํ๋ ๋ ๋ค๋ฅธ ์์๋ ํด๋น Gem ์ ์ฅ์๊ฐ ์ผ๋ง๋ ํ์ฑํ๋์ด ์๋์ง, ์ฆ ํ๋์ค์ธ ๋ฉ์ธํ ์ด๋๊ฐ ์๋์ง? ๋ง์ง๋ง์ผ๋ก ๋ฆด๋ฆฌ์ฆ๊ฐ ์ด๋ฃจ์ด์ง ์๊ธฐ๋ ์ธ์ ์ธ์ง? ํ์ธํด๋ณด์ธ์.
๋ํ Gem์ ์ข ์์ฑ๋ ์ฃผ์ํด์ผ ํฉ๋๋ค. ํน์ ๋ฒ์ ์ ์ข ์์ฑ์ ์ข ์๋๋ ๊ฒ์ ์์น ์๋๋ค๋ฉด ํญ์ “Gemfile.spec” ํ์ผ์ ํ์ธํ์๊ธธ ๋ฐ๋๋๋ค. ๋ฃจ๋น Gem์ ๋ฒ์ ์ง์ ๋ฐฉ๋ฒ ๋ฌธ์๋ฅผ ํ์ธํด๋ณด์ธ์.
Gem์ ๋ํด ์ด์ผ๊ธฐ ํ๋ ๋์ ์ ๊ฐ ์ ํ ๊ด๋ จ๋ ๋ถ๋ถ์ด ์๋๋ฐ, ๋ฐ๋ก Rails/Ruby ์ธ๊ณ์ ์ ์ฉ๋๋ ‘Not Invented Here’(NIH) ํ์์ ๋๋ค. ๋ค์ ์ธ์ ์์ ๊ทธ ๋ด์ฉ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ธ์์ ์๋ ๋ฐ๋ช ํ(๊ฒฐ๊ตญ ๋ฃจ๋น ๋ณด์์ด ํ์ํ๊ฒ์ผ๊น์?)
์ง์ฅ ์ํ์ ํ๋ฉด์ ์ ๋ฅผ ํฌํจํ ๋ง์ ์ฌ๋๋ค์ด “์ฌ๊ธฐ์ ๋ฐ๋ช ๋์ง ์์๋ค.” ์ ๋๋กฌ์ ๋น ์ง๋ ๊ฒ์ ๋ช ์ฐจ๋ก ๊ฒฝํํ ์ ์ด ์์ต๋๋ค. ์ด ์ ๋๋กฌ์ “๋ฐํด๋ฅผ ์ฌ๋ฐ๋ช ํ์ง ์๋๋ค”์ ๋น์ทํ ๊ฐ๋ ์ ๋๋ค. ๋๋๋ก ํ๊ณผ ์กฐ์ง์ ์์ ์ด ํต์ ํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(Gem)์ ์ ๋ขฐํ์ง ์์ต๋๋ค. ์ ๋ขฐ์ ๋ถ์กฑ์ ์ด๋ฏธ ๋์ ์๋ Gem์ ์ฌ์ฐฝ์กฐํ๋ ๊ณ๊ธฐ๊ฐ ๋ ์ ์์ต๋๋ค.
๋๋๋ก NIH๋ฅผ ๊ฒฝํํ๋ ๊ฒ์ด ์ข์ ์ผ์ด ๋ ์๋ ์์ต๋๋ค. ํนํ ์์ค์ ๋์ ์๋ ๋ค๋ฅธ ํด๊ฒฐ์ฑ ๋ณด๋ค ๊ฐ์ ํ๋ค๋ฉด ์ฌ๋ด ํด๊ฒฐ์ฑ ์ ๋ง๋๋ ๊ฒ์ด ์ข์ ์ ์์ต๋๋ค. ํด๊ฒฐ์ฑ ์ ์คํ์์คํํ๊ธฐ๋ก ํด๊ฒฐํ๋ค๋ฉด ๋์ฑ ์ข์ ์ ์์ต๋๋ค. (Ruby On Rails, React๋ฅผ ์ดํด๋ณด์ธ์.) ํ์ง๋ง ์ด๋ฅผ ์ํด ๋ฐํด๋ฅผ ์ฌ๋ฐ๋ช ํ๊ณ ์ถ๋ค๋ฉด ๊ทธ๋ ๊ฒ ํ์ง ๋ง์ธ์. ๋ฐํด ์์ฒด๋ ์ด๋ฏธ ๊ฝค ํผ๋ฅญํฉ๋๋ค.
์ด ์ฃผ์ ๋ ์๋นํ ๊น๋ค๋ก์ด ์ฃผ์ ์ด๋ฏ๋ก ์ด๋ฐ ์ํฉ์ ์ฒํ๊ฒ ๋๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ง๋ฌธ์ ์ค์ค๋ก์๊ฒ ํด๋ณด์ธ์.
- ๊ธฐ์กด ํด๊ฒฐ์ฑ ๋ณด๋ค ๋ ๋์ ํด๊ฒฐ์ฑ ์ ๋ง๋ค์ ์๋ค๊ณ ํ์ ํ๋๊ฐ?
- ๋ง์ฝ ๊ธฐ์กด ์คํ์์ค ํด๊ฒฐ์ฑ ์ด ์ฐ๋ฆฌ์๊ฒ ํ์ํ ๊ฒ๊ณผ ๋ค๋ฅด๋ค๋ฉด ์คํ์์ค์ ๊ธฐ์ฌํ์ฌ ๊ฐ์ ํ ์ ์๋๊ฐ?
- ๋ ๋์๊ฐ ์คํ์์ค ํด๊ฒฐ์ฑ ์ ๋ฉ์ธํ ์ด๋๊ฐ ๋์ด ๋ง์ ๊ฐ๋ฐ์๋ค์ ์ถ์ ๊ฐ์ ํ ์ ์์๊น์?
ํ์ง๋ง ๋๋๋ก ์์ ๋ง์ ๋ฐฉ์์ผ๋ก ์ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค์ด์ผ ํ ๋๋ ์์ต๋๋ค. ์กฐ์ง์์ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ผ์ด์ ์ค๋ฅผ ๊ตฌ๋งคํ๋ ๊ฒ์ ์ข์ํ์ง ์์ ์ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ์ถํด์ผ ํ ์๋ ์์ต๋๋ค. ํ์ง๋ง ์ด๋ค ๊ฒฝ์ฐ๋ ๊ธฐ์กด์ ๊ฒ์ ์ฌ์ฐฝ์กฐํ๋ ๊ฒ์ ํผํด์ผ ํฉ๋๋ค.
๊ทผ๋ฌด์ค์ธ ์ธ๋ช ๊ตฌ์กฐ์(๊ณผํ rescue exception)
์ฌ๋๋ค์ ์๋ ๋ชฉํํ๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ์์ธ๋ฅผ rescue๋ฅผ ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
์ด ์ฃผ์ ๋ ์์ ์ฃผ์ ๋ณด๋ค ์ด์์์น๊ณผ ๋ ๊ด๋ จ์ด ์์ต๋๋ค. ์ผ๋ถ ์ฌ๋๋ค์๊ฒ ์์์ ์ธ ๋ด์ฉ์ผ ์ ์์ง๋ง, ์ฝ๋์์ ๊ฐ๋ ๋ณผ์ ์๋ ๋ถ๋ถ์ ๋๋ค.
begin
song.upload_lyrics
rescue
puts 'Lyrics upload failed'
end
์ด ๊ฒฝ์ฐ song ๊ฐ์ฒด๊ฐ nil์ด๋ผ๋ ๋ฌธ์ ๊ฐ ์์์๋ ์์ต๋๋ค. ์ด ์์ธ๊ฐ ์๋ฌ ํธ๋์ปค์ ๋ณด๊ณ ๋๋ฉด ์ ๋ก๋ ํ๋ก์ธ์ค๊ฐ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํ ์ ์์ง๋ง, ์ค์ ๋ก๋ ์์ ํ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์์ ํ๊ฒ ์์ธ๋ฅผ rescue๋ฅผ ํ ๋๋ ๋ฐ์ํ ์ ์๋ ๋ชจ๋ ์์ธ์ ๋ชฉ๋ก์ ํ๋ณดํด์ผ ํฉ๋๋ค. ์ด๋ค ์ด์ ๋ก๋ ๋ชจ๋ ์์ธ๋ฅผ rescue๋ฅผ ํ ์ ์๋ ๊ฒฝ์ฐ์ ๊ณผ๋ํ๊ฒ rescueํ๋๊ฒ ๋ณด๋ค ์ ๊ฒ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์๊ณ ์๋ ์์ธ๋ถํฐ rescueํ๊ณ ๋๋จธ์ง ์์ธ๋ ๋์ค์ ์ฒ๋ฆฌํ์ธ์.
๋๋ฌด ๋ง์๊ฒ์ ๋ฌป์ต๋๋ค.(๋๋ฌด ๋ง์ SQL ์ฟผ๋ฆฌ)
์ด ์ธ์ ์์๋ ๋ ๋ค๋ฅธ ์น ๊ฐ๋ฐ ๋ฌธ์ ์ธ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฌธ์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ํ๋ฒ์ ์์ฒญ์ ๋๋ฌด ๋ง์ SQL ์ฟผ๋ฆฌ๋ก ์น ์๋ฒ๋ฅผ ํญ๊ฒฉํ๋ ๊ฒฝ์ฐ์ ๋๋ค. ์ด๋ป๊ฒ ์ด๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊น์? ํ๋์ ์์ฒญ์ผ๋ก ์ฌ๋ฌ ํ ์ด๋ธ์์ ์ฌ๋ฌ ๋ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ค๋ ค๊ณ ํ ๋ ๋ฐ์ํ ์ ์์ต๋๋ค. ํ์ง๋ง ๊ฐ์ฅ ์์ฃผ ๋ฐ์ํ๋ ๊ฒ์ ์ ๋ช ๋์ N+1 ์ฟผ๋ฆฌ ๋ฌธ์ ์ ๋๋ค.
๋ค์ ๋ชจ๋ธ์ ์์ํด๋ณด์ธ์.
class Song < ApplicationRecord
belongs_to :artist
end
class Artist < ApplicationRecord
has_many :songs
end
ํ ์ฅ๋ฅด์ ๋ ธ๋ ๋ช ๊ณก๊ณผ ํด๋น ์ํฐ์คํธ๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์ถ์ ๊ฒฝ์ฐ:
songs = Song.where(genre: genre).limit(10)
songs.each do |song|
puts "#{song.title} by #{song.artist.name}"
end
์ด ์ฝ๋ ์กฐ๊ฐ์ 10๊ณก์ ๊ฐ์ ธ์ค๊ธฐ ์ํด ํ๋์ SQL ์ฟผ๋ฆฌ๋ฅผ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. ๊ทธ ํ, ๊ฐ ๊ณก์ ์ํฐ์คํธ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์ถ๊ฐ SQL ์ฟผ๋ฆฌ๊ฐ ์ํ๋ฉ๋๋ค. ์ด 11๊ฐ์ ์ฟผ๋ฆฌ๊ฐ ์ํ๋ฉ๋๋ค.
๋ ๋ง์ ๊ณก์ ๋ถ๋ฌ์ฌ ๊ฒฝ์ฐ ๋ชจ๋ ์ํฐ์คํธ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ ๋ง์ ๋ถํ๊ฐ ๊ฑธ๋ฆฌ๋ ์๋๋ฆฌ์ค๋ฅผ ์์ํด ๋ณด์ธ์.
๋์์ผ๋ก Rails์ includes๋ฅผ ์ฌ์ฉํ์ธ์:
songs = Song.includes(:artists).where(genre: genre).limit(10)
songs.each do |song|
puts "#{song.title} by #{song.artist.name}"
end
includes ์ดํ์, ์ด์ ํ์ํ ๋ ธ๋ ์์ ์๊ณผ์์ด ๋๊ฐ์ SQL ์ฟผ๋ฆฌ๋ง ์ํ๋ฉ๋๋ค. ์ ๋ง ๊น๋ํฉ๋๋ค.
๋๋ฌด ๋ง์ SQL ์ฟผ๋ฆฌ๋ฅผ ์ง๋จํ ์ ์๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๊ฐ๋ฐํ๋ ์ค์ ์์ต๋๋ค. ๋์ผํ ํ ์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ ์ฌํ SQL ์ฟผ๋ฆฌ ๊ทธ๋ฃน์ด ๋ณด์ด๋ฉด ๋ญ๊ฐ ์ด์ํ ์ผ์ด ์ผ์ด๋๊ณ ์๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ๊ฒ ๋๋ฌธ์ ๊ฐ๋ฐ ํ๊ฒฝ์ SQL ๋ก๊น ์ ์ฌ์ฉํ๋๋ก ์ค์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ํ Rails๋ ์ฝ๋์์ ์ฟผ๋ฆฌ๊ฐ ํธ์ถ๋ ์์น๋ฅผ ๋ณด์ฌ์ฃผ๋ **verbose query logs**๋ฅผ ์ง์ํฉ๋๋ค.
๋ก๊ทธ๋ฅผ ๋ณด๋ ๊ฒ์ด ๊ท์ฐฎ๊ฑฐ๋ ์ข๋ ์ฌ๊ฐํ ๊ฒ์ ์ํ๋ค๋ฉด AppSignal’s ์ฑ๋ฅ ์ธก์ ๋ฐ N+1 ์ฟผ๋ฆฌ ๊ฐ์ง๋ฅผ ์ฌ์ฉํด๋ณด์ธ์. ์ด๋ฅผ ํตํด ๋ฌธ์ ๊ฐ N+1 ์ฟผ๋ฆฌ์์ ๋น๋กฏ๋์๋์ง์ ๋ํ ํผ๋ฅญํ ์งํ๋ฅผ ์ป์ ์ ์์ต๋๋ค. ์๋๋ ๊ทธ ๋ชจ์ต์ ๋๋ค.
์์ฝ
์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ์๋ฆฌ์ฆ๋ฅผ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. Rails์ ํจํด๊ณผ ์ํฐ ํจํด์ ์๊ฐํ๋ ๊ฒ๋ถํฐ ์์ํ์ฌ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ์ ๋ํ ๋ง์ง๋ง ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์ด๋ฅด์ง๊น์ง Rails MVC ํจํด ๋ด๋ถ์์ ํจํด์ด ๋ฌด์์ธ์ง ์ดํด๋ณด๋ ์ด ํฅ๋ฏธ๋ก์ด ์ฌ์ ์ ํจ๊ป ํด์ฃผ์ ์ ๊ธฐ์ฉ๋๋ค.
๋ง์ ๊ฒ์ ๋ฐฐ์ ๊ฑฐ๋ ์ ์ด๋ ์ด๋ฏธ ์๊ณ ์๋ ๋ด์ฉ์ ์์ ํ๊ณ ํ๋ฆฝํ์ จ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ชจ๋ ๋ด์ฉ์ ์ธ์ฐ๋๋ผ ์คํธ๋ ์ค๋ฅผ ๋ฐ์ง ๋ง์ธ์. ์ด๋ค ์์ญ์์๋ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ์ธ์ ๋ ์ง ์๋ฆฌ์ฆ๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
์ด ์ธ์(ํนํ ์ํํธ์จ์ด ๊ณตํ)์ ์ด์์ ์ด์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ํจํด๊ณผ ์ํฐํจํด์ ๋ชจ๋ ๋ง๋๊ฒ ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ๋ค๊ณ ๊ฑฑ์ ํ ํ์ ์์ต๋๋ค.
ํจํด๊ณผ ์ํฐ ํจํด์ ๋ง์คํฐํ๋ฉด ํผ๋ฅญํ ์ํํธ์จ์ด ์์ง๋์ด๊ฐ ๋ ์ ์์ต๋๋ค. ํ์ง๋ง ํ๋ฒฝํ ํด๊ฒฐ์ฑ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ํจํด๊ณผ ํ์ ๊นจ์ผ ํ ๋๋ฅผ ์๋ ๊ฒ์ด ์ฌ๋ฌ๋ถ์ ๋์ฑ ํผ๋ฅญํ๊ฒ ๋ง๋ค์ด ์ค ๊ฒ์ ๋๋ค.
์ฐธ์ฌํด์ฃผ์๊ณ , ์ฝ์ด์ฃผ์ ์ ๋ค์ ํ๋ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋ค์ํธ์์ ๋ ๋ง๋์!
PS. Ruby Magic ๊ฒ์๋ฌผ์ด ๋ณด๋๋๋ ๋๋ก ์ฝ๊ณ ์ถ์ผ์๋ฉด Ruby Magic ๋ด์ค๋ ํฐ๋ฅผ ๊ตฌ๋ ํ์๊ณ ๋จ ํ๋์ ๊ฒ์๋ฌผ๋ ๋์น์ง ๋ง์ธ์!