# Nuxt 3์ ๋ฐ์ดํฐ ํธ์ถ ๋ฐฉ๋ฒ
๊ธฐ์กด Nuxt์์๋ asyncData ์์ฑ๊ณผ fetch ์์ฑ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํธ์ถํ์ต๋๋ค. Nuxt 3์์๋ ์ปดํฌ์ง์
๋ฌธ๋ฒ ํํ์ธ useAsyncData()
์ useFetch()
๋ฅผ ์ฌ์ฉํฉ๋๋ค.
# useAsyncData
useAsyncData๋ ๊ธฐ์กด asyncData ์์ฑ๊ณผ ๋์ผํ๊ฒ ํ์ด์ง๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ ํธ์ถ ๋ฉ์๋์ ๋๋ค. ๊ธฐ์กด asyncData์์ ์ฐจ์ด์ ์ ์ปดํฌ์ง์ ๋ฌธ๋ฒ์ผ๋ก ๋ฐ๋ ์ ๊ณผ ofetch๋ผ๋ HTTP ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ์ ๊ณต๋๋ ์ ์ ๋๋ค.
# useAsyncData ๊ธฐ๋ณธ ๋ฌธ๋ฒ
๊ธฐ๋ณธ ๋ฌธ๋ฒ์ ๋ณด๊ฒ ์ต๋๋ค.
<!-- pages/user.vue -->
<script setup>
const { data, error } = await useAsyncData('user', () => $fetch('users/1'))
</script>
๊ณต์ ๋ฌธ์์์ ์๋ด๋ ๋ฐฉ์์ผ๋ก ์์ฑ๋ Nuxt 3 ํ๋ก์ ํธ์์๋ useAsyncData()
์ ๊ฐ์ API๋ฅผ ๋ณ๋๋ก ์ํฌํธ ํ ํ์๊ฐ ์์ต๋๋ค. ์์ ๊ฐ์ด ๋ทฐ ์ปดํฌ๋ํธ์ script
ํ๊ทธ์ setup
์ ์ถ๊ฐํ๊ณ ๋ฐ๋ก useAsyncData()
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
useAsyncData()
์ ์ฒซ ๋ฒ์งธ ์ธ์ user
๋ ๋ฐ๋ก API ์๋ต์ ์บ์ฑํ๊ธฐ ์ํ ์๋ณ์์
๋๋ค. ๋ ๋ฒ์งธ ์ธ์์์ $fetch
๋ Nuxt ํ์์ ์์ฒด ๊ฐ๋ฐํ HTTP ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ ofetch ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค. ๋ง์ฝ axios์ ๊ฐ์ ๋ณ๋์ HTTP ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ ofetch๋ฅผ ์ฌ์ฉํด๋ ๋ฉ๋๋ค.
TIP
$fetch
๋ Nuxt ํ๋ก์ ํธ ์์ ์๋ ๋ทฐ ์ปดํฌ๋ํธ์์ ์ ์ญ ๋ ๋ฒจ๋ก ์ ๊ทผํ ์ ์๊ฒ ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ๋ณ๋๋ก ์ํฌํธํ๊ฑฐ๋ ์ ์ธํ์ง ์์๋ ์ ๊ทผํ ์ ์์ต๋๋ค.
TIP
<script setup>
์ ๋ทฐ ์ปดํฌ๋ํธ์์ ์ปดํฌ์ง์
API ๋ฌธ๋ฒ์ ์ฝ๊ฒ ์์ฑํ ์ ์๋ ๋ฌธ๋ฒ์
๋๋ค. ์์ธํ ๋ด์ฉ์ script setup ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด ๋ณด์ธ์.
# useAsyncData ์ปค์คํ ๋ฌธ๋ฒ - ์ธ๋ถ HTTP ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฐ๋
๋ง์ฝ axios์ ๊ฐ์ ๋์ค์ ์ธ HTTP ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ๊ฒฐํ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
<!-- pages/user.vue -->
<script setup>
import {fetchUsers} from '../api/index.js'
const { data, error } = await useAsyncData(() => fetchUsers().then(response => response.data))
</script>
useAsyncData() API ์ฒซ ๋ฒ์งธ ์ธ์์ ์ต๋ช ํจ์๋ฅผ ํ๋ ์ ์ธํ๊ณ ๋ฐํ ๊ฐ์ผ๋ก axios๋ก ์์ฑํด ๋ API ํจ์๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค. ์ด๋ ๊ฒ ์ธ๋ถ HTTP ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ๊ฒฐํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฐธ๊ณ ๋ก, ์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋ณ๋์ ํค ๊ฐ์ ์ ์ํ์ง ์์๋๋ฐ์. ํค ๊ฐ์ ์ ์ํ์ง ์๋๋ผ๋ ์ฝ๋๊ฐ ์ ์ธ๋ ํ์ผ๊ณผ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋ ์์ฑ๋ฉ๋๋ค. ๊ทธ๋๋ ์ฝ๋๊ฐ ๋ ๋ณต์กํด ์ง ๊ฒฝ์ฐ๋ฅผ ๋๋นํด ๋ค์๊ณผ ๊ฐ์ด ํค๋ฅผ ์ง์ ํด ์ฃผ๋๊ฒ ์ข์ต๋๋ค.
<!-- pages/user.vue -->
<script setup>
import {fetchUsers} from '../api/index.js'
const { data, error } = await useAsyncData('user', () => fetchUsers().then(response => response.data))
</script>
# useFetch
useFetch๋ useAsyncData์ $fetch๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ ๋ํ ์ฝ๋์ ๋๋ค. ๋ํ ์ฝ๋๋ ์ด๋ฏธ ์๋ ์ฝ๋๋ฅผ ํ๋ฒ ๋ ๊ฐ์ผ ์ฝ๋๋ฅผ ์๋ฏธํ๋๋ฐ์. ์๋ ์ฝ๋๋ก ์ดํดํด ๋ณด๊ฒ ์ต๋๋ค.
<script setup>
// 1. useFetch๋ฅผ ์ฌ์ฉํ ์ฝ๋
const { data } = await useFetch('users/1');
// 2. useAsyncData๋ฅผ ์ฌ์ฉํ ์ฝ๋
const { data } = await useAsyncData(() => $fetch('users/1'))
</script>
์ 2๊ฐ ์ฝ๋๋ ๊ฐ์ ๋์์ ํ๋ ์ฝ๋์
๋๋ค. ๋จ์ํ useAsyncData
์ $fetch
๋ฅผ ๋งค๋ฒ ์ ์ธํ์ง ์๊ณ ๋ ํธํ๊ฒ ์ธ ์ ์๊ฒ๋ useFetch
๋ผ๋ API๋ก ์ฝ๋๋ฅผ ๊ฐ์ผ๊ฑฐ์ฃ . ์ด๋ฐ์์ผ๋ก ๋ณดํต ์ฝ๋๊ฐ ๋์ ๋ถํด์ง๋ ๊ฑธ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ณ๋์ ํจ์๋ก ๊ฐ์ธ์ ์ถ์ํ ํ๋ ๊ฒฝ์ฐ๋ค์ด ์์ต๋๋ค.
# useFetch ์ฅ๋จ์
useFetch๋ฅผ ์ฌ์ฉํ์ ๋ ํธ๋ฆฌํ ์ ์ ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์๋ค๋ ์ ์ ๋๋ค. useAsyncData๋ฅผ ์ ์ธํ ๋ ์ง์ ํด ์ฃผ์ด์ผ ํ๋ ์ ๋ํฌํ ์๋ณ์(ํค ๊ฐ)๋ ์๋ตํ ์ ์์ต๋๋ค. ํ์ง๋ง, axios์ ๊ฐ์ ์ธ๋ถ HTTP ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฐ๋์ ํ๊ธฐ ์ด๋ ต์ต๋๋ค. ์ด๋ฐ ์ฐจ์ด์ ์ ์ดํดํ ์ํ์์ ์ ์ ํ API๋ฅผ ๊ณ ๋ฅด๋ ๊ฑธ ์ถ์ฒ๋๋ฆฝ๋๋ค.
# useAsyncData์ useFetch์ ๋ฐํ ๊ฐ
๋ API ๋ชจ๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฐํ ๊ฐ์ ๋ฑ์ด์ค๋๋ค.
const { data, pending, refresh, error } = await useFetch();
const { data, pending, refresh, error } = await useAsyncData();
useFetch๋ ๋ด๋ถ์ ์ผ๋ก๋ useAsyncData๋ฅผ ์ฐ๊ธฐ ๋๋ฌธ์ ๋ API์ ๋ฐํ ๊ฐ์ ๊ฐ์ต๋๋ค. ๋ฐํ ๊ฐ ์์ฑ์ ์ด๋ฆ์์ ์ถฉ๋ถํ ์ญํ ์ด ์ ์ถ๋์ง๋ง ๊ฐ๋จํ ์์๋ณด๊ฒ ์ต๋๋ค.
data
: API ์๋ต์ ๊ฒฐ๊ณผpending
: ๋ฐ์ดํฐ๊ฐ ๋ก๋ฉ ์ค์ธ์ง์ ์ํrefresh
: ๋ฐ์ดํฐ ํธ์ถ API๋ฅผ ๋ค์ ์คํํ ์ ์๋ ์์ฑ ํจ์.refresh()
๋ฅผ ์คํํ๋ฉด ๋ฐ์ดํฐ๊ฐ ๋ค์ ๋ถ๋ฌ์์ง๋ค.execute
์ ๊ฐ์ ์ญํerror
: ๋ฐ์ดํฐ ํธ์ถ์ด ์คํจํ์ ๋ ๋ฐํ๋๋ ์๋ฌ ๊ฐ์ฒด
์ด์ธ์ status์ execute ์์ฑ๋ ๋ ์๋๋ฐ์. ์ 4๊ฐ ์์ฑ์ด๋ฉด ๊ฐ๋ฐํ๋๋ฐ ๋ฌธ์ ๊ฐ ์์ ๊ฒ๋๋ค. ํน์ ๊ถ๊ธํ์ ๋ถ๋ค์ ๋ค์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ธ์ ๐
โ Introduction ๐ CLI PWA Plugin โ