[๊ณผ์ œ] ๐Ÿ“ Simple To-do List ๋งŒ๋“ค๊ธฐ ํšŒ๊ณ 

์ˆ˜์—ฐยท2023๋…„ 6์›” 21์ผ
3

Dev-Course

๋ชฉ๋ก ๋ณด๊ธฐ
1/10
post-thumbnail

1. ์„œ๋ก 


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

๋‹ค๋งŒ ์ด๋ฒˆ์—” ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ class ํ˜•์œผ๋กœ ๋งŒ๋“ค์–ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

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

2. ์ง„ํ–‰


2-1. ๊ณ„ํš ์งœ๊ธฐ

README.md ์— ๊ตฌํ˜„ํ•  ๊ธฐ๋Šฅ๊ณผ ๊ณ„ํš ์ ์—ˆ๋‹ค. ์ „์ฒด์ ์ธ ๊ณ„ํš์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. ๊ธฐ๋Šฅ ํ•˜๋‚˜์”ฉ ๊ตฌํ˜„ํ•˜๊ธฐ
2. ๋ฆฌํŒฉํ† ๋ง ์ง„ํ–‰ํ•˜๊ธฐ
3. ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ•˜๊ธฐ
4. CSS ๊พธ๋ฏธ๊ธฐ
5. ๊ณผ์ œ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ๊ฒ€ํ† ํ•˜๊ธฐ

๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋‹ค ๋ณด๋ฉด ์ง€๊ธˆ ๋‚ด๊ฐ€ ์–ด๋–ค ๊ฑธ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š”์ง€, ์ „์ฒด์ ์ธ ํ๋ฆ„์ด ์–ด๋””์ฏค์ธ์ง€ ๊นŒ๋จน๊ณค ํ•ด์„œ ์ „์ฒด์ ์ธ ๊ณ„ํš๊ณผ, ์ปดํฌ๋„ŒํŠธ๋ณ„ ๊ตฌํ˜„ ๊ธฐ๋Šฅ์„ ์šฐ์„  ์ž‘์„ฑํ–ˆ๋‹ค.

์ง€๋‚œ ๊นƒํ—ˆ๋ธŒ ํŠน๊ฐ•๋•Œ ๋ฐฐ์› ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ํ•˜๋‚˜์˜ ๋ณ€ํ™”๋ฅผ ์ปค๋ฐ‹์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด, ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ์ปค๋ฐ‹์˜ ํ๋ฆ„๋Œ€๋กœ ๊ณ„ํš์„ ์ž‘์„ฑํ–ˆ๋‹ค.

TodoForm ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋Šฅ ๋ชฉ๋ก

2-2. ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

์ปดํฌ๋„ŒํŠธ ๋ณ„๋กœ ํ•˜๋‚˜์”ฉ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด ๋‚˜๊ฐ”๋‹ค. ๊ตฌํ˜„์„ ์™„๋ฃŒํ•˜๊ณ  ๋ณด๋‹ˆ ์–ด๋ ค์šด ๋กœ์ง์ด ์•„๋‹Œ๋ฐ, ์•„๋ž˜ ํšŒ๊ณ ์—์„œ ์ž‘์„ฑํ•  ๋ฌธ์ œ๋“ค๋กœ ์ธํ•ด ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค.

๊ฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•˜๋Š” ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1. Header
๊ณผ์ œ์˜ ์ œ๋ชฉ์„ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ.
Header ์ปดํฌ๋„ŒํŠธ ๋ชจ์Šต

2. TodoForm
์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ํˆฌ๋‘๋ฆฌ์ŠคํŠธ๋ฅผ ์ž…๋ ฅ ๋ฐ›๋Š” ์ปดํฌ๋„ŒํŠธ.
TodoForm ์ปดํฌ๋„ŒํŠธ ๋ชจ์Šต

3. TodoList
ํˆฌ๋‘๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ. ์™„๋ฃŒ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๊ธ€์ž ์œ„์— ์„ ์ด ๊ทธ์–ด์ง€๊ณ , ์‚ญ์ œ๋ฅผ ๋ˆ„๋ฅด๋ฉด ํˆฌ๋‘๋ฆฌ์ŠคํŠธ๊ฐ€ ์‚ญ์ œ๋œ๋‹ค.
TodoList ์ปดํฌ๋„ŒํŠธ ๋ชจ์Šต

4. TodoCount
์™„๋ฃŒ๋œ ๋ฆฌ์ŠคํŠธ - ํ˜„์žฌ ์ด ํˆฌ๋‘ ๋ฆฌ์ŠคํŠธ ๊ฐœ์ˆ˜๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ

2-3. ๋ฆฌํŒฉํ† ๋งํ•˜๊ธฐ

๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•œ ๋’ค์—” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ์ค€์œผ๋กœ ๋ฆฌํŒฉํ† ๋ง์„ ์ง„ํ–‰ํ–ˆ๋‹ค.

  1. ๋ณ€์ˆ˜๋ช…์„ ์˜๋ฏธ ์žˆ๊ฒŒ ์ง€์—ˆ๋Š”๊ฐ€?
  2. ๋กœ์ง์ด ํšจ์œจ์ ์ด๊ณ  ์˜ฌ๋ฐ”๋ฅธ๊ฐ€?
  3. ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด์žˆ๋Š”๊ฐ€?
  4. ๊ณผ์ œ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•˜๋Š”๊ฐ€?
  5. ์ง€๋‚œ์ฃผ์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ์ด๋ฒˆ ๊ณผ์ œ์—๋„ ๋ฐ˜์˜ํ•˜์ž!

2-4. ์ „์ฒด ๊ตฌ์กฐ

1. App ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ๋“ค์„ ๊ด€๋ฆฌํ•œ๋‹ค.
state ๋„ App ์—์„œ ๊ด€๋ฆฌํ•˜๊ณ , state ๋ณ€ํ™”๋ฅผ App ์—์„œ ๊ฐ์ง€ํ•˜๋ฉด ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— ํ•ด๋‹น ๋ณ€ํ™”๋ฅผ ์ „ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค.

2. ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์™€ ๊ด€๋ จ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๋Š” ์ „์—ญ ๋ฉ”์„œ๋“œ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋”ฐ๋กœ class ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

2-5. ๋™์ž‘ ๋ฐฉ์‹

1. ํŽ˜์ด์ง€ ๋กœ๋”ฉ

ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์‹œ Storage ์— ๊ธฐ์กด์— ์ €์žฅํ•œ state ๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
์ฒซ๋ฒˆ์งธ ๋™์ž‘ - ํŽ˜์ด์ง€ ๋กœ๋”ฉ

// App ์ปดํฌ๋„ŒํŠธ
export default class App {
  constructor(target) {
    this.lists = StorageHandler.getCurrLists();
  }
}
// StorageHandler ํด๋ž˜์Šค
export default class StorageHandler {
  static getCurrLists = () => {
    try {
      const currLists = JSON.parse(localStorage.getItem('lists'));
      
      return currLists === null ? [] : currLists;
    } catch (error) {
      console.log(error.message);
    }
  }
}

2. ํŽ˜์ด์ง€ ์ดˆ๊ธฐ ๋ Œ๋”๋ง

์ดˆ๊ธฐ์— ๋ฐ›์€ state ๋ฅผ ํ†ตํ•ด ์ „์ฒด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค. ์ด๋•Œ state(ํˆฌ๋‘๋ฆฌ์ŠคํŠธ ๋ชฉ๋ก)๊ฐ€ ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋Š” TodoList ์ปดํฌ๋„ŒํŠธ, TodoCount ์ปดํฌ๋„ŒํŠธ๋‹ค.
๋‘๋ฒˆ์งธ ๋™์ž‘ - ํŽ˜์ด์ง€ ๋ Œ๋”๋ง

export default class App {
  constructor(target) {
    this.lists = StorageHandler.getCurrLists();
    this.header = new Header(target);
    this.todoForm = new TodoForm(target, this.onSubmit);
    this.todoLists = new TodoLists(target, this.lists, this.onChange);
    this.todoCount = new TodoCount(target, this.lists);
  }
}

์ด๋•Œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ TodoForm ๊ณผ TodoList ์—์„  state ์˜ ๋ณ€๊ฒฝ๊ณผ ๊ด€๋ จ๋œ ์ด๋ฒคํŠธ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ state ๋ณ€๊ฒฝ ๊ฐ์ง€ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ App ์—์„œ state ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , App ์ด state ๊ฐ€ ๋ณ€๊ฒฝ๋จ์„ ๊ฐ์ง€ํ•˜๋ฉด state ์—…๋ฐ์ดํŠธ ํ›„ state ๋ฅผ ๋ฐ›๋Š” ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ ๋“ค์„ ์ƒˆ๋กœ ๊ทธ๋ ค์ฃผ๋ฉด ๋œ๋‹ค.

state ๋ณ€๊ฒฝ ๊ฐ์ง€ ์ „๋‹ฌ

onSubmit = (newList) => {
  const newLists = [...this.lists, newList];

  this.setLists(newLists);
};

onChange = (newLists) => {
  this.setLists(newLists);
};

3. state ๋ณ€๊ฒฝ ์‹œ ํŽ˜์ด์ง€ ๋ฆฌ๋ Œ๋”๋ง

App ์ปดํฌ๋„ŒํŠธ์—์„œ state ๊ฐ€ ๋ณ€๊ฒฝ๋จ์— ๋”ฐ๋ผ todoList์™€ todoCount์— ์ „๋‹ฌํ•ด์ค€๋‹ค.

์„ธ๋ฒˆ์งธ ๋™์ž‘ - ํŽ˜์ด์ง€ ๋ฆฌ๋ Œ๋”๋ง

// App ์ปดํฌ๋„ŒํŠธ
setLists = (newLists) => {
  if (newLists.every(element => 'content' in element && 'isCompleted' in element)) {
    this.lists = newLists;
    this.todoLists.setLists(this.lists);
    this.todoCount.setLists(this.lists);
  }
};
// TodoList, TodoCount
setLists = (changedLists) => {
  this.lists = changedLists;
  this.render();
}

๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์—๋„ ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์„ ๋ฐ”๋กœ ์ €์žฅํ•œ๋‹ค.

๋„ค๋ฒˆ์งธ ๋™์ž‘ - ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€ ์ €์žฅ

// App
setLists = (newLists) => {
  if (newLists.every(element => 'content' in element && 'isCompleted' in element)) {
    this.lists = newLists;
    this.todoLists.setLists(this.lists);
    this.todoCount.setLists(this.lists);
    StorageHandler.saveLists(this.lists);
  }
};
// StorageHandler
static saveLists = (newLists) => {
  try {
    localStorage.setItem('lists', JSON.stringify(newLists));
  } catch (error) {
    console.log(error.message);
  }
}

3. ํšŒ๊ณ 


3-1. ์•„์‰ฌ์šด ์ 

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋“ค๋กœ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์žˆ์–ด ์• ๋ฅผ ๋งŽ์ด ๋จน์—ˆ๋‹ค.

1. state ๊ด€๋ฆฌ๋ฅผ ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜๋‹ค.

์ปดํฌ๋„ŒํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ์ง€ ๋Œ€๋žต์ ์ธ ๊ฐ์€ ์žก์•˜์ง€๋งŒ state ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ• ์ง€๋ฅผ ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ  ๋ฌดํ„ฑ๋Œ€๊ณ  ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ์ง„ํ–‰ํ–ˆ๋‹ค. state ์™€ ๊ด€๋ จ๋œ ๋กœ์ง์„ ์ž‘์„ฑํ•  ๋•Œ๋งˆ๋‹ค ํŒŒ์ผ ์ „์ฒด๋ฅผ ์ˆ˜์ •ํ•˜๊ณ , ์„ค๊ณ„๋ฅผ ๋˜์งš์–ด๋ณด๊ธธ ์ˆ˜์ฐจ๋ก€ ๋ฐ˜๋ณตํ–ˆ๋‹ค.

์ฒ˜์Œ๋ถ€ํ„ฐ App ์—์„œ state ๋ฅผ ๊ด€๋ฆฌํ•  ๊ฒƒ์ธ์ง€, ์•„๋‹ˆ๋ฉด ์–ด๋Š์ •๋„ ์ปดํฌ๋„ŒํŠธ ๋ผ๋ฆฌ ์˜์กด์„ฑ์„ ๋‘˜ ๊ฒƒ์ธ์ง€๋ฅผ ์ƒ๊ฐํ–ˆ์–ด์•ผ ํ–ˆ๋Š”๋ฐ... ๊ทธ๋Ÿฌ์ง€ ๋ชปํ•˜๊ณ  ๊ณ„์† ๊ฐˆํŒก์งˆํŒก ํ–ˆ๋‹ค. ๋‹ค์Œ๋ฒˆ ๊ณผ์ œ์—์„  state ๊ด€๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ์ง€ ๊ผผ๊ผผํ•˜๊ฒŒ ์ƒ๊ฐํ•ด์•ผ๊ฒ ๋‹ค.

2. this ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ด ์‹œ๊ฐ„์„ ๋งŽ์ด ํ—ˆ๋น„ํ–ˆ๋‹ค.

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

class App {
  constuctor(target) {
    this.form = new TodoForm(target, this.onSubmit);
    this.list = new TodoList(target);
  }

  onSubmit(newState) {
    this.list.setState(newState);
  }
}

์ด๋•Œ ์ด๋ฒคํŠธ ํ•จ์ˆ˜๋Š” TodoForm ์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋˜๋ฉฐ this๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ์ด App ์—์„œ TodoForm ์œผ๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋œ๋‹ค. TodoForm ๋‚ด์—์„  this.lists ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค. ๊ทธ๋ž˜์„œ this ๋ฅผ App ์œผ๋กœ ๋ฐ”์ธ๋”ฉ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ •ํ–ˆ๋‹ค.

 onSubmit = (newState) => { 
    this.setState(newState);
 }

3. ์ปค๋ฐ‹ ๋ฉ”์„ธ์ง€๋ฅผ ๋„์—„๋„์—„ ์ž‘์„ฑํ–ˆ๋‹ค.

README.md ์— ์ ์–ด๋†“์€ ๊ฒƒ๋งŒํผ์˜ ์ปค๋ฐ‹ ๋ฉ”์„ธ์ง€๋ฅผ ์ž‘์„ฑํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ปค๋ฐ‹ ๋ฉ”์„ธ์ง€๋ฅผ ์‚ดํŽด๋ณด๋Š”๋ฐ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์ˆ˜์ •ํ–ˆ๋Š”์ง€ ์— ๋Œ€ํ•ด ์‰ฝ๊ฒŒ ์•Œ์•„๋ณผ ์ˆ˜ ์—†์—ˆ๋‹ค.

๋‹ค์Œ๋ฒˆ์—” ์ปค๋ฐ‹ ๋ฉ”์„ธ์ง€๋ฅผ ์ข€ ๋” ์ž˜๊ฒŒ ๋‚˜๋ˆ„๊ณ , ๋ฌด์—‡์„ ์–ด๋–ป๊ฒŒ ์ˆ˜์ •ํ–ˆ๋Š”์ง€์— ๋Œ€ํ•ด ์ž์„ธํ•˜๊ฒŒ ์ ์–ด์•ผ๊ฒ ๋‹ค.

3-2. ๋Š๋‚€ ์ 

์ง€๋‚œ ์ฃผ์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ ์ด๋ฒˆ ์ฃผ ๊ณผ์ œ์—๋„ ์ ์šฉํ–ˆ๋‹ค. ๋‚˜๋ฆ„ ๊น”๋”ํ•œ ์ฝ”๋“œ๋ฅผ ์ง ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์—ฌ์ „ํžˆ ๋‚ด ๊ธฐ์ค€์œผ๋กœ ๋ณด๊ธฐ ํŽธํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

error, element, event ๋ฅผ ๋ชจ๋‘ e ๋กœ ์ทจํ•ฉ์‹œํ‚จ๋‹ค๋“ ๊ฐ€... ๐Ÿค”

ํ•œ ํŽธ์œผ๋ก  ๋‚˜์—๊ฒŒ ์‹ค๋งํ–ˆ์ง€๋งŒ ๋˜ ํ•œ ํŽธ์œผ๋ก  ์ด๋ ‡๊ฒŒ ๋˜ ํ•œ๋‹จ๊ณ„ ๋ฐฐ์›Œ๋‚˜๊ฐ€๋Š”๊ตฌ๋‚˜ ์‹ถ์—ˆ๋‹ค.

ํˆฌ๋‘ ๋ฆฌ์ŠคํŠธ๋Š” ํ”„๋ก ํŠธ ์—”๋“œ๋ฅผ ์ฒ˜์Œ ๊ณต๋ถ€ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉฐ JS ๋กœ ๊ฐ„๋‹จํžˆ ๋งŒ๋“ค์–ด ๋ณธ ์ ์ด ์žˆ์—ˆ๊ณ , ํ•ด๋‹น ๊ณผ์ •์„ ๋ธ”๋กœ๊ทธ์— ๋‚จ๊ฒจ๋†“์•˜๋‹ค.

์˜›๋‚ ์— ๋งŒ๋“  ํˆฌ๋‘ ๋ฆฌ์ŠคํŠธ ์ฝ”๋“œ์™€ ์„ค๋ช… ์„ ๋ณด๋ฉด์„œ ๊ทธ๋ž˜๋„ 1๋…„ ์‚ฌ์ด ๊ณต๋ถ€๋ฅผ ํ—›๋˜๊ฒŒ ํ•œ ๊ฑด ์•„๋‹ˆ๊ตฌ๋‚˜, ํ•˜๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ํ•œ ํŽธ์œผ๋ก  ์™œ ์ € ์‹œ๊ธฐ์—” ๋‹น์—ฐํ•œ ๊ฒƒ๋“ค์„ ์•Œ์ง€ ๋ชปํ–ˆ์„๊นŒ ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค๊ธฐ๋„ ํ–ˆ๋‹ค. ์•„๋งˆ 1๋…„ ๋’ค์— ๋‚˜๋Š” ๋˜ ์ง€๊ธˆ์˜ ๋‚˜๋ฅผ ๋ณด๋ฉฐ ๋น„์Šทํ•œ ์ƒ๊ฐ์„ ํ• ์ง€๋„ ๋ชจ๋ฅด๊ฒ ๋‹ค.

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

comment-user-thumbnail
2023๋…„ 6์›” 23์ผ

์ด๋ฏธ์ง€๋ž‘ ๊ฐ™์ด ์ •๋ฆฌ๋˜์–ด ์žˆ์–ด์„œ ๊ธ€ ๋ณด๊ธฐ๊ฐ€ ํŽธํ–ˆ์–ด์š”!
์ €๋„ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๋„ˆ๋ฌด ๋„ˆ๋ฌด ์–ด๋ ค์› ์—ˆ๋Š”๋ฐ.... ๋ฆฌํŒฉํ† ๋ง ์—ด์‹ฌํžˆ ํ•ด์•ผ๊ฒ ์–ด์š”...

1๊ฐœ์˜ ๋‹ต๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด