Home

(Vue.js 심화) ref와 reactive의 결정적 차이와 실전 활용 가이드

Published in vue_js_angual
November 26, 2025
2 min read
(Vue.js 심화) ref와 reactive의 결정적 차이와 실전 활용 가이드

안녕하세요, 코딩하는곰입니다! 🐾 Vue.js 3의 Composition API를 사용하면서 가장 먼저 마주치는 개념이 바로 refreactive입니다. 두 함수 모두 반응형 데이터를 생성하는 역할을 하지만, 그 차이점을 명확히 이해하지 못하면 예상치 못한 버그를 만날 수 있습니다. 오늘은 20년의 Vue 개발 경험을 바탕으로 refreactive의 핵심적인 차이점을 깊이 있게 파헤쳐보고, 어떤 상황에서 어떤 것을 사용해야 하는지 실전적인 가이드를 제공해드리겠습니다.

🔍 ref와 reactive의 기본 개념 이해

ref: 단일 값을 위한 반응형 래퍼

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) // 0
count.value++ // 값 변경

ref의 가장 큰 특징은 .value 속성을 통해 실제 값에 접근해야 한다는 점입니다. 이는 JavaScript의 제한사항으로, 기본형 값들은 직접 반응형으로 만들 수 없기 때문입니다.

reactive: 객체를 위한 반응형 프록시

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 없이 직접 속성에 접근할 수 있습니다.

(Vue.js 심화) ref와 reactive의 결정적 차이와 실전 활용 가이드
(Vue.js 심화) ref와 reactive의 결정적 차이와 실전 활용 가이드


🎮 게임 개발에 관심이 있다면, event.preventDefault()가 안 먹을 때? 20년 경력 개발자가 알려주는 해결법를 참고해보세요.

⚡ ref와 reactive의 심층적인 차이점 분석

1. 데이터 타입 제한

ref는 모든 타입의 데이터를 처리할 수 있습니다:

  • 기본형: string, number, boolean, null, undefined, symbol
  • 참조형: object, array, function, class instance reactive는 객체 타입만 처리 가능합니다:
  • Object, Array, Map, Set 등
// 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

2. 할당(Reassignment) 동작 차이

이것이 가장 중요한 차이점입니다! ref는 전체 재할당이 가능합니다:

const state = ref({ count: 0 })
// 전체 재할당 가능 - 반응성 유지
state.value = { count: 1 } // ✅

reactive는 전체 재할당 시 반응성을 잃습니다:

const state = reactive({ count: 0 })
// 전체 재할당 - 반응성 상실!
state = { count: 1 } // ❌ 반응성 손실

3. Template에서의 사용 차이

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>

4. 반응성 유지 보장

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 // ❌

(Vue.js 심화) ref와 reactive의 결정적 차이와 실전 활용 가이드
(Vue.js 심화) ref와 reactive의 결정적 차이와 실전 활용 가이드


홍보용 전단이나 SNS 콘텐츠에 맞춤형 QR 코드를 넣고 싶을 때는 컬러 커스터마이징이 가능한 QR 생성기를 사용해보세요.

🎯 실전 활용 가이드: 언제 무엇을 사용해야 할까?

ref를 사용해야 하는 경우

  1. 기본형 데이터를 다룰 때
// ✅ 좋은 예시
const isLoading = ref(false)
const userName = ref('')
const itemCount = ref(0)
// ❌ reactive로는 불가능
const isLoading = reactive(false) // TypeError
  1. 템플릿 refs로 DOM 요소에 접근할 때
<template>
<input ref="inputRef" />
</template>
<script setup>
import { ref } from 'vue'
const inputRef = ref(null)
const focusInput = () => {
inputRef.value?.focus()
}
</script>
  1. 컴포넌트 간 데이터 전달 시
// 자식 컴포넌트
const props = defineProps({
userData: Object
})
// ref로 래핑하여 반응성 보장
const localUser = ref(props.userData)

reactive를 사용해야 하는 경우

  1. 연관된 데이터를 그룹화할 때
// ✅ 좋은 예시 - 관련 데이터 묶음
const formState = reactive({
username: '',
email: '',
password: '',
agreeTerms: false
})
// form 전체를 하나의 반응형 객체로 관리
const submitForm = () => {
console.log(formState)
}
  1. 복잡한 객체 상태 관리 시
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'
// 기본형 데이터 - ref
const loading = ref(false)
const error = ref('')
// 객체 데이터 - reactive
const 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
}
}

성능 고려사항

  • ref: 추가적인 래퍼 레이어가 있지만, 현대 JavaScript 엔진에서는 거의 차이 없음
  • reactive: Proxy를 사용하므로 큰 객체에서는 약간의 오버헤드 발생 가능
  • 결론: 성능 차이는 미미하므로, 코드의 가독성과 유지보수성을 우선시하세요!

(Vue.js 심화) ref와 reactive의 결정적 차이와 실전 활용 가이드
(Vue.js 심화) ref와 reactive의 결정적 차이와 실전 활용 가이드


🖼️ 이번 주 주목할 만한 공연·전시 소식은, 김천황금시장 김장양념축제를 참고해보세요.

Vue.js의 refreactive는 Composition API의 핵심이지만, 그 차이를 명확히 이해하는 것이 중요합니다. 간단히 정리하자면:

  • ref: 단일 값, 전체 재할당 가능, .value 필요
  • reactive: 객체 전용, 전체 재할당 불가, 직접 접근 가능 실제 개발에서는 데이터의 특성과 사용 패턴에 따라 적절히 선택하는 것이 가장 중요합니다. 기본형 데이터와 DOM 참조에는 ref를, 연관된 데이터의 그룹에는 reactive를 사용하는 것이 일반적인 베스트 프랙티스입니다. 이 글이 Vue.js 개발자 여러분의 반응형 데이터 관리에 도움이 되셨나요? 추가로 궁금한 점이 있으시다면 댓글로 남겨주세요! 다음 시간에는 더 흥미로운 Vue.js 주제로 찾아뵙겠습니다. 코딩하는곰이었습니다! 🐾 Happy Vue Coding! 🚀

최신 당첨번호와 AI 추천 번호를 모두 확인하고 싶다면, QR코드 번호 확인 기능이 있는 지니로또AI 앱이 완벽한 선택입니다.









최상의 건강을 위한 영양가득한 식품과 정보! life-plus.co.kr 바로가기
최상의 건강을 위한 영양가득한 식품과 정보! life-plus.co.kr 바로가기



다채로운 문화축제와 공연 소식을 공유하는 블로그! culturestage.co.kr 바로가기
다채로운 문화축제와 공연 소식을 공유하는 블로그! culturestage.co.kr 바로가기



비트코인 세계로의 첫걸음! 지금 가입하고 거래 수수료 할인 혜택 받으세요! bitget.com 바로가기
비트코인 세계로의 첫걸음! 지금 가입하고 거래 수수료 할인 혜택 받으세요! bitget.com 바로가기




Tags

#developer#coding#vue_js_angual

Share

Previous Article
React 다크모드 구현 시 CSS 클래스 변경이 안 먹힐 때 해결법 총정리

Table Of Contents

1
🔍 ref와 reactive의 기본 개념 이해
2
⚡ ref와 reactive의 심층적인 차이점 분석
3
🎯 실전 활용 가이드: 언제 무엇을 사용해야 할까?

Related Posts

Vue.js와 Angular 속성 바인딩 완벽 가이드 (src), (disabled) 활용법부터 심화 패턴까지
December 25, 2025
3 min