debnounce๋ ?
- debounce๋ ์ฌ๋ฌ ๊ฐ์ ์์ฐจ์ ์ด๋ฒคํธ ํธ์ถ์ ๋ง์ง๋ง(๋๋ ์ฒ์) ํ๋์ ํธ์ถ๋ง ํ๋๋ก ํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ
- ์ฃผ๋ก ๊ฒ์, ์คํฌ๋กค ๊ฐ์ ๋ฐ๋ณต์ ์ธ ์ด๋ฒคํธ๊ฐ ์ผ์ด๋ ๋ ์ฌ์ฉํ๋ฉฐ ์ ๋ช ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ lodash๋ฅผ ์ค์นํ๋ฉด ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
- ๋ง์ฝ ํ์๊ฐ์ ์์ ์ด๋ฉ์ผ์ ์ค๋ณตํ์ธ์ onChange ์ด๋ฒคํธ๋ก ์ฒดํฌํ๋ค๊ณ ํ์ ๊ฒฝ์ฐ ์ฌ์ฉ์์ ์ ๋ ฅ๋ง๋ค API ํธ์ถ์ ํ๊ฒ ๋๋๋ฐ ์ด๋ฌ๋ฉด ๋์งํ ์๋ฒ ๋น์ฉํญํ์ ๋ง์ ์ ์๋ค.
debouncing ์์
useEffect(() => {
console.log(`http ์์ฒญ ${formData.email}`);
}, [formData.email]);
- useEffect๋ฅผ ์ด์ฉํด email input์ด ์๋ฒ์ ๊ฐ์ ์์ด๋๊ฐ ์๋์ง ์ค๋ณตํ์ธํ๋ ์ฝ๋์ ๋๋ค. console.log() ๊ฐ http ์ ์์ฒญ์ ๋ณด๋ด๋ ๋ก์ง์ด๋ผ ์๊ฐํด๋ณด์.
- ์์กด์ฑ ๋ฐฐ์ด์๋ formData.email์ด ๋ณ๊ฒฝ๋๋ฉด useEffect๊ฐ ์คํ๋๊ณ ๊ฐ์ด ํ๋ ์ ๋ ฅ๋ ๋๋ง๋ค ์์ฒญ์ด ๋ณด๋ด์ง๋๋ฐ ๊ต์ฅํ ๋นํจ์จ์ ์ด๊ณ ์๋ฒ์๋ ์ฌ์ฉ์์๊ฒ๋ ์ข์ง ์์ ํ์์ด๋ค.
setTimeout ์ ์ด์ฉํ ๋ฐฉ๋ฒ
useEffect(() => {
const duplicateCheckEmail = setTimeout(() => {
if (formData.email) {
console.log('http ์์ฒญ');
}
}, 500);
return () => {
clearTimeout(duplicateCheckEmail);
console.log('http ์์ฒญ ์บ์ฌ');
};
}, [formData.email]);
- ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํ๋ setTimeout ๋ฉ์๋์ useEffect๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒ์ด๋ค.
- useEffect์ ๋ฆฌํด๊ฐ์ผ๋ก ํจ์๋ฅผ ์ค์ ํ๋ฉด ์ปดํฌ๋ํธ๊ฐ ์ฌ ๋ ๋๋ง ๋๊ธฐ ์ ์ ํจ์๋ฅผ ์คํํ๋ค. ์ด๋ฅผ 'ํด๋ฆฐ์
ํจ์'๋ผ ๋ถ๋ฅด๋๋ฐ ๊ฐ๋จํ๊ฒ ์คํ ์์๋ ์ด๋ ๋ค.
- input ๊ฐ ์ ๋ ฅ (์ด๋ฒคํธ ๋ฐ์)
- setTimeout ์ค์
- ๋ ๋ค๋ฅธ input๊ฐ ์ ๋ ฅ
- ํด๋ฆฐ์ ํจ์ ์คํ์ผ๋ก ์ธํ ์ด์ setTimeout ์ ๊ฑฐ
- ์ปดํฌ๋ํธ ์ฌ ๋ ๋๋ง ํ ๋ง์ง๋ง setTimeout ์คํ
- ์ด๋ ๋ฆฌ์กํธ ํ ๋ผ์ดํ์ฌ์ดํด์ ์ดํด๋ณด๋ฉด ๋ ์์ธํ ์ ์ ์๋ค.
lodash ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด์ฉํ๊ธฐ
- lodash ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ณตํต์ผ๋ก ์ฌ์ฉํด์ผ ํ๋ ์ผ๋ฐ์ ์ธ ํจ์๋ค์ ๋ชจ์์ ์ ๊ณตํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- webpack์ ์ด์ฉํ ํ๋ก์ ํธ ๊ตฌ์ฑ ์ lodash ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ ๋ import { debounce } from 'lodash' ํ์์ผ๋ก ๋ถ๋ฌ์ค๊ฒ ๋๋ค๋ฉด ํด๋น import ๊ตฌ๋ฌธ์ tree shaking์ ์ ์ฉ๋์ง ์๋๋ค.โ๏ธ
- lodash ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ commonJS ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด๋ฉฐ webpack์ ES6 ๋ชจ๋ ๋ฐฉ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง tree shaking์ ์ง์ํ๊ธฐ์ lodash-es ๋ชจ๋์ ์ฌ์ฉํ๊ฑฐ๋ import { debounce } from 'lodash/debounce' ๊ฐ์ด ๋ช ์ํด์ ์ฌ์ฉํด์ผํ๋ค. โญ๏ธ
// ์๋ชป๋ ๋ฐฉ๋ฒ
useEffect(() => {
if (formData.email) {
debounce(() => {
console.log('http ์์ฒญ');
}, 500);
}
}, [formData.email]);
- ํด๋น ์ฝ๋๋ ๋์ํ์ง ์๋๋ค.
- ์ด์ ๋ ์ปดํฌ๋ํธ ๋ด๋ถ์ debounce๋ฅผ ์ ์ํ ํจ์๊ฐ ์์ ๊ฒฝ์ฐ ํด๋น ์ปดํฌ๋ํธ๊ฐ formData.email (state) ๊ฐ ๋ณ๊ฒฝ๋จ์ ๋ฐ๋ผ ๋ฆฌ๋ ๋๋ง์ด ๋๋ค๋ฉด debounce ํจ์๋ ์ฌ์์ฑ ๋๋ฉด์ ๊ธฐ์กด์ debounce๋ฅผ ์ด๊ธฐํ ํด๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ.
const debounceEmailValidMutation = useCallback(
debounce(() => {
console.log('http ์์ฒญ');
}, 500),
[],
);
useEffect(() => {
if (formData.email) {
debounceEmailValidMutation();
}
}, [formData.email]);
- ํด๊ฒฐ ๋ฐฉ๋ฒ์ debounce ํจ์๋ฅผ useCallback์ผ๋ก ๊ฐ์ธ ๋ํ๋์์ ๋น ๋ฐฐ์ด์ ๋ฃ์ด ํจ์๋ฅผ ์ฌ์์ฑ ํ์ง ์๋๋ก ๋ง์์ค ํ useEffect์ ๋ฃ์ด์ฃผ๋ฉด ๋จ ํ๋ฒ์ ์์ฒญ๋ง ๊ฐ๊ฒ๋๋ค. ๐
- ์ฝ๋์ ๊ฐ๋ ์ฑ์ ์๊ฐํ๋ฉด ๊ฐ์ธ์ ์ผ๋ก lodash ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด ๋ ์ข์๊ฑฐ ๊ฐ๋ค.
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Tailwind CSS] Tailwind ์๋์์ฑ ์กฐ๊ธ ๋ ํธํ๊ฒ ์ฐ๋ ๋ฐฉ๋ฒ (1) | 2023.11.03 |
---|---|
[React] ์ฌ๊ท ์ปดํฌ๋ํธ (1) | 2023.10.15 |
[React]useState (0) | 2022.11.16 |
[React]useLocation (0) | 2022.11.02 |
[React]CustomHook (์ฌํ์ฉ์ฑ form๋ง๋ค๊ธฐ) (0) | 2022.08.19 |