[Vue.js] Composition API

KangHo Lee's avatar
Jun 05, 2025
[Vue.js] Composition API

โœ… Composition API๋ž€?

setup() ํ•จ์ˆ˜ ์•ˆ์—์„œ ref, reactive, computed, watch ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ ๋กœ์ง์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹

App.vue
<script setup> import { ref , onMounted, watch} from 'vue'; import ChildComp from './components/ChildComp.vue'; let count = ref(0); // ์ƒํƒœ๋ณ€์ˆ˜ ์ดˆ๊ธฐ๊ฐ’(state), import ref ํ•„์š” let title = "Hello Vue"; let color = ref('green'); onMounted(() => { console.log('mounted'); // import onMounted ํ•„์š” }) const increaseCount = () => { count.value++; // let count์˜ count๋Š” ref์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— .valueํ•„์š” } watch(color, () => { // import watch ํ•„์š” console.log('color ๋ณ€๊ฒฝ'); }) </script> <template> <div> <h1>{{title}}</h1> <button @click="increaseCount">count++</button> <p>{{ count }}</p> <ChildComp :color="color" bgColor="yellow" /> <button @click="color='red'">change color</button> </div> </template> <style scoped> </style>
  • ref๋กœ ์ƒํƒœ๋ณ€์ˆ˜ ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •
    • ๊ฐ’์€ .value๋กœ ๊บผ๋‚ด์•ผ ํ•œ๋‹ค.
  • ๋ผ์ดํ”„์‚ฌ์ดํด ํ›…์„ ํ™œ์šฉํ•˜๋ ค๋ฉด import onMounted, watch ํ•„์š”
  • ํ•จ์ˆ˜ ์ •์˜๋„ script์—์„œ ๋ฐ”๋กœ ํ•˜๋ฉด ๋œ๋‹ค.
ChildComp.vue
<template> <div> <h2>Child Component</h2> <p :style="{ color: color, backgroundColor: bgColor }" >{{ color }}</p> </div> </template> <script setup> // export default ํ•„์š” ์—†์ด ๋ณ€์ˆ˜๋กœ props ๋“ฑ๋ก const props = defineProps ({ color: String, // ์ž๋ฃŒํ˜• ์ ๋Š” ๊ฒƒ์€ ๋™์ผ์ผ bgColor: String, }) console.log(props.color); </script> <style> </style>
  • script์—์„œ export default ํ•„์š” ์—†์ด ๋ฐ”๋กœ props ๋“ฑ๋ก ๊ฐ€๋Šฅ

๐Ÿ†š Options API vs Composition API

ํ•ญ๋ชฉ
Options API
Composition API
Vue 2 ๋ฐฉ์‹
data(), methods, computed ๋“ฑ ์˜ต์…˜์œผ๋กœ ๊ตฌ์„ฑ
setup() ๋‚ด๋ถ€์—์„œ ๋กœ์ง ์ž‘์„ฑ
๊ตฌ์กฐ
๊ธฐ๋Šฅ์ด ์„ž์—ฌ ์žˆ์Œ
๊ธฐ๋Šฅ๋ณ„๋กœ ๋ชจ์•„์„œ ์ž‘์„ฑ
์ฝ”๋“œ ์žฌ์‚ฌ์šฉ
๋ฏน์Šค์ธ, HOC ๋“ฑ (ํ•œ๊ณ„ ์žˆ์Œ)
๋กœ์ง์„ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌ (useXXX())
๊ถŒ์žฅ ์‹œ์ 
๊ฐ„๋‹จํ•œ ์ปดํฌ๋„ŒํŠธ
๋ณต์žกํ•œ ์ปดํฌ๋„ŒํŠธ, ์žฌ์‚ฌ์šฉ ๋งŽ์€ ๊ฒฝ์šฐ

๐Ÿ“ฆ ์ฃผ์š” API ์ •๋ฆฌ

API
์„ค๋ช…
์˜ˆ์‹œ
ref()
์›์‹œ๊ฐ’ ๋ฐ˜์‘ํ˜• ์ƒํƒœ
const msg = ref("hi")
reactive()
๊ฐ์ฒด ์ „์ฒด๋ฅผ ๋ฐ˜์‘ํ˜•์œผ๋กœ
const user = reactive({ name: "Lee" })
computed()
๊ณ„์‚ฐ๋œ ์†์„ฑ
const double = computed(() => count.value * 2)
watch()
๊ฐ’ ๋ณ€ํ™” ๊ฐ์ง€
watch(count, (newVal) => console.log(newVal))
onMounted()
์ƒ๋ช…์ฃผ๊ธฐ ํ›…
onMounted(() => { ... })

โœ… ์žฅ์ 

  • ์ฝ”๋“œ ์‘์ง‘๋ ฅ ํ–ฅ์ƒ: ๊ด€๋ จ๋œ ๋กœ์ง์„ ํ•œ ๊ณณ์— ๋ชจ์„ ์ˆ˜ ์žˆ์Œ
  • ์žฌ์‚ฌ์šฉ ์‰ฌ์›€: useXXX ํ•จ์ˆ˜๋กœ ์ถ”์ถœ ๊ฐ€๋Šฅ
  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์™€ ์ž˜ ๋งž์Œ: ๋ช…์‹œ์ ์ด๊ณ  ํ•จ์ˆ˜ ์ค‘์‹ฌ ๊ตฌ์กฐ

๐Ÿ“Œ ์–ธ์ œ ์“ฐ๋ฉด ์ข‹์„๊นŒ?

  • ๋กœ์ง์ด ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ๊ธฐ๋Šฅ๋ณ„ ๋ถ„๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
  • ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ฐ™์€ ๋กœ์ง์„ ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
  • ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ ๊ทน ํ™œ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ

Share article

devleekangho