티스토리 뷰
⚠️ watch의 위험성
vue를 처음 시작했을 떄는 watch의 편리성 때문에, watch를 빈번하게 사용했었다.
그러나 프로젝트가 규모가 커져감에 따라 watch가 많으면 다음과 같은 문제가 발생하였다.
⚠️ 코드 가독성/유지보수성 저하
문제점 설명
로직이 분산됨 | 상태 변화에 따라 여러 watch가 동작하면, 전체 동작 흐름을 파악하기 어려움 |
사이드이펙트 위치 불명확 | 로직이 watch 내부에 숨어 있어서 디버깅/추적이 어려움 |
중복된 감시 로직 | 여러 상태가 유사한 방식으로 감시될 경우, 중복 로직이 반복됨 |
아래의 Bad Case를 통해서 문제점을 파악해보자
❌ watch간 상호 의존성
const category = ref('general') // 기본 카테고리
const subCategory = ref(null) // 하위 카테고리
// category 변경 시 동작
watch(category, async (newVal) => {
// ❗특정 조건에서 subCategory 값 변경
if (newVal !== 'custom') {
subCategory.value = null
} else {
...
}
})
// subCategory 변경 시 조건부 감시
watch(subCategory, async (newVal) => {
// ❗특정 조건에서 category 값 변경
if (subCategory.value === 'custom2') {
category.value = null
}
})
위의 예제에서 특정 조건에 따라 서로의 watch 대상 데이터를 바꾸고 있는데, 이러한 상황은 프로세스 추적을 힘들게 만든다. watch가 꼬리에 꼬리를 무는 이야기(꼬꼬무…😭)로 변질되는 순간 디버깅 할 때 스트레스가 폭발하게 된다 😩.
위에 예제외에도 watch가 예상치 못하게 반복 호출 되어 성능이 저하된다던지와 같은 여러 예상치 못한 side effect가 존재할 수 있기 때문에 남용은 금물이다.
☀️ watch 대체 방안
✅ 1. 이벤트 기반 처리
watch 대신 요소 이벤트 핸들러 대체하는 방법이 있다.
아래는 아이디 기억하기 기능에 관한 예제이다.
❌ Bad
import { ref, watch } from 'vue'
const username = ref('')
const rememberMe = ref(false)
// 👎 비효율: username 변경 때마다 저장 처리 → 불필요한 낭비 발생
watch([username, rememberMe], ([name, remember]) => {
if (remember) {
localStorage.setItem('saved-username', name)
}
})
✅ Good
<script setup>
import { ref, onMounted } from 'vue'
const username = ref('')
const rememberMe = ref(false)
onMounted(() => {
const saved = localStorage.getItem('saved-username')
if (saved) {
username.value = saved
rememberMe.value = true
}
})
// 👍로그인할때만 관련 처리를 진행.
function login() {
if (rememberMe.value) {
localStorage.setItem('saved-username', username.value)
} else {
localStorage.removeItem('saved-username')
}
alert(`로그인 시도: ${username.value}`)
}
</script>
<template>
<input v-model="username" placeholder="아이디" />
<label><input type="checkbox" v-model="rememberMe" /> 아이디 기억하기</label>
<button @click="login">로그인</button>
</template>
✅ 2. Computed로 대체
❌ Bad (watch 사용)
watch(() => user.age, (newAge) => {
isAdult.value = newAge >= 20
})
✅ Good (computed 사용)
const isAdult = computed(() => user.age >= 20)
위와 같이 종속 데이터를 다루는게 주목적이라면 computed 를 사용하는 것이 훨씬 낫다.
🎯 결론
watch는 분명 유용한 기능이긴 하지만 무분별하게 남용되었을 때는 유지보수성을 저하시키는 요인이다.
watch를 적절하게 사용하여 side effect를 최소화하고 유지보수성을 높이도록 하자. 👏
'개발' 카테고리의 다른 글
[REST API]Put VS Patch 예제로 이해해보자 (0) | 2024.05.24 |
---|---|
[typescript] DB를 통해 Interface를 생성하자 (with. sql-ts) (0) | 2024.04.26 |
Javascript 동작 방식 (0) | 2022.12.04 |
[Js] Object Property에 대해 알아보자 (0) | 2022.11.06 |
[JS] Null인 경우 값 설정 연산, Nullish coalescing operator (??) (0) | 2022.10.30 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- unmounted document.addlistener
- 1종 적성검사 국가건강검진
- 스파르타 코딩클럽
- rest api 조회 생성 수정 삭제
- vue 이벤트 해제
- vue watch 대체
- oracle 19c 설치
- 1종 적성검사 신체검사
- docker multi stage build
- Oracle Database 19C 설치
- vue watch 문제점
- docker image 경량화
- vue watch 위험성
- 1종 적성검사 과태료
- vue unmounted
- 티스토리챌린지
- vue 리팩토링
- 오블완
- 강서 운전면허 시험장
- 1종 적성검사
- 스마트피싱보호_캠페인
- Oracle Database 19c install
- dockerignore
- unmounted setinterval
- unmounted composable
- 외래키 삭제
- vue onunmounted
- unplugin-auto-import
- rest api 단건 다건
- vue 타이머 해제
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함