안녕하세요, 코딩하는곰입니다! 🐾
Vue.js 3의 Composition API를 사용하면서 가장 먼저 마주치는 개념이 바로 ref와 reactive입니다. 두 함수 모두 반응형 데이터를 생성하는 역할을 하지만, 그 차이점을 명확히 이해하지 못하면 예상치 못한 버그를 만날 수 있습니다. 오늘은 20년의 Vue 개발 경험을 바탕으로 ref와 reactive의 핵심적인 차이점을 깊이 있게 파헤쳐보고, 어떤 상황에서 어떤 것을 사용해야 하는지 실전적인 가이드를 제공해드리겠습니다.
ref는 단일 값을 반응형으로 만들어주는 함수입니다. 기본형(primitive) 데이터 타입인 string, number, boolean 등을 다룰 때 주로 사용됩니다.
import { ref } from 'vue'// 단일 값 반응형 변수 생성const count = ref(0)const message = ref('Hello Vue!')const isLoading = ref(false)// ref 값에 접근할 때는 .value를 사용console.log(count.value) // 0count.value++ // 값 변경
ref의 가장 큰 특징은 .value 속성을 통해 실제 값에 접근해야 한다는 점입니다. 이는 JavaScript의 제한사항으로, 기본형 값들은 직접 반응형으로 만들 수 없기 때문입니다.
reactive는 객체나 배열 같은 참조형 데이터를 반응형으로 만들어줍니다.
import { reactive } from 'vue'// 객체 반응형 변수 생성const user = reactive({name: '코딩하는곰',age: 20,email: 'bear@coding.com'})// 배열 반응형 변수 생성const todos = reactive([{ id: 1, text: 'Vue 학습', done: true },{ id: 2, text: '블로그 작성', done: false }])// reactive 객체는 직접 접근 가능console.log(user.name) // '코딩하는곰'user.age = 21 // 직접 변경 가능
reactive는 Proxy 객체를 반환하기 때문에 .value 없이 직접 속성에 접근할 수 있습니다.
🎮 게임 개발에 관심이 있다면, event.preventDefault()가 안 먹을 때? 20년 경력 개발자가 알려주는 해결법를 참고해보세요.
ref는 모든 타입의 데이터를 처리할 수 있습니다:
// ref - 모든 타입 가능const num = ref(123) // ✅const obj = ref({ name: 'vue' }) // ✅const arr = ref([1, 2, 3]) // ✅// reactive - 객체 타입만 가능const user = reactive({ name: 'vue' }) // ✅const list = reactive([1, 2, 3]) // ✅const count = reactive(123) // ❌ TypeError
이것이 가장 중요한 차이점입니다! ref는 전체 재할당이 가능합니다:
const state = ref({ count: 0 })// 전체 재할당 가능 - 반응성 유지state.value = { count: 1 } // ✅
reactive는 전체 재할당 시 반응성을 잃습니다:
const state = reactive({ count: 0 })// 전체 재할당 - 반응성 상실!state = { count: 1 } // ❌ 반응성 손실
ref는 template에서 자동으로 언래핑됩니다:
<template><div><!-- .value 없이 사용 가능 --><p>{{ count }}</p><button @click="count++">증가</button></div></template><script setup>import { ref } from 'vue'const count = ref(0)</script>
reactive는 항상 직접 접근:
<template><div><!-- 직접 속성 접근 --><p>{{ user.name }}</p><p>{{ todos[0].text }}</p></div></template>
ref는 항상 동일한 ref 객체를 유지합니다:
const state = ref({ count: 0 })console.log(state.value) // { count: 0 }// 내부 객체 변경 - 반응성 유지state.value.count = 1 // ✅// 객체 재할당 - 반응성 유지state.value = { count: 2 } // ✅
reactive는 Proxy 연결이 끊어질 수 있습니다:
const state = reactive({ count: 0 })// 속성 변경 - 반응성 유지state.count = 1 // ✅// 변수 재할당 - 반응성 손실let newState = { count: 2 }state = newState // ❌
홍보용 전단이나 SNS 콘텐츠에 맞춤형 QR 코드를 넣고 싶을 때는 컬러 커스터마이징이 가능한 QR 생성기를 사용해보세요.
// ✅ 좋은 예시const isLoading = ref(false)const userName = ref('')const itemCount = ref(0)// ❌ reactive로는 불가능const isLoading = reactive(false) // TypeError
<template><input ref="inputRef" /></template><script setup>import { ref } from 'vue'const inputRef = ref(null)const focusInput = () => {inputRef.value?.focus()}</script>
// 자식 컴포넌트const props = defineProps({userData: Object})// ref로 래핑하여 반응성 보장const localUser = ref(props.userData)
// ✅ 좋은 예시 - 관련 데이터 묶음const formState = reactive({username: '',email: '',password: '',agreeTerms: false})// form 전체를 하나의 반응형 객체로 관리const submitForm = () => {console.log(formState)}
const shoppingCart = reactive({items: [],totalPrice: 0,discount: 0,addItem(item) {this.items.push(item)this.calculateTotal()},calculateTotal() {this.totalPrice = this.items.reduce((sum, item) => sum + item.price, 0)}})
실제 프로젝트에서는 두 가지를 혼합해서 사용하는 것이 일반적입니다:
import { ref, reactive } from 'vue'// 기본형 데이터 - refconst loading = ref(false)const error = ref('')// 객체 데이터 - reactiveconst pagination = reactive({page: 1,limit: 10,total: 0})const filters = reactive({category: '',priceRange: [0, 100],inStock: false})// 컴포지션 함수에서의 사용export function useProductList() {const state = reactive({products: [],selectedProduct: null})const isLoading = ref(false)return {state,isLoading}}
🖼️ 이번 주 주목할 만한 공연·전시 소식은, 김천황금시장 김장양념축제를 참고해보세요.
Vue.js의 ref와 reactive는 Composition API의 핵심이지만, 그 차이를 명확히 이해하는 것이 중요합니다. 간단히 정리하자면:
.value 필요ref를, 연관된 데이터의 그룹에는 reactive를 사용하는 것이 일반적인 베스트 프랙티스입니다.
이 글이 Vue.js 개발자 여러분의 반응형 데이터 관리에 도움이 되셨나요? 추가로 궁금한 점이 있으시다면 댓글로 남겨주세요! 다음 시간에는 더 흥미로운 Vue.js 주제로 찾아뵙겠습니다. 코딩하는곰이었습니다! 🐾
Happy Vue Coding! 🚀최신 당첨번호와 AI 추천 번호를 모두 확인하고 싶다면, QR코드 번호 확인 기능이 있는 지니로또AI 앱이 완벽한 선택입니다.
