Javascript/NuxtJS

[Nuxt3] ref()와 computed() 차이점

kyoulho 2025. 3. 12. 21:26
728x90

요약

사용 상황  ref() computed()
기본적인 반응형 상태 관리 ✔️
상태를 기반으로 새 값 계산 ✔️
값이 변경될 때만 재계산 필요 ✔️
상태 변경 가능해야 함 ✔️ ❌ (기본 읽기 전용)

 


1. ref() – 반응형 데이터 만들기

ref()는 간단한 값(숫자, 문자열, 객체 등)을 반응형으로 관리할 때 사용합니다.

import { ref } from "vue";

const count = ref(5);
console.log(count.value); // 5

count.value++; // 값 변경
console.log(count.value); // 6

ref()의 특징

  • .value를 통해서만 값을 읽거나 쓸 수 있습니다.
  • Vue가 값 변경을 자동으로 추적하여 UI를 업데이트합니다.

객체를 ref()로 사용할 경우

const user = ref({ name: "Alice", age: 25 });

// 객체 내부 값도 반응형으로 유지
user.value.name = "Bob";
console.log(user.value.name); // Bob

객체의 경우에도 .value를 통해 접근해야 하지만, 내부 속성은 모두 반응형으로 동작합니다.


2. computed() – 계산된 값 자동 업데이트

computed()는 기존 반응형 상태를 기반으로 자동으로 새로운 값을 계산할 때 사용합니다.

import { ref, computed } from "vue";

const count = ref(5);

// count.value가 변경되면 doubleCount도 자동으로 업데이트됨
const doubleCount = computed(() => count.value * 2);

console.log(doubleCount.value); // 10

count.value = 10;
console.log(doubleCount.value); // 20 (자동 업데이트됨)

computed()의 특징

  • 다른 반응형 데이터(ref)를 기반으로 새로운 값을 생성합니다.
  • 캐싱(Caching)되어, 의존하는 값이 변경될 때만 재계산됩니다.
  • 기본적으로 읽기 전용입니다.

읽기/쓰기 가능한 computed()

const count = ref(3);

const doubleCount = computed({
  get: () => count.value * 2,
  set: (newValue) => {
    count.value = newValue / 2;
  }
});

// 값을 변경하면 count.value가 자동으로 변경됨
doubleCount.value = 20;
console.log(count.value); // 10
console.log(doubleCount.value); // 20


3. ref()를 computed() 없이 직접 연산하면?

computed() 없이 직접 연산하면 반응형이 아니므로 값이 자동 업데이트되지 않습니다.

import { ref } from "vue";

const count = ref(5);
const doubleCount = count.value * 2; // 초기값을 기준으로 고정됨

console.log(doubleCount); // 10

count.value = 10;
console.log(doubleCount); // 여전히 10
  • 초기값만 계산되고 이후에는 업데이트되지 않습니다.


4. computed()를 사용한 올바른 예시

import { ref, computed } from "vue";

const count = ref(5);
const doubleCount = computed(() => count.value * 2);

console.log(doubleCount.value); // 10

count.value = 10;
console.log(doubleCount.value); // 20

computed()를 사용하면 값이 변경될 때 자동으로 업데이트됩니다.


5. computed()와 watch()의 차이점

  • computed(): 상태를 기반으로 자동 계산된 값을 반환합니다.
  • watch(): 상태 변화 시 특정 로직을 실행합니다. watch()는 API 호출 등 부수 효과(side-effects)를 처리할 때 유용합니다.
import { ref, watch } from "vue";

const count = ref(0);

watch(count, (newVal, oldVal) => {
  console.log(`count가 ${oldVal} → ${newVal}로 변경됨`);
});

count.value = 5; // count가 0 → 5로 변경됨

 


6. computed()와 methods()의 차이점

  • methods: 호출할 때마다 항상 다시 실행됩니다.
  • computed: 의존하는 상태가 변할 때만 실행되어 성능상 효율적입니다.
methods: {
  doubleCount() {
    return this.count * 2;
  }
}
computed: {
  doubleCount() {
    return this.count * 2;
  }
}
728x90

'Javascript > NuxtJS' 카테고리의 다른 글

[Nuxt3] Server  (0) 2025.03.15
[Nuxt3] storeToRefs()  (0) 2025.03.12
[Nuxt3] 상태 관리  (0) 2025.03.09
[Nuxt3] 라우트 미들웨어  (0) 2025.03.09
[Nuxt3] 에러 핸들링  (0) 2025.03.09