0Pricing
Frontend Academy · 강의

ref()와 reactive()

ref()로 반응형 원시 값을 만들고 reactive()로 객체를 감싸며, 각각 언제 사용해야 하는지와 .value로 ref 값에 접근하는 방법을 이해합니다.

ref()와 reactive()은(는) CoddyKit의 무료 Frontend Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Frontend Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Frontend Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

Vue 3의 반응성

Vue 3의 컴포지션 API는 반응형 기본 요소를 사용해 상태를 추적합니다. 핵심 함수는 두 가지입니다. 원시 값에는 ref()를, 객체에는 reactive()를 사용합니다. 이러한 값이 변경되면 화면이 자동으로 업데이트됩니다.

원시 값에 사용하는 ref()

ref(value)는 값을 반응형 컨테이너로 감쌉니다. 스크립트에서는 .value를 통해 값에 접근하고 변경합니다. 템플릿에서는 Vue가 ref의 포장을 자동으로 해제하므로 .value가 필요하지 않습니다.

<script setup>
import { ref } from 'vue';

const count = ref(0);
const name  = ref('Alice');

function increment() {
  count.value++; // .value in script
}
</script>

<template>
  <p>{{ count }}</p>  <!-- no .value in template -->
  <button @click="increment">+</button>
</template>

객체에 사용하는 reactive()

reactive(object)는 객체를 깊은 반응형 프록시로 반환합니다. 속성에 직접 접근하므로 어디에서도 .value가 필요하지 않습니다.

<script setup>
import { reactive } from 'vue';

const form = reactive({
  email: '',
  password: '',
  rememberMe: false
});

// Mutate directly:
form.email = 'user@example.com';
</script>

<template>
  <input v-model="form.email">
</template>

ref와 reactive — 언제 무엇을 사용할까요

다음에는 ref()를 사용합니다: 원시 값(문자열, 숫자, 불리언), null을 허용하는 값, 컴포저블에서 반환하는 값(구조 분해가 더 쉬움). 서로 관련되어 하나의 객체에 함께 속하는 데이터에는 reactive()를 사용합니다.

reactive() 구조 분해의 주의점

반응형 객체를 구조 분해하면 추출된 속성이 반응형 ref가 아니라 일반 값이 되므로 반응성을 잃습니다.

const state = reactive({ count: 0 });
const { count } = state; // NOT reactive
count++; // doesn't update Vue's tracking

// Fix: use toRefs() to destructure reactively:
import { toRefs } from 'vue';
const { count } = toRefs(state); // count is now a ref
count.value++;

toRef와 toRefs

toRef(obj, 'key')는 하나의 속성에 연결된 ref를 만듭니다. toRefs(obj)는 반응형 객체의 모든 속성을 개별적인 연결된 ref로 변환하므로 안전하게 구조 분해할 수 있습니다.

import { toRefs } from 'vue';

const user = reactive({ name: 'Alice', age: 30 });
const { name, age } = toRefs(user);
// name and age are refs, still linked to user
name.value = 'Bob'; // user.name also becomes 'Bob'

DOM 요소에 사용하는 ref()

템플릿에서 일치하는 ref 속성과 함께 ref(null)을 사용하면 DOM 요소나 자식 컴포넌트 인스턴스에 대한 반응형 참조를 얻을 수 있습니다.

<script setup>
import { ref, onMounted } from 'vue';

const inputEl = ref<HTMLInputElement | null>(null);

onMounted(() => {
  inputEl.value?.focus(); // now the DOM element is available
});
</script>

<template>
  <input ref="inputEl" type="text">
</template>

isRef와 unref

isRef(val)는 값이 ref인지 확인합니다. unref(val)는 ref의 포장을 해제하고, ref가 아니면 값을 그대로 반환합니다. ref와 일반 값을 모두 받을 수 있는 컴포저블에서 유용합니다.

import { isRef, unref } from 'vue';

function double(val: Ref<number> | number) {
  return unref(val) * 2; // works with both ref and plain number
}

shallowRef와 shallowReactive

shallowRef()는 최상위 수준에서만 반응형이고 내부까지 반응형으로 만들지는 않습니다. shallowReactive()도 객체에 대해 동일하게 동작합니다. 깊은 반응성이 필요하지 않은 경우(예: 큰 불변 데이터 구조) 성능 최적화를 위해 사용합니다.

reactive() 변경과 객체 교체

reactive()를 사용할 때는 속성을 직접 변경합니다. 전체 객체를 교체할 수는 없습니다. reactive()에는 동일한 참조가 필요하기 때문입니다. 객체를 교체하려면 ref()를 사용하세요. ref()에서는 ref.value = newObject를 사용할 수 있습니다.

const state = reactive({ items: [] });
state.items.push(newItem); // OK
state.items = [newItem];   // also OK (mutating the property)
// state = reactive({ items: [newItem] }); // LOSES REACTIVITY — can't reassign

깊은 반응성

reactive()는 기본적으로 깊은 반응성을 제공합니다. Vue가 중첩된 객체와 배열의 변경을 추적합니다. 편리하지만 매우 큰 객체에서는 비용이 클 수 있습니다. 성능이 중요한 경우에는 shallowReactive를 고려하세요.

빠른 확인

reactive() 객체를 구조 분해하면 왜 반응성을 잃나요?

복습: ref()와 reactive()

ref()는 원시 값을 감쌉니다. 스크립트에서는 .value로 접근하고 템플릿에서는 자동으로 포장이 해제됩니다. reactive()는 객체를 깊은 반응형으로 만들며 속성을 직접 변경합니다. 구조 분해하면 반응성을 잃으므로 toRefs()를 사용합니다. 템플릿 요소 참조에는 ref(null)을 사용합니다. 성능을 위해 shallowRef와 shallowReactive를 사용합니다. 컴포저블 유틸리티에는 isRef와 unref를 사용합니다.

자주 묻는 질문

“ref()와 reactive()” 강의는 무료인가요?

네 — “ref()와 reactive()” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Frontend Academy 강의 전체를 잠금 해제할 수 있습니다. Frontend Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“ref()와 reactive()”에서 뭘 배우나요?

ref()로 반응형 원시 값을 만들고 reactive()로 객체를 감싸며, 각각 언제 사용해야 하는지와 .value로 ref 값에 접근하는 방법을 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 Frontend Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Frontend Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Frontend Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“ref()와 reactive()” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Frontend Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Frontend Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. ref()와 reactive()
  2. computed()와 watch()
  3. setup() 함수와 script setup
  4. 컴포저블: 재사용 가능한 Composition 함수
← Frontend Academy(으)로 돌아가기