Nuxt.js ๋ฐ์ดํฐ ํ์นญ ๊ฐ์ด๋: useFetch์ useAsyncData ์๋ฒฝ ์ดํด
Nuxt 3์์๋ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR) ํ๊ฒฝ์ ์ต์ ํ๋ ๋ฐ์ดํฐ ํ์นญ ๋ฐฉ์์ด ํ์ํฉ๋๋ค. ๋จ์ํ axios๋ฅผ ์ฐ๋ ๋์ , Nuxt ์ ์ฉ Composable์ ์จ์ผ ํ๋ ์ด์ ์ ์ฐจ์ด์ ์ ์ ๋ฆฌํฉ๋๋ค.
1. ์ ์ ์ฉ API๋ฅผ ์จ์ผ ํ ๊น?
์ ํต์ ์ธ ๋ฐฉ์(Axios ๋ฑ)์ ์ฌ์ฉํ๋ฉด ํด๋ผ์ด์ธํธ์ ์๋ฒ์์ ๋ฐ์ดํฐ ์์ฒญ์ด ์ค๋ณต์ผ๋ก ๋ฐ์ํ ์ ์์ต๋๋ค. Nuxt์ ํ์นญ API๋ **๋ฐ์ดํฐ ํ์ด๋๋ ์ด์ (Hydration)**์ ์ง์ํ์ฌ ์๋ฒ์์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ์ ์์ ํ๊ฒ ์ ๋ฌํ๊ณ ์ค๋ณต ํธ์ถ์ ๋ง์ต๋๋ค.
2. useFetch vs useAsyncData
โ useFetch (๊ฐ์ฅ ๊ถ์ฅ๋จ)
URL๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ง์ ๊ฐ์ ธ์ฌ ๋ ์ฌ์ฉํ๋ ๊ฐ์ฅ ๋จ์ํ ๋ฐฉ๋ฒ์ ๋๋ค.
const { data, pending, error, refresh } = await useFetch('/api/users')โก useAsyncData
๋ณต์กํ ๋ก์ง์ด ํ์ํ๊ฑฐ๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(GraphQL, SDK ๋ฑ)๋ฅผ ํธ์ถํ ๋ ์ฌ์ฉํฉ๋๋ค.
const { data } = await useAsyncData('unique-key', () => $fetch('/api/users'))3. ์ฃผ์ ์ต์ ํ์ฉ๋ฒ
pick: ์๋ต ๋ฐ์ดํฐ ์ค ํ์ํ ํ๋๋ง ๊ณจ๋ผ์ ๊ฐ์ ธ์ต๋๋ค. (์ฑ๋ฅ ์ต์ ํ)watch: ํน์ ๋ฐ์ํ ๋ฐ์ดํฐ๊ฐ ๋ณํ ๋ ์๋์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ถ๋ฌ์ต๋๋ค.server: false: ํน์ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ ์ฌ์ด๋์์๋ง ๋ถ๋ฌ์ค๊ณ ์ถ์ ๋ ์ฌ์ฉํฉ๋๋ค.
4. ์์ฝ
- ๋๋ถ๋ถ์ ์ํฉ์์๋
useFetchํ๋๋ก ์ถฉ๋ถํฉ๋๋ค. - URL ํธ์ถ ์ด์์ ๋ณต์กํ ๋ก์ง์ด ํ์ํ๋ฉด **
useAsyncData**๋ฅผ ๊ณ ๋ คํ์ธ์. - ์ฑ๋ฅ์ ์ํด ํญ์ **
pick**์ ์ฌ์ฉํ์ฌ ๋ถํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋์ด๋ด์ธ์.