๐Ÿ’ป๐Ÿ’€/๊ฐœ๋ฐœ 27

[TS] ์œ ํ‹ธ๋ฆฌํ‹ฐ ํƒ€์ž…๋“ค

์ฐธ์กฐ(์ด๋ฏธ์ง€ ํฌํ•จ): Do You Really Know These 6 TypeScript Utilities? 1. Pick Pick์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฃผ์–ด์ง„ ํƒ€์ž…์—์„œ ์›ํ•˜๋Š” ํ‚ค๋“ค์„ ๊ณจ๋ผ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. interface User { id: number; firstName: string; lastName: string; age: number; phone: string; } type UserName = Pick; /* (์œ„์™€ ๋™์ผ) interface UserName { firstName: string; lastName: string; } */ const userName: UserName = { firstName: 'Gildong', lastName: 'Hong' } 2. ..

[React] ๋˜‘๋˜‘ํ•˜๊ฒŒ useMemo ์‚ฌ์šฉํ•˜๊ธฐ

์ฐธ์กฐ(์ด๋ฏธ์ง€ ํฌํ•จ): When to useCallback & useMemo hooks ? ์ด ๊ธ€์€ [React] ๋˜‘๋˜‘ํ•˜๊ฒŒ useCallback ์‚ฌ์šฉํ•˜๊ธฐ์—์„œ ์ด์–ด์ง€๋Š” ๊ธ€์ด๋‹ค. ๋ฆฌ์•กํŠธ์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ์™€ useCallback ํ›…์„ ์‚ฌ์šฉํ•ด ์ตœ์ ํ™” ํ•œ ์˜ˆ์‹œ๋ฅผ ๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด, ์œ„ ๊ธ€์„ ๋จผ์ € ๋ณด๊ณ  ์˜ค๊ธฐ๋ฅผ ์ถ”์ฒœํ•œ๋‹ค! useMemo๋ž€ useMemo๋Š” ์žฌ์‚ฌ์šฉ๋œ(memoized) ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ›…์ด๋‹ค. ์ด ํ›…์€ ๋ฐ์ดํ„ฐ์˜ ๋งŽ์€ ๊ฐ€๊ณต์ด ํ•„์š”ํ•  ๋•Œ ์ ํ•ฉํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ๋ณต์žกํ•œ ์ˆ˜ํ•™์  ๊ณ„์‚ฐ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋‚˜ ๊ณ„์‚ฐํ•˜๋Š”๋ฐ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๋กœ์ง์„ ๋‹ค๋ฃจ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ด์— ํ•ด๋‹น๋œ๋‹ค. ๋จผ์ € ์ด ํ•จ์ˆ˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ฒซ ๋ Œ๋” ๋•Œ ์‹คํ–‰๋˜๊ณ , ์ดํ›„ ๋ฆฌ๋ Œ๋”๊ฐ€ ๋  ๋•Œ๋งˆ๋‹ค ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ด ๋ณด์—ฌ์ค€๋‹ค. ๋งค๋ฒˆ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด์„œ ๋‚ด๋ถ€ ๋กœ์ง์„ ๋‹ค..

[JS] JavaScript์—์„œ HTML ์š”์†Œ๋ฅผ ๋งŒ๋“œ๋Š” 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•

์ด ๊ธ€์€ 3 Ways To Create HTML Element In JavaScript์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑ๋œ ๊ธ€์ž…๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋Š” DOM์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• 3๊ฐ€์ง€๋ฅผ ์•Œ์•„๋ณด์ž. Click Me! 1. createElement() ์‚ฌ์šฉํ•˜๊ธฐ ๋จผ์ € body์— app ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. const app = document.createElement('div'); app.id = 'app'; document.body.appendChild(div); ๊ทธ๋ฆฌ๊ณ  app์— button ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. const button = document.createElement('button'); button.id = 'button'; button.i..

[React] ๋˜‘๋˜‘ํ•˜๊ฒŒ useCallback ์‚ฌ์šฉํ•˜๊ธฐ

์ด ๊ธ€์€ When to useCallback & useMemo hooks ? ์˜ ๋ฒˆ์—ญ๊ธ€์ž…๋‹ˆ๋‹ค. (์ด๋ฏธ์ง€ ํฌํ•จ) ๊ฐœ๋ฐœ์ž์˜ ์ˆ™๋ช…, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ์„ฑ๋Šฅ ์ตœ์ ํ™”๋Š” ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๋ˆ„๊ตฌ๋“  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ ์ดํ›„ ๋งˆ์ฃผํ•˜๊ฒŒ ๋˜๋Š” ํ”ํ•œ ์ด์Šˆ์ด๋‹ค. ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ๋™์ž‘ํ–ˆ๋˜ ์‹œ์Šคํ…œ์ด ๋ฐฐํฌ ํ›„ ์šด์˜ ์‹œ์— ๋” ๋Š๋ ค์ง€๋Š” ๋Š๋‚Œ์ด ๋“œ๋Š” ๊ฑด ๋‹จ์ˆœํ•œ ์ฐฉ๊ฐ์ผ๊นŒ? ๊ฐœ๋ฐœ ๋ชจ๋“œ์ผ ๋•Œ ๋” ๋น ๋ฅด๊ฒŒ ๋Š๊ปด์ง€๋Š” ์ด์œ  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ฐœ๋ฐœ ๋ชจ๋“œ์ผ ๋•Œ๋Š” ๋ชจ๋“  ํŒŒ์ผ๋“ค์ด ๋กœ์ปฌ ๋จธ์‹  ์ฆ‰, ๋‚ด ์ปดํ“จํ„ฐ๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ ํฌํŠธ 3000๋ฒˆ(React ๊ธฐ์ค€)์— ํ˜ธ์ŠคํŒ…์ด ๋œ๋‹ค. ๋กœ์ปฌ์—์„œ ๊ฐœ๋ฐœ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธํ„ฐ๋„ท ์†๋„์— ๊ทธ๋‹ค์ง€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ๋ฒˆ๋“ค ํŒŒ์ผ๋“ค์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๋Š” ๊ฒƒ์€ ๊ต‰์žฅํžˆ ํšจ์œจ์ ์ด๋ฉฐ ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์šด์˜ ์‹œ์—๋Š” ์ธํ„ฐ๋„ท์ด ๊ต‰์žฅํžˆ ๋Š..

[TS] ๋นˆ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ํƒ€์ž…

{} ์„ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋นˆ ๊ฐ์ฒด์— {} ํƒ€์ž…์„ ์ง€์ •ํ•˜๋ฉด @typescript-eslint/ban-types ๊ฒฝ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. {} ํƒ€์ž…์€ null์ด ์•„๋‹Œ ๋ชจ๋“  ๊ฐ’์ด๋ผ๋Š” ๋œป์ด๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž…์„ ์ง€์ •ํ–ˆ์Œ์—๋„ ์ปดํŒŒ์ผ ๋•Œ ์ด ๊ฐ’์ด ๊ฐ์ฒด์ธ์ง€ ๋ญ”์ง€ ์•Œ ๋ฐฉ๋ฒ•์ด ์—†๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ตฌ์ฒด์ ์œผ๋กœ ํƒ€์ž…์„ ์ง€์ •ํ•ด์ค„ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ •๋ง๋กœ ๋นˆ ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ Record ํ”„๋กœํผํ‹ฐ ๊ฐ’์— never๋ฅผ ์ง€์ •ํ•จ์œผ๋กœ์จ ์–ด๋–ค ๊ฐ’๋„ ๋‹ด๊ธฐ์ง€ ์•Š์„ ๋นˆ ๊ฐ์ฒด์ž„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ Record ํ”„๋กœํผํ‹ฐ ๊ฐ’์— unknown์„ ์ง€์ •ํ•จ์œผ๋กœ์จ ๋ชจ๋“  ํƒ€์ž…์˜ ๊ฐ’์ด ํ• ๋‹น๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด์ž„์„ ๋ช…์‹œํ•ด์ค€๋‹ค. ๊ฐ’์ธ ๊ฒฝ์šฐ unknown ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ์–ด๋–ค ๊ฐ’์ด๋“  ํ• ๋‹น๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑธ ์˜๋ฏธํ•œ๋‹ค.

[react-youtube] videoId์— ๋”ฐ๋ผ ์˜์ƒ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์„ ๋•Œ

react-youtube react-youtube๋Š” YouTube IFrame Player API๋ฅผ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ์„œ ๊ตฌํ˜„ํ•œ ํŒจํ‚ค์ง€์ด๋‹ค. ์‚ฌ์šฉ๋ฒ•์€ ๋„ˆ๋ฌด๋‚˜ ๊ฐ„๋‹จํ•˜๋‹ˆ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์ž. videoId๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์˜์ƒ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค? ๋น ๋ฅด๊ฒŒ ์œ ํŠœ๋ธŒ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์„œ๋น„์Šค์— ํฌํ•จ์‹œํ‚ค๊ณ ์ž ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ๋ช‡ ๊ฐ€์ง€ ์ด์Šˆ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๊ทธ ์ค‘์— ํ•˜๋‚˜๋Š” props๋กœ ๋‚ด๋ ค๋ฐ›์€ videoId์— ๋”ฐ๋ผ ์˜์ƒ์ด ์—…๋ฐ์ดํŠธ ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฑฐ์˜€๋‹ค. ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ๊ณต์‹ ๋ฌธ์„œ์˜ ์˜ˆ์ œ๋ฅผ ๊ฐ€์ ธ์™”๋‹ค. ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” videoId๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด Example ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋” ๋˜๋ฉด์„œ ์˜์ƒ์ด ๋ณ€๊ฒฝ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์˜์ƒ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋‹ค! import YouTube from 'react-youtube'; functio..

[JS] ํด๋กœ์ €(Closure) ํ™œ์šฉํ•˜๊ธฐ

ํด๋กœ์ €๋ž€ ๋ฐ˜ํ™˜๋˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜์‹œํ‚จ ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜ ํ™˜๊ฒฝ์„ ๋ฌถ์–ด์„œ(closing) ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๋Š” ๊ฐœ๋…์„ ๋งํ•œ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋˜์–ด ์ฝœ ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋˜๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ˜ํ™˜๋œ ํ•จ์ˆ˜๋Š” ์ž์‹ ์„ ๋ฐ˜ํ™˜์‹œํ‚จ ํ•จ์ˆ˜๊ฐ€ ์ฝœ ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋˜์–ด๋„ ์—ฌ์ „ํžˆ ๊ทธ ์Šค์ฝ”ํ”„์— ์ ‘๊ทผํ•˜์—ฌ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ด๋Š” ๋ฐ˜ํ™˜๋œ ํ•จ์ˆ˜๋Š” ์ž์‹ ์ด ํ˜ธ์ถœ๋  ๋•Œ๊ฐ€ ์•„๋‹ˆ๋ผ ์„ ์–ธ๋  ๋•Œ์˜ ํ™˜๊ฒฝ(Lexical Environment)์„ ๊ธฐ์–ตํ•˜๊ณ  ํด๋กœ์ € ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— ์ฝœ ์Šคํƒ์— ๋ฐ˜ํ™˜์‹œํ‚จ ํ•จ์ˆ˜๊ฐ€ ์—†๋”๋ผ๋„ ์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ํ†ตํ•ด ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ์ด๋‹ค. // inner ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜์‹œํ‚ค๋Š” ํ•จ์ˆ˜ function outer() { const o..

[JS] ํ˜ธ์ด์ŠคํŒ…(Hoisting)

ํ˜ธ์ด์ŠคํŒ…์ด๋ž€ ์ฝ”๋“œ ์‹คํ–‰ ์ „์— ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜์˜ ์„ ์–ธ๋ฌธ์ด ํ•ด๋‹น ์Šค์ฝ”ํ”„์˜ ๊ฐ€์žฅ ์œ„๋กœ ๋Œ์–ด์˜ฌ๋ ค์ง€๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜๊ธฐ๋„ ์ด์ „์— ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜์ง€๋งŒ, ์ด๋Š” ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ… ์›๋ฆฌ ๋จผ์ € ๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ๋ณด๋ฉฐ ํ˜ธ์ด์ŠคํŒ…์ด ๋˜๋Š” ๊ณผ์ •์„ ์ดํ•ดํ•ด๋ณด์ž. console.log(amIHoisted); // undefined var amIHoisted = true; console.log(amIHoisted); // true ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ƒ๊ฐํ–ˆ์„ ๋•Œ ์ฒซ๋ฒˆ์งธ ์ค„์—์„œ ์—๋Ÿฌ๋ฅผ ๋ฟœ์–ด๋‚ด์•ผํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋‘๋ฒˆ์งธ ์ค„์˜ amIHoisted ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์ด ๊ฐ€์žฅ ์œ„๋กœ ํ˜ธ์ด์ŠคํŒ… ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š”..

[ESLint] import/order ๊ทœ์น™ ์„ค์ •ํ•˜๊ณ  ๋’ค์ฃฝ๋ฐ•์ฃฝ import ์ฝ”๋“œ ๊ฐœ์„ ํ•˜๊ธฐ

๊ฑฐ์Šฌ๋ฆฌ๋Š” import ์ฝ”๋“œ ๊ทธ๋™์•ˆ ๋‚˜๋ฆ„๋Œ€๋กœ์˜ ๊ทœ์น™์„ ๊ฐ€์ง€๊ณ  import ์ฝ”๋“œ๋ฅผ ์ตœ๋Œ€ํ•œ ๋ณด๊ธฐ ์ข‹๊ฒŒ ์ •๋ฆฌํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•œ ํŒŒ์ผ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ์ด ํ•œ ๋‘๊ฐœ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค๋ฒˆ ์ด๋ ‡๊ฒŒ ์ˆ˜์ž‘์—…์œผ๋กœ ์ผ์ผ์ด import ์ˆœ์„œ๋ฅผ ๋งž์ถฐ์ฃผ๋Š” ๊ฒŒ ์—ฌ๊ฐ„ ๊ท€์ฐฎ์€ ์ผ์ด ์•„๋‹ ์ˆ˜ ์—†์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„๋ฌด๋ฆฌ ์ž˜ ํ•œ๋‹ค๊ณ  ํ•ด๋„ ๋ชจ๋“  ํŒŒ์ผ์—์„œ ๋™์ผํ•œ ๊ทœ์น™์„ ๋”ฐ๋ฅด๊ธฐ๊ฐ€ ์‰ฝ์ง€ ์•Š์•˜๋‹ค. ๋”ฐ๋ผ์„œ ESLint๋กœ ๊ทœ์น™์„ ์ •ํ•˜๊ณ  ๊ฐ•์ œํ™” ํ•˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ–ˆ๋‹ค. ESLint์˜ eslint-plugin-import ESLint๋Š” eslint-plugin-import๋ฅผ ํ†ตํ•ด import/export ๊ตฌ๋ฌธ์˜ ๋ฆฐํŠธ๋ฅผ ์ง€์›ํ•œ๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ ๋‚˜๋Š” Webpack๊ณผ TypeScript๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ(alias)๋ฅผ ์„ค์ •ํ•ด๋†“๊ณ  ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์ ํŠธ์—..

[JS] ์ด๋ฒคํŠธ์˜ target๊ณผ currentTarget ์ฐจ์ด (with ๋ฒ„๋ธ”๋ง)

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ Event ๊ฐ์ฒด JavaScript์—์„œ๋Š” addEventListener() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด DOM ์š”์†Œ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค. ๋“ฑ๋ก๋œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ํ˜ธ์ถœ๋  ๋•Œ ์ž๋™์ ์œผ๋กœ Event ๊ฐ์ฒด๋ฅผ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค. ๋ณดํ†ต ์ž„์˜๋กœ e๋‚˜ event๋กœ ์ด๋ฆ„์ง€์–ด ์‚ฌ์šฉํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—ฌ๊ธฐ์— ํ•ด๋‹น๋œ๋‹ค. ์ด ์ด๋ฒคํŠธ ๊ฐ์ฒด๋Š” ์•ž์œผ๋กœ ๋‹ค๋ฃจ๊ฒŒ ๋  target, currentTaget๊ณผ ๊ฐ™์€ ํ”„๋กœํผํ‹ฐ์™€ stopPropagation()๊ณผ ๊ฐ™์€ ๋ฉ”์„œ๋“œ ๋“ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. const input = document.querySelector('.input'); // ํŒŒ๋ผ๋ฏธํ„ฐ๋ช…์€ ๊ผญ e๊ฐ€ ์•„๋‹ˆ์–ด๋„ ๋œ๋‹ค. const handleChange = (e) => { const { name, value } = e.ta..