๐Ÿ” ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค FE ๋ฐ๋ธŒ์ฝ”์Šค 5๊ธฐ TIL 231031 - 1101

Jun 2k (Jun2)ยท2023๋…„ 11์›” 1์ผ
1
post-thumbnail

๐Ÿ’ป Intro

ํ•œ ๊ณผ์ œ๊ฐ€ ๋๋‚˜๋ฉด ๋˜ ๋‹ค๋ฅธ ๊ณผ์ œ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
๋งˆ์น˜ ๋‚ด ์ฝ”๋“œ์˜ ์—๋Ÿฌ ๊ฐ™๋‹ค. ํ•˜๋‚˜ ํ•ด๊ฒฐํ•˜๋ฉด ํ•˜๋‚˜๊ฐ€ ๋‚˜์˜จ๋‹ค. (์•„๋ฉ”๋ฐ”์ธ๊ฐ€?)
์–ด์ œ ์˜ค๋Š˜์— ๊ฑธ์ณ ์˜ˆ์œ ๊ณ ์–‘์ด ์‚ฌ์ง„์ฒฉ๊ณผ ๊ณ ์–‘์ด ์‚ฌ์ง„ ๊ฒ€์ƒ‰๊ธฐ ๊ฐ•์˜๋ฅผ ๋“ค์—ˆ๋‹ค.
๊ณ ์–‘์ด ์‚ฌ์ง„์ฒฉ์—์„œ๋Š” ์ž๋™์™„์„ฑ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ api๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ–ˆ๊ณ 
๊ณ ์–‘์ด ์‚ฌ์ง„ ๊ฒ€์ƒ‰๊ธฐ์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์˜์กด์„ฑ์„ ์ƒ๊ฐํ•ด์„œ ๊ตฌํ˜„ํ•˜๋Š” ๋ฒ•๊ณผ ์ด๋ฒคํŠธ ๋””๋ฐ”์šด์‹ฑ์„ ๊ณ ๊ธ‰์Šค๋Ÿฝ๊ฒŒ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค.
์ด๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ƒˆ๋กœ ์•Œ๊ฒŒ ๋œ ์ ๊ณผ ์–ด๋ ค์› ๋˜ ๋ถ€๋ถ„์„ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.



๐Ÿง ์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์šด ๊ฒƒ

ํ—จ์ ค๊ณผ ๊ทธ๋ ˆํ…”์—์„œ ๋นต๋ถ€์Šค๋Ÿฌ๊ธฐ๋ฅผ ํ†ตํ•ด ์ž์‹ ์„ ์ฐพ์•„์˜ค๋Š” ๊ธธ์„ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์— ์œ ๋ž˜ํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์˜์–ด๋กœ ๋นต์Šค๋Ÿฌ๊ธฐ๋ฅผ ์˜๋ฏธํ•˜๋Š” Breadcrumb์ด๋ผ๊ณ  ์ด๋ฆ„ ์ง€์–ด์กŒ๋‹ค๊ณ  ํ•œ๋‹ค.

๋…ธ์…˜ ํ”„๋กœ์ ํŠธ ๊ณผ์ œ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ ๊ธฐ๋ณธ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์•„๋‹ˆ์—ˆ์ง€๋งŒ ๋‚œ ์ด๊ฑธ ๋ฏธ๋ฆฌ ๊ตฌํ˜„ํ–ˆ์—ˆ๋‹ค. ์ „์ฒด ๋ฌธ์„œ ์ •๋ณด๋ฅผ api๋กœ ๋ฐ›์•„์˜ค๊ณ  ์ด๋ฅผ ์žฌ๊ท€ ํƒ์ƒ‰์„ ํ†ตํ•ด header ๋ถ€๋ถ„์— ํ‘œ์‹œํ–ˆ์—ˆ๋‹ค.

์ด๊ฒƒ์„ ๋ฐฐ์šฐ๊ฒŒ ๋  ์ค„ ์•Œ๊ณ  ๊ตฌํ˜„ํ–ˆ๋˜ ๊ฑด ์•„๋‹Œ๋ฐ ์—ญ์‹œ ๋ชจ๋“  ์„œ๋น„์Šค๋‚˜ ์›น ํŽ˜์ด์ง€์—๋Š” ๊ณตํ†ต์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์ด๋‚˜ ๊ธฐ๋ฒ•๋“ค์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.
๊ทธ๋ž˜์„œ ๋ญ๋“  ํ•œ ๋ฒˆ ๋ฐฐ์šธ ๋•Œ ์ œ๋Œ€๋กœ ์•Œ์•„๋‘๋ฉด ์–ธ์ œ๋“  ์“ธ ๋•Œ๊ฐ€ ์žˆ๋Š” ๊ฑฐ ๊ฐ™๋‹ค. (์œ ๋น„๋ฌดํ™˜)

// render ํ•จ์ˆ˜ ๋‚ด
$breadcrumb.innerHTML = `
	<div class="BreadCrumb__item">Root</div>
        ${this.state
          .map(
            ({ id, name }) => `
            <div class="BreadCrumb__item" data-id="${id}">${name}</div>
        `
          )
          .join('')}
    `;

this.state๋Š” ์œ„์™€ ๊ฐ™์ด ํ•ด๋‹น ๊ฒฝ๋กœ๋ฅผ ๋ฐ›์•„์˜จ๋‹ค.
์ด๋ฅผ mapํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด divํƒœ๊ทธ๋กœ ๋‚˜์—ดํ•ด์„œ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

๋…ธ์…˜ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” api ์ธก์—์„œ state๋ฅผ ์ด๋ ‡๊ฒŒ ์ œ๊ณตํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์„œ ์ „์ฒด ํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•œ ์‚ฌ์ด๋“œ๋ฐ”์—์„œ ์œ„์™€ ๊ฐ™์€ state๋ฅผ ์ž์ฒด์ ์œผ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.

api ์ธก์—์„œ ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ ค์ฃผ๋А๋ƒ์— ๋”ฐ๋ผ breadcrumb์„ ๊ตฌํ˜„ํ•˜๋Š” ๋‚œ์ด๋„๊ฐ€ ์ด๋ ‡๊ฒŒ ๋‹ค๋ฅผ ์ค„์ด์•ผ... ๋ฐฑ์—”๋“œ์™€์˜ ํ˜‘์—…์—์„œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ ๋ฉด๋ฐ€ํžˆ ์–˜๊ธฐํ•ด๋ด์•ผ ํ•œ๋‹ค๋Š” ๋กœํ†  ๊ฐ•์‚ฌ๋‹˜์˜ ๋ง์”€์„ ๋ผˆ์ €๋ฆฌ๊ฒŒ ๊นจ๋‹ฌ์•˜๋‹ค.

๊ฐ๊ฐ์˜ ๊ฒฝ๋กœ ์š”์†Œ์— data-id๋ฅผ ๋ถ€์—ฌํ•ด์„œ click ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๊ฒŒ ํ•œ ๊ฒƒ๋„ ์ธ์ƒ์ ์ด์—ˆ๋‹ค.

๋‚ด ๋…ธ์…˜ ํ”„๋กœ์ ํŠธ์—๋„ ๋™์ผํ•˜๊ฒŒ ํด๋ฆญ ์ด๋ฒคํŠธ์™€ ๋ผ์šฐํŒ…์„ ํ†ตํ•ด ๊ตฌํ˜„ํ•ด์•ผ๊ฒ ๋‹ค. (์†”์งํžˆ ์ƒ๊ฐ์€ ํ–ˆ์—ˆ๋Š”๋ฐ ์‹œ๊ฐ„์ด ๋ถ€์กฑํ•ด์„œ ๊ตฌํ˜„ ๋ชปํ–ˆ๋‹ค...)


Loading ํ™”๋ฉด ๊ตฌํ˜„

api์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๋™์•ˆ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ”๋ณด๋˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋กœ๋”ฉ ์ค‘์— ๋Œ€ํ•œ UI ๊ตฌํ˜„์ด ํ•„์ˆ˜์ด๋‹ค. (๊ทผ๋ฐ ๋‚œ ๋…ธ์…˜ ํ”„๋กœ์ ํŠธ ๋•Œ ์•ˆํ–ˆ์ง€?)

๊ฐ™์€ ํŒ€์›์ธ ์„์ฃผ๋‹˜์€ ๊ตฌํ˜„์„ ํ•˜์…จ์–ด์„œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋•Œ ๋‚œ ์™œ ์ด๊ฑธ ์ƒ๊ฐ ๋ชปํ–ˆ์ง€? ๋ผ๋Š” ์ƒ๊ฐ์„ ํ–ˆ์—ˆ๋‹ค. ์•ž์œผ๋กœ๋Š” ํ•„์ˆ˜์ ์œผ๋กœ ๊ตฌํ˜„์„ ํ•ด์•ผ๊ฒ ๋‹ค๋ผ๊ณ  ๋‹ค์งํ–ˆ๋‹ค.

๋กœ๋”ฉ ํ™”๋ฉด ๊ตฌํ˜„์€ ์–ด๋ ค์šด ๊ฒƒ์€ ์—†๋‹ค.
๋กœ๋”ฉ ์ค‘์ผ ๋•Œ ๋ณด์—ฌ์ค„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•ด๋†“๊ณ  ๋กœ๋”ฉ์ค‘์ผ ๋•Œ display ์†์„ฑ์„ none์—์„œ block์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

// ๊ฐ„๋‹จํ•˜๊ฒŒ img gif ์‚ฝ์ž…
$loading.innerHTML = `
  <div class="content">
    <img width="100%" src="https://cdn.roto.codes/images/nyan-cat.gif" alt="Loading..." />
  </div>
`;
// this.state์—์„œ isLoading ์—ฌ๋ถ€์— ๋”ฐ๋ผ display ์†์„ฑ ๋ณ€๊ฒฝ
$loading.style.display = this.state ? 'block' : 'none';

์š”๋ ‡๊ฒŒ ๋กœ๋”ฉ ์ค‘์ผ ๋•Œ ๊ท€์—ฌ์šด ๊ณ ์–‘์ด gif๊ฐ€ ๋‚˜์˜ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ง€๋ฃจํ•˜์ง€๊ฐ€ ์•Š๋‹ค.


keyup ์ด๋ฒคํŠธ e.key

๋…ธ์…˜ ์—๋””ํ„ฐ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ enter, ๋ฐฑ์ŠคํŽ˜์ด์Šค, ํ™”์‚ดํ‘œ ํ‚ค์— ๋Œ€ํ•œ keyup ์ด๋ฒคํŠธ๋ฅผ e.keyCode๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ–ˆ์—ˆ๋‹ค.

๊ฐ™์€ ํŒ€์›์ธ ์˜ˆ์ง„๋‹˜์˜ ์นผ๊ฐ™์€ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์—์„œ keyCode๋Š” Deprecated๋œ ์†์„ฑ๊ฐ’์ด๋ผ๋Š” ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•˜๋‹ค. (๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค)
์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ทจ์†Œ์„ ์ด ๊ทธ์–ด์ ธ์„œ ์ด ๋ถ€๋ถ„์„ ์ธ์ง€ํ•˜๊ณ  ์žˆ์—ˆ์œผ๋‚˜ ์ผ๋‹จ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์— ๊ธ‰๊ธ‰ํ–ˆ์–ด์„œ ๊ทธ๋ƒฅ ์ง„ํ–‰ํ–ˆ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋ฒˆ ๋กœํ† ๋‹˜ ๊ฐ•์˜์—์„œ e.key๋ผ๋Š” ์†์„ฑ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

window.addEventListener('keyup', (e) => {
  // esc๋ฅผ ๋ˆ„๋ฅผ ๊ฒฝ์šฐ onClose
  if (e.key === 'Escape') {
    onClose();
  }
});

esc๋ฅผ ๋ˆ„๋ฅด๊ฒŒ ๋˜๋ฉด ๊ณ ์–‘์ด ์‚ฌ์ง„ ๋ชจ๋‹ฌ์ฐฝ์„ ๋‹ซ๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.
esc์˜ e.key๊ฐ’์€ Escape์ด๋ฏ€๋กœ ์œ„์™€ ๊ฐ™์ด ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์•ž์œผ๋กœ ๋‹ค์–‘ํ•œ ํ‚ค์˜ e.key ๊ฐ’์€ console.log๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด๊ฐ€๋ฉด์„œ ๊ตฌํ˜„ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

๋…ธ์…˜ ํ”„๋กœ์ ํŠธ์—์„œ ํ”ผ๋“œ๋ฐฑ ๋ฐ›์€ ๋ถ€๋ถ„๋„ ์ด๋ ‡๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ๊ฒ ๋‹ค.


setState ํ•จ์ˆ˜์˜ ์ „์—ญ State ๊ด€๋ฆฌ

๋‚ด ๋…ธ์…˜ ํ”„๋กœ์ ํŠธ์˜ App ์ปดํฌ๋„ŒํŠธ์˜ setState ๋ชจ์Šต์ด๋‹ค.

this.render ํ•จ์ˆ˜๋Š” ์™œ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๊ฑธ๊นŒ...
App์—์„œ์˜ setState ํ•จ์ˆ˜๋Š” ์ „์—ญ์  ์ƒํƒœ ๊ด€๋ฆฌ๋งŒ ํ•˜๊ณ  ๊ฐ ์ตœํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ๋‹จ์˜ setState์—์„œ ์˜์กด์„ฑ์ด ์—†๊ฒŒ ๋…๋ฆฝ์ ์œผ๋กœ render๋ฅผ ์ง„ํ–‰ํ•ด์•ผ ํ•˜๋Š”๋ฐ ๋‚œ ๊ทธ๋Ÿฌ์ง€ ์•Š์•˜๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์—์„œ ๋น„ํšจ์œจ์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ๋กœ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ง€์ ๋ฐ›์•˜๋‹ค.
๊ตฌํ˜„์—๋งŒ ๊ธ‰๊ธ‰ํ•˜๋‹ค ๋ณด๋‹ˆ ์ „์ฒด์ ์ธ ์ƒํƒœ flow ๋ฐ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์˜์กด์„ฑ์„ ์—†์• ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ๋ฌธ์ œ์˜€๋‹ค.

App.js ์—์„œ๋Š” ์ „์—ญ์ ์œผ๋กœ ํฐ ๋‹จ์œ„์˜ ์ƒํƒœ๋งŒ ๋‹ค๋ฃจ๊ณ  ์„ธ๋ถ€์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ์ „์—ญ ์ƒํƒœ์—์„œ ํ•„์š”ํ•œ ์ƒํƒœ ์š”์†Œ๋งŒ ๋ฝ‘์•„์„œ ์ƒํƒœ๋ฅผ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค.

๋…ธ์…˜ ํ”„๋กœ์ ํŠธ ๊ตฌํ˜„ ์‹œ ์ด๋ฅผ ์ƒ๊ฐ์„ ์•„์˜ˆ ํ•˜์ง€ ์•Š์€ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ์ƒ๊ฐ๋ณด๋‹ค ๋” ์ฒ ์ €ํ•˜๊ฒŒ ๊ณ ๋ คํ•ด์•ผ ์ƒํƒœ ์ตœ์ ํ™”๊ฐ€ ๋˜๋Š” ๊ฒƒ์ž„์„ ๊นจ๋‹ฌ์•˜๋‹ค.

์ฝ”๋“œ ๋ฆฌ๋ทฐ์— ๋Œ€ํ•œ ๋ฆฌํŒฉํ† ๋ง์—์„œ ์ƒํƒœ๋ฅผ ์ „์ฒด์ ์œผ๋กœ ์ ๊ฒ€ํ•˜๊ณ  ์•ž์œผ๋กœ ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ๋„ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๊ตฌ์กฐ ๋ฐ ์ƒํƒœ ๋กœ๋“œ๋งต์„ ๊ผญ ๊ตฌ์ฒดํ™”ํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์—ฌ์•ผ๊ฒ ๋‹ค.


์ด๋ฒคํŠธ ๋””๋ฐ”์šด์‹ฑ feat. ์ฝ”ํŒŒ์ผ๋Ÿฟ

์ž๋™์™„์„ฑ ๊ฒ€์ƒ‰ ์‹œ keyup ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ํ•œ ๊ธ€์ž๊ฐ€ ์ž…๋ ฅ๋  ๋•Œ๋งˆ๋‹ค api ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๋””๋ฐ”์šด์‹ฑ์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ–ˆ๋‹ค.

์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋กœํ†  ๊ฐ•์‚ฌ๋‹˜์ด ์ฝ”ํŒŒ์ผ๋Ÿฟ์„ ํ†ตํ•ด ์ถ”์ฒœ๋œ debounce ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์…จ๋‹ค.

// fn ํ•จ์ˆ˜๋ฅผ delay๋งŒํผ ๋””๋ฐ”์šด์‹ฑํ•˜๋Š” ํ•จ์ˆ˜ feat. ์ฝ”ํŒŒ์ผ๋Ÿฟ
export default function debounce(fn, delay) {
  let timer = null;
  return function () {
    const context = this;
    const args = arguments;
    clearTimeout(timer);
    timer = setTimeout(() => {
      fn.apply(context, args);
    }, delay);
  };
}

์ฒ˜์Œ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ์ด๊ฒŒ ๋ญ๋ˆ„... ํ–ˆ๋‹ค. ์ง„์งœ๋กœ ai๋Š” ๋ชปํ•˜๋Š”๊ฒŒ ๋ญ์ง€?

์ƒˆ๋กœ ์•Œ๊ฒŒ ๋œ argument ๊ฐ์ฒด์™€ ๊ฐ‘ํˆญํŠ€ํ•œ this์™€ apply ํ•จ์ˆ˜์˜ ์‚ผ์œ„์ผ์ฒด์— ์ •์‹ ์„ ๋ชป ์ฐจ๋ ธ๋‹ค.


๋Ÿฌํ”„ํ•˜๊ฒŒ ์ดํ•ดํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋ฐ›์€ fn ํ•จ์ˆ˜๋ฅผ
fn ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•˜๋Š” ์ปจํ…์ŠคํŠธ๋ฅผ const context = this;๋ฅผ ํ†ตํ•ด ๋ฐ›์•„์˜ค๊ณ 
fn ํ•จ์ˆ˜๊ฐ€ ๋ฐ›๋Š” ์ธ์ž๋ฅผ const args = arguments;๋ฅผ ํ†ตํ•ด ๋ฐ›์•„์™€์„œ
apply ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด fn์„ ์ƒˆ๋กœ์šด context ํ™˜๊ฒฝ์—์„œ args ์ธ์ž๋ฅผ ํ†ตํ•ด ํ˜ธ์ถœํ•˜๋Š”๋ฐ
delay ๊ฐ’๋งŒํผ setTimeout๋ฅผ ํ†ตํ•ด ๋””๋ฐ”์šด์‹ฑ์„ ์ ์šฉํ•œ๋‹ค.


ํ•˜์ง€๋งŒ ์•„์ง argument ๊ฐ์ฒด์™€ apply ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์•˜๊ณ 
this๋ฅผ ์ถœ๋ ฅํ•ด๋ณธ ๊ฒฐ๊ณผ undefined๊ฐ€ ๋‚˜์™”๋Š”๋ฐ ์™œ ์ด๋ ‡๊ฒŒ ๋‚˜์˜ค๋Š”์ง€๋„ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์•˜๋‹ค.

ํŒ€์›๋“ค๊ณผ ์Šคํฌ๋Ÿผ์—์„œ ์ด์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•ด๋ณด์•˜์ง€๋งŒ ๋ช…์พŒํ•œ ํ™•๋‹ต์„ ์–ป์ง€ ๋ชปํ•˜์˜€๋‹ค.

๋กœํ†  ๊ฐ•์‚ฌ๋‹˜๊ป˜ ์งˆ๋ฌธ์„ ๋“œ๋ฆฐ ๋’ค ์ด์— ๋Œ€ํ•œ ์ •๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ๊ฒ ๋‹ค.



๐Ÿ™„ ๋” ๊ณต๋ถ€ํ•ด์•ผ ํ•  ๊ฒƒ

argument ๊ฐ์ฒด

์ด๋ฒคํŠธ ๋””๋ฐ”์šด์‹ฑ debounce ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ๋œ argument ๊ฐ์ฒด์— ๋Œ€ํ•œ mdn ๋ฌธ์„œ๋ฅผ ์ฝ๊ณ  ํ™œ์šฉ๋ฒ•์ด๋‚˜ ๊ฐœ๋…์— ๋Œ€ํ•œ ์ •์˜๋ฅผ ํ™•๋ฆฝํ•ด์•ผ๊ฒ ๋‹ค.

apply ํ•จ์ˆ˜

์ฝ”๋”ฉํ…Œ์ŠคํŠธ์—์„œ ์งง์€ ํ•ด๋‹ต ์ฝ”๋“œ์— ๋งŽ์ด ๋ณด์ด๋Š” apply ํ•จ์ˆ˜์˜€๋‹ค. ์ž˜ ์‚ฌ์šฉํ•˜๋ฉด ์ง„์งœ ์ข‹๋‹ค๊ณ  ๋“ค์€ ๊ณ ์ฐจํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ๋“ค์—ˆ๋‹ค. ์ด๊ฒƒ๋„ mdn ๋ฌธ์„œ ๋ฐ ๋‹ค์–‘ํ•œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ฐพ์•„๋ณด๊ณ  ์ •๋ฆฌํ•ด์•ผ๊ฒ ๋‹ค.



๐Ÿ‘€ ๋А๋‚€์ 

๐Ÿ‘ Keep

  • ์ด์ „์— ์ง„ํ–‰ํ–ˆ๋˜ ๋…ธ์…˜ ํ”„๋กœ์ ํŠธ ๊ณผ์ œ์™€ ์—ฐ๊ฒฐ๋˜๋Š” ๋ถ€๋ถ„์ด ๋งŽ์•˜๋‹ค. ๋…ธ์…˜ ๊ณผ์ œ๋ฅผ ๊ณจ๋จธ๋ฆฌ ์จ๊ฐ€๋ฉฐ ์—ด์‹ฌํžˆ ์ง„ํ–‰ํ•˜๊ณ  ์ถ”๊ฐ€์ ์œผ๋กœ breadcrumb ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋˜ ๊ฒƒ๋„ ์ž˜ํ•œ ์ผ์ด๋‹ค!

๐Ÿ˜ฑ Problem

  • debounce ํ•จ์ˆ˜๋ฅผ ์•„์ง ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋‚จ๊ฒจ๋†”์„œ ์ฐ์ฐํ•˜๋‹ค.
  • ์•„์ง App.js ๋ฐ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์˜์กด์„ฑ ์ œ๊ฑฐ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๊น”๋”ํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ๋…ธ์…˜ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์—์„œ๋„ ์ด์— ๋Œ€ํ•œ ํ—ˆ์ ์ด ๋งŽ์ด ๋ณด์ธ๋‹ค.

๐Ÿ˜œ Try

  • ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์˜์กด์„ฑ ์ œ๊ฑฐ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ๊ณต๋ถ€๋ฅผ ๋” ํ•ด์•ผ๊ฒ ๋‹ค.
  • ์š”์ƒˆ๋Š” ํ™˜์ ˆ๊ธฐ์ธ๋ฐ๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ˆ˜๋ฉด๊ณผ ์ƒํ™œ ๋ฆฌ๋“ฌ์„ ๊ทœ์น™์ ์œผ๋กœ ํ•ด์„œ ๊ฑด๊ฐ• ์ƒํƒœ๊ฐ€ ์ข‹๋‹ค. ์œ ์ง€ํ•˜์ž.
  • apply ํ•จ์ˆ˜์™€ argument ๊ฐ์ฒด์— ๋Œ€ํ•ด์„œ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์ •๋… ๋ฐ ์ •๋ฆฌ๋ฅผ ํ•ด์•ผ๊ฒ ๋‹ค.


๐Ÿ˜… ํ•ด๋‹น ๋‚ด์šฉ์€ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด๋‚˜ ์˜คํ•ดํ•˜๊ณ  ์žˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ํ”ผ๋“œ๋ฐฑ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ์ค€๋น„์ค‘...

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2023๋…„ 11์›” 1์ผ

์˜ ํํŠธ

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ