debounce๋กœ ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰์–ด api ํ˜ธ์ถœ ์ค„์ด๊ธฐ

2024. 2. 7. 18:21ยท React

์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰์–ด ์ž๋™์™„์„ฑ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ, ๊ธฐ์กด์˜ ์ฝ”๋“œ๋Š” ๊ฒ€์ƒ‰์–ด input ๊ฐ’์ด ๋ฐ”๋€”๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„์— api๋ฅผ ํ˜ธ์ถœํ–ˆ๋‹ค.

์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•ด debounce๋ผ๋Š” ๊ฐœ๋…์„ ์ฝ”๋“œ์— ์ƒˆ๋กœ ์ ์šฉํ•ด๋ณด์•˜๋‹ค. debounce๊ฐ€ ์–ด๋–ค ๊ฐœ๋…์ด๋ฉฐ ์ด๊ฑธ react ์ฝ”๋“œ๋กœ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณธ๋‹ค.

 

 

 

๊ธฐ์กด ๊ฒ€์ƒ‰ ์ปดํฌ๋„ŒํŠธ

useEffect(() => {
getLazySearchList(); //api ํ˜ธ์ถœ
}, [searchInputValue]);
<TextField
placeholder='๊ทธ๋ฃน๋ช…์„ ๊ฒ€์ƒ‰ํ•˜์„ธ์š”'
value={searchInputValue}
onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
setSearchInputValue(e.target.value)
}
/>

 

์œ„ ์ฝ”๋“œ์—์„œ๋Š” useState hook์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋Š” searchInputValue๊ฐ€ ๋ฐ”๋€”๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.

 

์ง€๊ธˆ ์˜ˆ์ œ ์‚ฌ์ง„์—์„œ ๋ณด๋“ฏ์ด ๊ฒ€์ƒ‰์ฐฝ์— ์œ ์ €๊ฐ€ ์•„๋ž˜ ์ฒ˜๋Ÿผ ์ž…๋ ฅํ•˜๋ฉด

ใ„ฑ > ๊ทธ > ๊ธ€ > ๊ทธ๋ฃจ > ๊ทธ๋ฃน

์œ ์ €์˜ onChange์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ• ๋•Œ๋งˆ๋‹ค api๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ ์„œ๋ฒ„์— ํ˜ธ์ถœ์„ 5๋ฒˆ์ด๋‚˜ ํ•˜๊ฒŒ ๋œ๋‹ค. 

 

์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ธก๋ฉด์—์„œ๋Š” ์œ ์ €๊ฐ€ ์ž…๋ ฅํ•œ๋Œ€๋กœ ๋ฐ”๋กœ๋ฐ”๋กœ ๊ฒ€์ƒ‰์–ด์— ํ•ด๋‹นํ•˜๋Š” ์ž๋™์™„์„ฑ ๋ชฉ๋ก ๊ฒฐ๊ณผ๊ฐ€ ํ•˜๋‹จ์— ๋…ธ์ถœ๋˜๋‹ˆ ์ข‹๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋งŒ์•ฝ ์œ ์ €๊ฐ€ 100๋งŒ๋ช…์ด๋ผ๋ฉด??? ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰๋งŒ ํ•˜๋Š”๋ฐ ๊ณผ๋„ํ•œ API ํ˜ธ์ถœ๋กœ ์ธํ•ด ์„ฑ๋Šฅ์— ์ด์ƒ์ด ์ƒ๊ธธ ์ˆ˜ ๋„ ์žˆ์„ ๋ฟ๋”๋Ÿฌ ์„œ๋ฒ„์— ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฐˆ ํ™•๋ฅ ์ด ์•„์ฃผ ๋†’๋‹ค.

 

์ด๋•Œ ํ”„๋ŸฐํŠธ๋‹จ์—์„œ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•œ ๊ฐ€์ง€๊ฐ€ ๋””๋ฐ”์šด์Šค์ด๋‹ค. 

 

Debounce๋ž€? 

 

์ฒ˜์Œ์— debounce ๋ผ๋Š” ๋ง์ด ์™€๋‹ฟ์ง€ ์•Š์•˜๋Š”๋ฐ 

์˜์–ด์—์„œ de๋Š” ์ œ๊ฑฐ, ๊ฐ์†Œ์˜ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” prefix ์ด๋‹ค.

decaffeine ๋””์นดํŽ˜์ธํ•˜๋ฉด ์นดํŽ˜์ธ์„ ์ œ๊ฑฐํ•œ ๊ฒƒ์ด๊ณ , defrost๋Š” frost (์„œ๋ฆฌ)๋ฅผ ์—†์• ๋‹ค, ์–ผ๋ฆฐ๊ฑธ ๋…น์ด๋‹ค, ํ•ด๋™ํ•˜๋‹ค๋ผ๋Š” ๋œป์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ debounceํ•˜๋ฉด bounce ์‹ ํ˜ธ๋ฅผ ์ œ๊ฑฐํ•œ ๊ฒƒ์ด๋‹ค. 

 

 

Debouncing is removing unwanted input noise from buttons, switches or other user input. Debouncing prevents extra activations or slow functions from triggering too often. Debouncing is used in hardware switches, programs and websites.

 

 

 

๋””๋ฐ”์šด์Šค๋Š” ํ•˜๋“œ์›จ์–ด ์šฉ์–ด๋กœ ์‹œ์ž‘๋˜์—ˆ๋‹ค.

๋ฒ„ํŠผ, ์Šค์œ„์น˜ ๋“ฑ์—์„œ ์›์น˜์•Š๋Š” ๋…ธ์ด์ฆˆ/๋ฐ”์šด์Šค๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. 

๊ทธ๋Ÿผ ๋ฐ”์šด์Šค ์‹ ํ˜ธ๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€? ์šฐ๋ฆฌ๊ฐ€ ์ „๊ธฐ๋ฅผ ์ผฐ๋‹ค ๋Œ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์‹ค์ œ ๋ฌผ๋ฆฌ์ ์ธ ์ „๊ธฐ ์Šค์œ„์น˜๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด, ์Šค์œ„์น˜๋ฅผ ๋ˆ„๋ฅผ๋•Œ๋งˆ๋‹ค ์‹ ํ˜ธ๊ฐ€ ํŒŒ๋™์ฒ˜๋Ÿผ ๋ฐœ์ƒํ•œ๋‹ค.

 

 

 

 

 

์ฒ˜์Œ ์Šค์œ„์น˜๋ฅผ ๋ˆ„๋ฅด๋ฉด ์‹ ํ˜ธ๋Š” ์ผ์ง์„ ์ด ์•„๋‹Œ ๊ณ ์ ๊ณผ ์ €์ ์„ ์—ฌ๋Ÿฌ๋ฒˆ ๋ฐ˜๋ณตํ•˜๋Š” ํŒŒ๋™๊ฐ™์€ ๋ชจ์–‘์ƒˆ๋ฅผ ๊ฐ€์ง€๋‹ค๊ฐ€ ์ดํ›„์— ์•ˆ์ •์ ์ธ ์ผ์ง์„ ์„ ์ฐพ๋Š”๋‹ค. ์ด๋Ÿฐ ์‹ ํ˜ธ๋กœ ์Šค์œ„์น˜๋ฅผ on/off ํ•˜๋Š” ๊ฒƒ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์‹ ํ˜ธ๊ฐ€ ๊ณ ์ ์— ๋„๋‹ฌํ•ด์•ผ์ง€ ์Šค์œ„์น˜๊ฐ€ ์ผœ์ง€๋Š” ๊ทธ ์ง€์ ์ด ์ด๋ฅด๊ธฐ ์ „๊นŒ์ง€ ์ดˆ๊ธฐ์— ๋ฐœ์ƒํ•˜๋Š” ์ง€์ง€์ง๊ฑฐ๋ฆฌ๋Š” ํŒŒ๋™๊ฐ™์€ ์‹ ํ˜ธ๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์›์น˜์•Š๋Š” ๋…ธ์ด์ฆˆ์ด๊ณ , ๋””๋ฐ”์šด์‹ฑ์ด๋ผ๋Š” ๊ธฐ์ˆ ๋กœ ์ด ๋ฐ”์šด์Šค ์‹ ํ˜ธ๋ฅผ ๋ฌด์‹œํ•œ๋‹ค. 

 

์ •๋ฆฌํ•˜์ž๋ฉด debouncing์€ ํ•˜๋“œ์›จ์–ด์—์„œ ์‹ ํ˜ธ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์ด ํ™œ์„ฑํ™”/์‹คํ–‰๋˜๋Š” ๋…ธ์ด์ฆˆ๋ฅผ ๋ง‰๋Š” ๊ธฐ๋ฒ•์ธ๋ฐ, ์›น ํ”„๋กœ๊ทธ๋žจ์—์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์œ ์ €์˜ ์ธํ’‹์— ๋”ฐ๋ฅธ ๊ณผ๋„ํ•œ ์ด๋ฒคํŠธ ํ˜ธ์ถœ์„ ์—†์• ๋Š” ๊ฐœ๋…์ด๋‹ค. 

 

์›น ํ”„๋ŸฐํŠธ์—์„œ์˜ ๋””๋ฐ”์šด์Šค 

 

์งง์€ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ์—ฐ์†๋œ ์ด๋ฒคํŠธ๊ฐ€ ์žˆ์„ ๋•Œ, ์—ฐ์†๋œ ์ด๋ฒคํŠธ๋“ค(=๋…ธ์ด์ฆˆ)์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋‹ค๊ฐ€ ์ผ์ • ์‹œ๊ฐ„์ด ๊ฒฝ๊ณผํ•œ ์ดํ›„์— ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœํ•˜๋Š” ๊ฐœ๋…์„ ๋œปํ•œ๋‹ค. 

์ฆ‰, ์งง์€ ์‹œ๊ฐ„๋™์•ˆ ์—ฐ์†ํ•ด์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋ฅผ ๊ทธ๋ฃน์œผ๋กœ ๋ชจ์•˜๋‹ค๊ฐ€ ์ผ์ • ์‹œ๊ฐ„ ์ดํ›„์— ๋งˆ์ง€๋ง‰ ํ•œ ๋ฒˆ๋งŒ ์ด๋ฒคํŠธ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. 

 

์‚ฌ์šฉ ์˜ˆ์‹œ

  • ๋ธŒ๋ผ์šฐ์ € ํฌ๊ธฐ resize ์ด๋ฒคํŠธ 
  • ๋ฒ„ํŠผ ์ค‘๋ณต ํด๋ฆญ ๋ฐฉ์ง€ ์ฒ˜๋ฆฌ
  • ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰์–ด ์ž๋™์™„์„ฑ input 

 

๊ทธ๋Ÿผ ๋””๋ฐ”์šด์Šค์˜ ๊ฐœ๋…์„ ๋ฆฌ์•กํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ? 

 

์‹œ๊ฐ„ ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ด€๊ฑด์ด ๋œ๋‹ค.

๋””๋ฐ”์šด์Šค๋ผ๋Š” ํ…Œํฌ๋‹‰์€ ์œ„์—์„œ ์ •๋ฆฌํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ์ผ์ • ์‹œ๊ฐ„ ์ดํ›„์— ํ•œ ๋ฒˆ๋งŒ ์ด๋ฒคํŠธ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋Š” ์ปจ์…‰์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ฆฌ์•กํŠธ์—์„œ ์ด ๊ฐœ๋…์„ ์ฝ”๋“œ๋กœ ๋…น์ด๋ ค๋ฉด? ์œ ์ €๊ฐ€ input ์„ ์ž…๋ ฅํ•˜๋ฉด ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•ด์„œ ์ง€์ •ํ•œ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ ์ด๋‚ด์— ๋“ค์–ด์˜ค๋Š” input์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ฐ€, ์„ค์ •ํ•œ ์‹œ๊ฐ„์ด ๋๋‚˜๋ฉด ๋””๋ฐ”์šด์‹ฑ๋œ ๋ฐธ๋ฅ˜๊ฐ’์„ ์ƒํƒœ๊ฐ’์œผ๋กœ ๊ด€๋ฆฌํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค. 

 

์ด์— ๋””๋ฐ”์šด์Šค์‹œํ‚จ ์ธํ’‹ ๋ฐธ๋ฅ˜๋ฅผ ๋ฆฌํ„ดํ•ด์ฃผ๋Š” useDebounce๋ผ๋Š” custom hook์„ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ๋‹ค. 

 

useDebounce hook

export const useDebounce = (value: string, delay: number) => {
const [debounceValue, setDebounceValue] = useState(value);
useEffect(() => {
const debounceTimer = setTimeout(() => {
setDebounceValue(value);
}, delay);
return () => {
clearTimeout(debounceTimer);
};
}, [value, delay]);
return debouncedValue;
};

 

 

useDebounce๋ผ๋Š” ํ•จ์ˆ˜๋‹ค. ์ธ์ž๋กœ 2๊ฐ€์ง€๋ฅผ ๋ฐ›๋Š”๋ฐ, ๋””๋ฐ”์šด์‹ฑ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋ฐธ๋ฅ˜๊ฐ’ value ๊ณผ ์„ค์ •ํ•˜๊ณ  ์‹ถ์€ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ delay ์„ ์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ๋ฐ›์•„์˜จ ์ธ์ž๋ฅผ ๋””๋ฐ”์šด์‹ฑ ์ฒ˜๋ฆฌํ•ด์„œ ์„ค์ •ํ•œ ์‹œ๊ฐ„์ด ๋๋‚˜๋ฉด ๊ทธ ๋งˆ์ง€๋ง‰ ์ธํ’‹ ๋ฐธ๋ฅ˜๊ฐ’์„ ์ €์žฅํ•˜๊ณ , ์ด๋ฅผ debouncedValue ๋ผ๋Š” ๊ฐ’์œผ๋กœ ๋ฆฌํ„ดํ•ด์ค€๋‹ค.  

 

ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€๋ฅผ ๋ณด์ž.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด์žฅํ•จ์ˆ˜ setTimeout ๋ฅผ ํ™œ์šฉํ•ด์„œ delay ์ธ์ž๋กœ ๋ฐ›์€ ์‹œ๊ฐ„ ๋งŒํผ์„ ์žฌ๋Š” ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•œ๋‹ค.

์ด ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•œ ์‹œ๊ฐ„์ด ๋๋‚ฌ์„ ๋•Œ setTimeout ์•ˆ์˜ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š”๋ฐ, ํƒ€์ด๋จธ๊ฐ€ ๋๋‚˜์•ผ setDebounceValue๋ผ๋Š” ๋””๋ฐ”์šด์Šค ๋ฐธ๋ฅ˜๋ฅผ ์ƒํƒœ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

๋˜ํ•œ ์ด ํƒ€์ด๋จธ๊ฐ€ useEffect hook์œผ๋กœ ๊ด€๋ฆฌ๋˜๋Š” ๊ฒƒ์„ ๋ณด๋ฉด ๋ณธ๋ž˜ value๋กœ ๋„˜๊ฒจ์ฃผ๋Š” input ๊ฐ’์ด ๋ณ€๊ฒฝ๋ ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ ํƒ€์ด๋จธ๊ฐ€ ์‹œ์ž‘๋˜๊ณ  ํƒ€์ด๋จธ๊ฐ€ ํด๋ฆฌ์–ด ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฒฐ๊ตญ ์œ ์ €๊ฐ€ ์ธํ’‹์„ ์น  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ํƒ€์ด๋จธ๋ฅผ ์žฌ์„ค์ •ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. value๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ์ด์ „ ์ธํ’‹ ๊ฐ’์— ์„ค์ •ํ•œ ํƒ€์ด๋จธ๋ฅผ ์ทจ์†Œํ•˜๊ณ  ๋‹ค์‹œ ์ƒˆ๋กœ์šด ์‹œ๊ฐ„์œผ๋กœ ํƒ€์ด๋จธ๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ๋ณธ๋ž˜ input๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ ํƒ€์ด๋จธ๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ํƒ€์ด๋จธ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ๋””๋ฐ”์šด์Šค๋œ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

๊ฒ€์ƒ‰ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ

export const SearchAutoComplete = () => {
const debouncedSearchInputValue = useDebounce(searchInputValue, 1000);
useEffect(() => {
getLazySearchList(); //api ํ˜ธ์ถœ
}, [debouncedSearchInputValue]);
return ํ…์ŠคํŠธํ•„๋“œ ์ปดํฌ๋„ŒํŠธ
}

 

 

์ปดํฌ๋„ŒํŠธ์—์„œ useEffect hook์„ ์‚ฌ์šฉํ•ด์„œ ๋””๋ฐ”์šด์‹ฑ๋œ ์ธํ’‹๋ฐธ๋ฅ˜๊ฐ’์ด ๋ณ€ํ•  ๋•Œ๋งˆ๋‹ค api ํ˜ธ์ถœ์„ ํ•œ๋‹ค.

์ด์ œ ๊ทธ๋Ÿผ input ๊ฐ’์ด ํ•œ ๊ธ€์ž ํ•œ ๊ธ€์ž ๋ณ€ํ•  ๋•Œ๋งˆ๋‹ค api๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์„ค์ •ํ•œ ์‹œ๊ฐ„์ด ๋๋‚˜๋ฉด ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋Š” ๋””๋ฐ”์šด์‹ฑ๋œ ๋ฐธ๋ฅ˜๊ฐ’์ด ๋ณ€ํ•  ๋•Œ๋งˆ๋‹ค api๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜์–ด ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

References
https://www.techtarget.com/whatis/definition/debouncing

 

What is debouncing? โ€“ TechTarget Definition

Explore debouncing -- using hardware/software to remove unwanted input noise from buttons/switches or other input function -- in hardware/programs/websites.

www.techtarget.com

 

https://velog.io/@sunhwa508/%ED%98%BC%EB%9E%80%ED%95%9C-%EB%94%94%EB%B0%94%EC%9A%B4%EC%8A%A4debounce%EC%99%80-%EC%8A%A4%EB%A1%9C%ED%8B%80throttle-%EC%B0%A8%EC%9D%B4

 

velog

 

velog.io

 

https://www.freecodecamp.org/korean/news/debounce-dibaunseu-javascripteseo-hamsureul-jiyeonsikineun-bangbeob-js-es6-yeje/

 

Debounce(๋””๋ฐ”์šด์Šค) - JavaScript์—์„œ ํ•จ์ˆ˜๋ฅผ ์ง€์—ฐ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ• (JS ES6 ์˜ˆ์ œ)

JavaScript์—์„œ debounce(๋””๋ฐ”์šด์Šค)๋Š” ์œ ์ €๊ฐ€ ์ž…๋ ฅํ•  ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ๋ฅผ ์˜ค์ง ํ•œ ๋ฒˆ์”ฉ๋งŒ ์‹คํ–‰๋˜๋„๋ก ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๋ฐ•์Šค์˜ ์ œ์•ˆ, ํ…์ŠคํŠธ ํ•„๋“œ์˜ ์ž๋™ ์ €์žฅ, ๋ฒ„ํŠผ์˜ ๋”๋ธ” ํด๋ฆญ์˜ ์ œ๊ฑฐ๊ฐ€ ๋ชจ๋‘ debou

www.freecodecamp.org

 

'React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

vite public html ํŒŒ์ผ iframe์œผ๋กœ ๋„์šฐ๊ธฐ  (0) 2024.02.21
Form ์ปดํฌ๋„ŒํŠธ์˜ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌํ•˜๊ธฐ - ์ „์ฒด input ์ƒํƒœ๊ฐ’์„ ํ•˜๋‚˜์˜ handler ํ•จ์ˆ˜๋กœ ๊ด€๋ฆฌ  (0) 2024.02.16
Typescript + React ์กฐ๊ฑด๋ถ€ props ์ „๋‹ฌํ•˜๊ธฐ - discriminated unions  (0) 2024.02.05
failed to resolve entry for package monorepo  (0) 2024.01.23
์žฌ๊ท€ํ•จ์ˆ˜ ๊ฒฐ๊ณผ๊ฐ’ useMemo๋กœ ์žฌ๋ Œ๋”๋ง ๋ฐฉ์ง€  (0) 2024.01.17
'React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • vite public html ํŒŒ์ผ iframe์œผ๋กœ ๋„์šฐ๊ธฐ
  • Form ์ปดํฌ๋„ŒํŠธ์˜ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌํ•˜๊ธฐ - ์ „์ฒด input ์ƒํƒœ๊ฐ’์„ ํ•˜๋‚˜์˜ handler ํ•จ์ˆ˜๋กœ ๊ด€๋ฆฌ
  • Typescript + React ์กฐ๊ฑด๋ถ€ props ์ „๋‹ฌํ•˜๊ธฐ - discriminated unions
  • failed to resolve entry for package monorepo
hana1203
hana1203
hana's lab ๐ŸŒฑhana1203 ๋‹˜์˜ ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
hana1203
hana's lab ๐ŸŒฑ
hana1203
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (91) N
    • React (38)
    • JavaScript (7)
    • Flutter (3)
    • Firebase (4)
    • Python (7)
    • Computer Science (6)
    • Problem Solving (3)
    • Git (5)
    • ํšŒ๊ณ  (10)
    • Etc (3)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ

๊ณต์ง€์‚ฌํ•ญ

์ „์ฒด
์˜ค๋Š˜
์–ด์ œ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • ์˜ค๋ธ”์™„
  • ํ‹ฐ์Šคํ† ๋ฆฌ์ฑŒ๋ฆฐ์ง€

์ตœ๊ทผ ๊ธ€

์ตœ๊ทผ ๋Œ“๊ธ€

hELLO ยท Designed By ์ •์ƒ์šฐ.v4.2.2
hana1203
debounce๋กœ ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰์–ด api ํ˜ธ์ถœ ์ค„์ด๊ธฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.