๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ โ
๊ฒฝ๋ก๊ฐ ํ์ฑํ๋ ๋ ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํ ๋๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ํ๋กํ์ ๋ ๋๋งํ๊ธฐ ์ ์ ์๋ฒ์์ ์ฌ์ฉ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฅผ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋ฌ์ฑํ ์ ์์ต๋๋ค:
์ด๋ ํ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ: ๋จผ์ ์ด๋์ ์ํํ๊ณ , ๋ค์ด์ค๋ ์ปดํฌ๋ํธ์ ๋ผ์ดํ์ฌ์ดํด ํ ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋์ ๋ก๋ฉ ์ํ๋ฅผ ํ์ํฉ๋๋ค.
์ด๋ ์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ: ๊ฒฝ๋ก ์ง์ ๊ฐ๋์์ ์ด๋ ์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ์ค๋น๋ ํ์ ์ด๋์ ์ํํฉ๋๋ค.
๊ธฐ์ ์ ์ผ๋ก ๋ ๋ฐฉ๋ฒ ๋ชจ๋ ์ ํจํ ์ ํ์ด๋ฉฐ, ๊ถ๊ทน์ ์ผ๋ก๋ ์ฌ๋ฌ๋ถ์ด ๋ชฉํ๋ก ํ๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ฌ๋ ค ์์ต๋๋ค.
์ด๋ ํ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ โ
์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ๋๋, ์ฆ์ ์ด๋ํ์ฌ ๋ค์ด์ค๋ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๊ณ , ์ปดํฌ๋ํธ ๋ด์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ๋คํธ์ํฌ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋์ ๋ก๋ฉ ์ํ๋ฅผ ํ์ํ ์ ์๊ณ , ๊ฐ ๋ทฐ๋ง๋ค ๋ก๋ฉ์ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํ ์๋ ์์ต๋๋ค.
route.params.id
๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฒ์๊ธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ Post
์ปดํฌ๋ํธ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ด
์๋ค:
<template>
<div class="post">
<div v-if="loading" class="loading">๋ก๋ฉ ์ค...</div>
<div v-if="error" class="error">{{ error }}</div>
<div v-if="post" class="content">
<h2>{{ post.title }}</h2>
<p>{{ post.body }}</p>
</div>
</div>
</template>
<script setup>
import { ref, watch } from 'vue'
import { useRoute } from 'vue-router'
import { getPost } from './api.js'
const route = useRoute()
const loading = ref(false)
const post = ref(null)
const error = ref(null)
// ๊ฒฝ๋ก์ params๋ฅผ ๊ฐ์ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๊ฐ์ ธ์ต๋๋ค
watch(() => route.params.id, fetchData, { immediate: true })
async function fetchData(id) {
error.value = post.value = null
loading.value = true
try {
// `getPost`๋ฅผ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ์ ํธ/ API ๋ํผ๋ก ๊ต์ฒดํ์ธ์
post.value = await getPost(id)
} catch (err) {
error.value = err.toString()
} finally {
loading.value = false
}
}
</script>
<template>
<div class="post">
<div v-if="loading" class="loading">๋ก๋ฉ ์ค...</div>
<div v-if="error" class="error">{{ error }}</div>
<div v-if="post" class="content">
<h2>{{ post.title }}</h2>
<p>{{ post.body }}</p>
</div>
</div>
</template>
<script>
import { getPost } from './api.js'
export default {
data() {
return {
loading: false,
post: null,
error: null,
}
},
created() {
// ๊ฒฝ๋ก์ params๋ฅผ ๊ฐ์ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๊ฐ์ ธ์ต๋๋ค
this.$watch(
() => this.$route.params.id,
this.fetchData,
// ๋ทฐ๊ฐ ์์ฑ๋ ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ๋ฐ์ดํฐ๊ฐ
// ์ด๋ฏธ ๊ด์ฐฐ๋๊ณ ์์ต๋๋ค
{ immediate: true }
)
},
methods: {
async fetchData(id) {
this.error = this.post = null
this.loading = true
try {
// `getPost`๋ฅผ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ์ ํธ/ API ๋ํผ๋ก ๊ต์ฒดํ์ธ์
this.post = await getPost(id)
} catch (err) {
this.error = err.toString()
} finally {
this.loading = false
}
},
},
}
</script>
์ด๋ ์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ โ
์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ค์ ๋ก ์๋ก์ด ๊ฒฝ๋ก๋ก ์ด๋ํ๊ธฐ ์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ๋ค์ด์ค๋ ์ปดํฌ๋ํธ์ beforeRouteEnter
๊ฐ๋์์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ํํ๊ณ , ๊ฐ์ ธ์ค๊ธฐ๊ฐ ์๋ฃ๋ ํ์๋ง next
๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. next
์ ์ ๋ฌ๋ ์ฝ๋ฐฑ์ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ํ์ ํธ์ถ๋ฉ๋๋ค:
export default {
data() {
return {
post: null,
error: null,
}
},
async beforeRouteEnter(to, from, next) {
try {
const post = await getPost(to.params.id)
// `setPost`๋ ์๋์ ์ ์๋ ๋ฉ์๋์
๋๋ค
next(vm => vm.setPost(post))
} catch (err) {
// `setError`๋ ์๋์ ์ ์๋ ๋ฉ์๋์
๋๋ค
next(vm => vm.setError(err))
}
},
// ๊ฒฝ๋ก๊ฐ ๋ณ๊ฒฝ๋๊ณ ์ด ์ปดํฌ๋ํธ๊ฐ ์ด๋ฏธ ๋ ๋๋ง๋ ๊ฒฝ์ฐ,
// ๋ก์ง์ด ์ฝ๊ฐ ๋ค๋ฆ
๋๋ค.
beforeRouteUpdate(to, from) {
this.post = null
getPost(to.params.id).then(this.setPost).catch(this.setError)
},
methods: {
setPost(post) {
this.post = post
},
setError(err) {
this.error = err.toString()
}
}
}
์ฌ์ฉ์๋ ๋ค์ด์ค๋ ๋ทฐ์ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ ธ์ค๋ ๋์ ์ด์ ๋ทฐ์ ๋จธ๋ฌด๋ฅด๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋์ ์งํ ํ์์ค์ด๋ ์ด๋ค ํํ์ ์ธ๋์ผ์ดํฐ๋ฅผ ํ์ํ๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค. ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ์ ์คํจํ ๊ฒฝ์ฐ, ์ ์ญ ๊ฒฝ๊ณ ๋ฉ์์ง์ ๊ฐ์ ๋ฌด์ธ๊ฐ๋ฅผ ํ์ํ๋ ๊ฒ๋ ํ์ํฉ๋๋ค.