본문 바로가기
Javascript/vue

Vue3 watch를 이용한 데이터 변경 감지하기

by 노마드 산코디 2023. 10. 2.
728x90

Vue3 watch를 이용한 데이터 변경 감지하기



 

안녕하세요!

오늘은 Vue3의 watch 기능에 대한 내용을 주제로 포스팅하려고 합니다. Vue 3의 watch는 데이터의 변화를 감지하고, 변화에 반응하여 원하는 동작을 수행하는데 유용한 기능입니다. 데이터 변화를 감시하고 적절한 처리를 할 수 있는 watch를 효과적으로 활용하는 방법에 대해 알아보겠습니다.

 

 

 


watch란?


watch란 Vue 애플리케이션에서 데이터의 변경을 감지하고, 해당 데이터가 변화할 때 특정 로직을 실행할 수 있는 기능입니다. Vue 컴포넌트 내에서 데이터의 상태 변화를 감시하며, 데이터가 변경될 때마다 원하는 동작을 수행하거나 사이드 이펙트를 처리할 수 있습니다.



특징

1. 데이터 감시

watch를 사용하면 정의한 데이터나 데이터의 특정 속성을 지켜보며 변경 여부를 모니터링합니다.

2. 리액티브 반응
Vue의 반응성 시스템을 활용하여 데이터의 변경을 실시간으로 감지합니다.

3. 사이드 이펙트 처리
데이터 변경 시 특정 동작을 실행하여 사이드 이펙트를 처리합니다. 예를 들어 데이터 변경 시 로깅, API 호출, 화면 갱신 등을 할 수 있습니다.

4. 이전 값과 현재 값 비교
watch의 콜백 함수 내에서 이전 값과 현재 값이 인자로 제공되어 데이터 변경의 세부 내용을 파악할 수 있습니다.

5. 중첩된 객체, 배열 지원
watch는 중첩된 객체나 배열의 내부 값의 변경도 감지할 수 있습니다.

6. 비동기 처리
비동기 로직을 수행하는 경우에도 데이터 변경을 감지하고 이에 따른 처리를 할 수 있습니다.



watch는 Vue 컴포넌트 내에서 데이터의 동적인 변화에 따라 자동으로 반응하고 특정 동작을 수행하기 위한 강력한 도구로 사용됩니다.








watch 함수의 사용법


1. watch 옵션 사용
컴포넌트 내에서 watch 옵션을 사용하여 감시하려는 데이터를 정의하고, 데이터의 변화에 대한 처리를 콜백 함수로 지정합니다.

watch: {
  // 감시할 데이터
  myData(newValue, oldValue) {
    // 데이터 변화에 대한 처리
  }
}




2. watch의 콜백 함수

  • watch의 콜백 함수는 감시 대상 데이터가 변경될 때마다 실행됩니다.
  • 콜백 함수의 첫 번째 인자로는 변경된 값(newValue)이 전달되고, 두 번째 인자로는 이전 값(oldValue)이 전달됩니다.

3. 콜백 함수 활용
콜백 함수 내에서는 데이터의 변경에 따라 원하는 동작을 수행할 수 있습니다. 예를 들어 화면 갱신, 로깅, API 호출 등을 처리할 수 있습니다.

watch: {
  myData(newValue, oldValue) {
    console.log('이전 값:', oldValue);
    console.log('새로운 값:', newValue);

    // 데이터 변경에 따른 동작 수행
  }
}




4. immediate 옵션 사용
watch 옵션에 immediate: true를 추가하면 컴포넌트 초기 렌더링 시에도 즉시 콜백 함수를 실행합니다.

watch: {
  myData: {
    handler(newValue, oldValue) {
      // 초기 렌더링 시에도 실행
    },
    immediate: true
  }
}




5. deep 옵션 사용
true 옵션을 사용하여 중첩된 객체나 배열의 내부 값의 변경도 감지할 수 있습니다.

watch: {
  myNestedData: {
    handler(newValue, oldValue) {
      // 중첩된 객체의 내부 값 변경도 감지
    },
    deep: true
  }
}




watch를 사용하면 데이터의 변경을 감시하고, 그에 따른 동작을 정의할 수 있습니다. 이를 활용하여 컴포넌트 내에서 데이터의 변화에 따라 자동으로 반응하고 필요한 처리를 수행할 수 있습니다.

 

 

 


watch의 성능 최적화


Vue3에서 watch 기능을 사용하다 보면 불필요한 감시를 하게 됩니다. 이러한 경우에는 불필요한 데이터까지 감시하게 되기 때문에 성능에 안좋을 수 있습니다. 이런 경우에 성능을 최적화 할 수 있는 방법을 알아보겠습니다.



1. 감시 대상 축소
필요한 데이터만 감시하도록 대상을 축소합니다. 불필요한 데이터까지 감시하는 것을 피하면 성능이 향상됩니다.

2. immediate 옵션 활용
옵션 immediate true를 사용하여 초기 렌더링 시에도 콜백 함수를 실행하도록 설정할 수 있습니다.

3. 비동기 처리 최적화
watch 내에서 비동기 작업이 필요한 경우, nextTick이나 setTimeout을 사용하여 감시 이후에 실행하도록 합니다.

4. lazy 옵션 사용
옵션 lazy true 옵션을 사용하면 컴포넌트가 렌더링되기 전까지는 콜백 함수를 호출하지 않습니다.

5. debounce나 throttle 활용
변경이 빈번하게 일어나는 경우, debounce나 throttle을 사용하여 일정 시간 동안 변경을 모아서 처리하도록 할 수 있습니다.

6. 비교 함수 정의
watch 옵션에 deep나 immediate를 사용하지 않을 경우, 비교 함수를 정의하여 값의 변경 여부를 직접 확인하도록 할 수 있습니다.

watch: {
  myData(newValue, oldValue) {
    if (newValue !== oldValue) {
      // 변경된 경우에만 동작 수행
    }
  }
}



7. 캐싱 활용
computed 속성을 사용하여 필요한 경우 watch 대신 computed를 활용하여 성능을 향상시킬 수도 있습니다.

8. Custom Watcher 함수 사용
Custom Watcher 함수를 생성하여 감시 대상과 콜백 함수를 별도로 분리하여 사용하면 코드 가독성과 성능을 높일 수 있습니다.

const customWatcher = (target, callback) => {
  return watch(target, callback, { deep: true, immediate: true });
};

customWatcher(myData, (newValue, oldValue) => {
  // 변경된 경우에 동작 수행
});




watch의 성능을 최적화하기 위해서는 필요한 데이터만 감시하고, 비동기 작업 처리를 최적화하며, 옵션과 함수를 활용하여 변경을 효율적으로 관리하도록 합니다.







동적 감시와 Composition API


1. 동적 감시

  • 동적 감시란, watch를 사용할 때 미리 정의된 옵션 대신에 동적으로 감시 대상을 지정하는 방법입니다.
  • 이를 통해 반복적인 코드 중복을 줄이고 더 유연한 코드를 작성할 수 있습니다.


2. Composition API와의 연계

  • 컴포지션 API는 컴포넌트 로직을 더 작은 단위로 분리하고 재사용 가능한 로직을 작성하는 데 사용됩니다.
  • 동적 감시 역시 컴포지션 API의 장점을 활용하여 간결한 코드를 작성할 수 있는 방법 중 하나입니다.


3. watchEffect 함수

  • watchEffect 함수를 사용하여 동적 감시를 구현할 수 있습니다.
  • watchEffect는 의존하는 상태를 자동으로 감지하고 그에 따라 자동으로 실행되는 함수를 정의합니다.
import { ref, watchEffect } from 'vue';

setup() {
  const myData = ref('initial value');

  watchEffect(() => {
    console.log(myData.value); // 의존하는 데이터 변경 시에도 자동으로 실행됨
  });

  return { myData };
}



4. watch 함수와 조합

  • watch 함수를 활용하여 특정 데이터의 변화에 따른 동작을 더욱 세밀하게 제어할 수 있습니다.
  • watch 함수 내에서 동적 감시와 함께 비동기 작업 등을 처리할 수 있습니다.
import { ref, watch } from 'vue';

setup() {
  const myData = ref('initial value');
  
  watch(myData, (newValue, oldValue) => {
    console.log('변경된 값:', newValue);
  });

  return { myData };
}



5. 상태 관리와 재사용성

  • 동적 감시와 컴포지션 API를 결합하여 비슷한 로직을 여러 컴포넌트에서 재사용하고, 로직을 더 작은 함수로 분리하여 관리할 수 있습니다.

 

동적 감시는 컴포지션 API와 함께 사용하여 반복적인 코드 중복을 줄이고, 재사용 가능한 로직을 더욱 효율적으로 작성하는 방법을 제공합니다. watchEffect와 watch 함수를 활용하여 의존성을 감지하고 자동으로 동작하는 코드를 구현할 수 있으며, 이는 더 깔끔하고 유지보수 가능한 코드를 작성하는 데 도움이 됩니다.





 


watch 비동기 처리


watch에서 비동기 처리


1. 비동기 처리 필요성

  • watch에서 비동기 처리가 필요한 경우는 주로 API 호출, 서버 요청, 데이터 업데이트 후의 처리 등이 있습니다.


2. watch 내부에서 직접 비동기 처리하지 않기

  • watch 콜백 함수 내에서 직접 비동기 작업을 수행하지 않는 것이 좋습니다.
  • 이는 비동기 작업이 완료되지 않은 상태에서 다른 데이터 변경에 의해 중복 호출되는 등의 문제를 예방합니다.


3. watch와 async/await

  • async/await를 사용하여 비동기 처리를 더 효과적으로 관리할 수 있습니다.
  • 비동기 함수 내에서 await를 사용하여 결과를 기다린 후 처리할 수 있습니다.
watch: {
  async myData(newValue, oldValue) {
    try {
      const response = await fetchData(newValue);
      // 비동기 작업 완료 후 처리
    } catch (error) {
      // 에러 처리
    }
  }
}



4. watch와 Promise 반환

  • watch 콜백 함수가 Promise를 반환하면 Vue는 그 Promise의 해결을 기다렸다가 해당 Promise가 완료되면 다음 동작을 실행합니다.
watch: {
  myData(newValue, oldValue) {
    return fetchSomeData(newValue).then(result => {
      // Promise 해결 후 처리
    });
  }
}



5. 비동기 로직 최적화

  • 비동기 작업을 중복 호출하는 것을 피하기 위해 적절한 캐싱이나 중첩된 호출을 방지하는 로직을 구현해야 합니다.


6. 컴포넌트 상태 관리

  • 비동기 작업으로 인한 컴포넌트의 상태 변경이 예상되는 경우, 컴포넌트의 상태를 관리하고 화면 갱신에 유의해야 합니다.

 

watch를 통해 비동기 처리를 수행할 때는 async/await와 Promise를 활용하여 비동기 작업을 효과적으로 관리하고, 중복 호출과 에러 처리에 주의하여 코드를 작성해야 합니다.

 

 

 


watch 사용시 주의사항


1. 무한 루프에 주의

  • watch 콜백 함수 내에서 감시 대상 데이터를 변경하면 무한한 감시 루프가 발생할 수 있습니다. 이에 유의해야 합니다.

2. 비동기 작업 주의

  • watch 콜백 함수 내에서 직접 비동기 작업을 수행하면 의도치 않은 중복 호출이 발생할 수 있습니다.
  • 비동기 작업은 async/await 또는 Promise를 활용하여 적절하게 관리해야 합니다.


3. 콜백 함수의 부작용 최소화

  • watch 콜백 함수 내에서 화면 갱신을 강제로 호출하거나 다른 데이터 변경을 유발하는 부작용을 최소화해야 합니다.


4. 비교 함수 주의

  • watch에 immediate나 deep 옵션을 사용하지 않을 경우, 콜백 함수 내에서 변경 여부를 비교하는 로직을 반드시 구현해야 합니다.


5. 의존성 명시

  • watch 콜백 함수에서 사용하는 모든 데이터를 의존성으로 명시적으로 선언해야 합니다.
  • 의존성을 선언하지 않으면 콜백 함수 내에서 해당 데이터 변경 시 콜백이 실행되지 않을 수 있습니다.


6. 컴포넌트 복잡성 관리

  • 과도한 watch 사용은 컴포넌트를 복잡하게 만들 수 있습니다. 필요한 경우 computed를 활용하여 코드를 간결하게 유지할 수 있습니다.


7. 비동기 로직 최적화

  • 비동기 작업은 중복 호출과 에러 처리를 고려하여 적절한 최적화를 수행해야 합니다.


8. Custom Watcher 사용

  • 복잡한 watch 로직이나 재사용성을 고려할 때는 Custom Watcher 함수를 사용하여 코드 가독성과 관리성을 향상시킬 수 있습니다.
const customWatcher = (target, callback) => {
  return watch(target, callback, { deep: true, immediate: true });
};

customWatcher(myData, (newValue, oldValue) => {
  // 변경된 경우에 동작 수행
});




watch를 사용할 때는 무한 루프, 비동기 작업, 의존성 등을 고려하여 코드를 작성하고, 필요한 경우 적절한 최적화와 관리를 통해 원할한 동작을 보장해야 합니다.

 

 

 

 

 

 


최종 정리

오늘은 Vue3의 watch 기능에 대한 내용을 주제로 정리해 보았습니다. 데이터의 변화를 감지하고 그에 따라 자동으로 동작하도록 설정하는 watch는 Vue 개발에서 핵심적인 역할을 합니다. 기본적인 watch 사용법부터 비동기 처리, 동적 감시, 그리고 컴포지션 API와의 유연한 결합까지 다양한 내용을 다뤄보았습니다.

watch를 통해 데이터의 변화를 감시하고 필요한 동작을 수행함으로써 애플리케이션의 상태 변화에 더 민감하게 대응할 수 있습니다. 하지만 동시에 무한 루프, 비동기 처리, 콜백 함수의 부작용 등 주의해야 할 점들도 존재합니다.



다음에도 이어서 Vue와 관련된 다양한 주제에 대해 정리해 보도록 하겠습니다.

감사합니다.

728x90
반응형