필터 watchEffect 질문입니다.
50
1 asked
필터처리할때 인풋박스에 입력할때마다 watchEffect로 감지해서 db.json에 있는 데이터를 찾는데.. 실제 백엔드와 연동시 입력할때마다 db 조회를 하면 db부하가 생길거 같은데 실무에서는 어떤식으로 처리하나요 ?
Answer 1
0
안녕하세요 🙂
실무에서는 입력할 때마다 DB 조회를 하면 확실히 성능 문제가 발생할 수 있기에 Debounce, Throttle 기술을 사용합니다.
좋은 질문입니다! 실무에서는 입력할 때마다 DB 조회를 하면 확실히 성능 문제가 발생할 수 있습니다. 일반적으로 다음과 같은 방법들을 사용합니다:
1. Debouncing (디바운싱) - 가장 많이 사용
사용자가 입력을 멈춘 후 일정 시간(보통 300-500ms)이 지나면 API를 호출합니다.
import { ref, watch } from 'vue';
import { debounce } from 'lodash-es'; // 또는 직접 구현
const searchKeyword = ref('');
// lodash 사용 예시
const debouncedSearch = debounce(async (keyword) => {
// API 호출
const response = await axios.get('/api/search', {
params: { q: keyword }
});
}, 300); // 300ms 대기
watch(searchKeyword, (newValue) => {
debouncedSearch(newValue);
});
직접 구현 예시:
const searchKeyword = ref('');
let timeoutId = null;
watch(searchKeyword, (newValue) => {
clearTimeout(timeoutId);
timeoutId = setTimeout(async () => {
// API 호출
await fetchData(newValue);
}, 300);
});
2. Throttling (쓰로틀링)
일정 시간 간격으로만 API를 호출합니다 (예: 1초에 한 번만).
3. 최소 글자 수 제한
watch(searchKeyword, (newValue) => {
if (newValue.length < 2) return; // 2글자 이상일 때만 검색
debouncedSearch(newValue);
});
4. 클라이언트 사이드 캐싱
이미 검색한 키워드는 캐시에 저장하고, 같은 검색어는 재요청하지 않습니다.
const cache = new Map();
const searchWithCache = async (keyword) => {
if (cache.has(keyword)) {
return cache.get(keyword);
}
const result = await axios.get('/api/search', { params: { q: keyword } });
cache.set(keyword, result.data);
return result.data;
};
5. 백엔드에서 처리
백엔드에서 Rate Limiting 적용
데이터베이스 인덱싱 최적화
검색 엔진(Elasticsearch 등) 활용
실무에서 가장 많이 사용하는 조합:Debouncing + 최소 글자 수 제한 + 클라이언트 캐싱
이렇게 하면 사용자 경험도 좋고, 서버 부하도 크게 줄일 수 있습니다!
질문드립니다.
0
32
0
unplugin-vue-components 질문드립니다.
0
37
2
강의듣다가 헷갈려서 질문드립니다.
0
31
1
와 짐코딩님 강의 들으면서 느끼는게 많네요.
0
32
1
질문드립니다.
0
32
2
라우터 인스톨 후 실행안됨
1
49
2
코드 자동 포매팅 질문
0
68
2
json-server 오류가 다른게 뜨네요
0
113
1
미리보기가 안됩니당...
0
69
2
unplugin-vue-components
0
81
2
TypeError 질문
0
52
1
v-model="show" :show="show" 같이 사용?
1
57
1
hash 모드 배포의 필요성?
0
61
2
.eslintrc.cjs 가 없습니다
0
95
2
title,content값이 비어서 저장되는데 제가 혹시 어떤 부분을 잘못 작성했는지 ㅜㅜ 알고싶습니다.
0
98
3
_title_like: "", 문의드려요 해당 값을 설정하면 list가 아에 안나옵니다.
0
64
1
@click.prevent="params._page = pageNum"> 에 .value를 안쓰는 이유가 궁금합니다.
0
71
2
중첩된 컴포넌트 문제
0
75
2
교안에 있는 부분이 아닌가요?
0
109
2
useAxios Proxy(Object) RefImpl
0
113
1
axios timeout
0
328
3
강의와 상관은 없지만, 궁금한 점이 있어 질문드립니다.
0
122
2
컴포넌트 분리 부분에서 오류가 나요ㅠㅠ
0
167
2
This dependency was not found:
0
140
2

