Lazy-Loading ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ORM์์ ๋ช ๋ น์ ์คํํ ๋๋ง๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์๋๋ผ ๋ชจ๋ ๋ช ๋ น ์ฒ๋ฆฌ๊ฐ ๋๋๊ณ ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์์ผ ํ ์์ ์ด ์์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ค.
์ด ๋ฌธ์ ์ ํด๊ฒฐ ๋ฐฉ์์ผ๋ก Eager-Loading ๋ฐฉ์์ด ์๋ค. Eager-Loading๋ฐฉ์์ ์ฌ์ ์ ์ธ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์์ฒญํ๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์ผ๋ก ๋์ด๋๋ ์ฟผ๋ฆฌ ์์ฒญ์ ๋ฐฉ์งํ๋ค.
๐ select_related
์ฐธ์กฐํ๋ ๋์์ด ์ค๊ฐํ ์ด๋ธ์ด ์๋ ์, Join ์ฟผ๋ฆฌ๋ฌธ์ ์ด์ฉํด์ data๋ฅผ ํธ์ถํ๋ค.
์ฆ, ๋ ํ
์ด๋ธ๊ฐ join์ ํ ์ ์๋ ๊ตฌ์กฐ์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
join์ ํด์ ํธ์ถํ๊ธฐ ๋๋ฌธ์, ์ฟผ๋ฆฌ๊ฐ 1๋ฒ ์์ฒญ ๋๋ค.
๋ฐ๋ผ์ ์ค๊ฐํ ์ด๋ธ์ ์ด์ฉํด์ ๊ด๊ณ๋ฅผ ํ์ฑํ๋, many-to-many ๋ชจ๋ธ์์๋ ์ฌ์ฉํ ์ ์๊ณ , foreign-key , one-to-one๊ณผ ๊ฐ์ single-valued relationships์์๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
๐ prefetch_related
2๊ฐ์ ํ ์ด๋ธ์ ๊ฐ๊ฐ ํธ์ถํ์ฌ, django๋ด์์ ๋ณํฉํ๋ค.
select_related์ ์ฌ์ฉํ ์ ์๋ many-to-many๋ชจ๋ธ์์ ์ฌ์ฉํฉ๋๋ค.
foreign-key , one-to-one, ๊ทธ๋ฆฌ๊ณ one-to-many ๋ฑ์ ๋ชจ๋ relationships์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
SQL์ WHERE โฆ IN ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๐โโ๏ธ ์ฌ์ฉ ์์
menus = Menu.objects.all()
menu_data = [{
'menu_id' : menu.id,
'menu_name' : menu.name,
'image_url' : menu.image_url,
'categories' : [{
'id' : category.id,
'name' : category.name,
'subcategories' : [{
'id' : subcategory.id,
'name' : subcategory.name,
} for subcategory in category.subcategory_set.all()],
} for category in menu.category_set.all()],
} for menu in menus]
๋ฉ๋ด -> ์นดํ ๊ณ ๋ฆฌ -> ์๋ธ์นดํ ๊ณ ๋ฆฌ ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํธ์ถํ๋ ์ฝ๋์ด๋ค. ๊ฐ๊ฐ์ ํ ์ด๋ธ์ one-to-many ๊ด๊ณ๋ก ์ฐ๊ฒฐ๋์ด ์๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํธ์ถํ๊ธฐ ์ํด์๋ ์ฟผ๋ฆฌ ์์ฒญ ํ์๊ฐ ๋ง์์ง๋ ๊ตฌ์กฐ์ด๋ค.
โ ์ฟผ๋ฆฌ ์์ฒญ ํ์ : 20ํ
menus = Menu.objects.prefetch_related('category_set', 'category_set__subcategory_set')
menu_data = [{
'menu_id' : menu.id,
'menu_name' : menu.name,
'image_url' : menu.image_url,
'categories' : [{
'id' : category.id,
'name' : category.name,
'subcategories' : [{
'id' : subcategory.id,
'name' : subcategory.name,
} for subcategory in category.subcategory_set.all()],
} for category in menu.category_set.all()],
} for menu in menus]
โ ์ฟผ๋ฆฌ ์์ฒญ ํ์ : 3ํ