๐Ÿ” ํ”„๋ก ํŠธ์—”๋“œ ๋ฐ๋ธŒ์ฝ”์Šค 5๊ธฐ TIL 231004 - 231010 WIL

Jun 2k (Jun2)ยท2023๋…„ 10์›” 12์ผ
0

๐Ÿ’ป Intro

3์ฃผ์ฐจ ๊ณผ์ œ์™€ ํ•จ๊ป˜ ๋ณธ๊ฒฉ์ ์œผ๋กœ Vanilla JS๋ฅผ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋Š” ๋ฒ•์— ๋Œ€ํ•œ ๊ฐ•์˜๋ฅผ ์ˆ˜๊ฐ•ํ•˜๋‹ˆ ์‹œ๊ฐ„์ด ์—„์ฒญ ๋ถ€์กฑํ–ˆ๋‹ค. ๋งค์ผ TIL์„ ์ž‘์„ฑํ•  ์—ฌ๋ ฅ์ด ์—†์–ด 3์ฃผ์ฐจ ๊ณผ์ œ๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•˜๊ณ  ๋ฐฐ์šด ๋‚ด์šฉ์„ ๋ณต๊ธฐํ•œ๋‹ค.


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

JavaScript ์‚ฌ์ „ ํ€ด์ฆˆ

์‚ฌ์ „ ํ€ด์ฆˆ๋ฅผ ํ†ตํ•ด JavaScript๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋ฉด์„œ ๋†“์น  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์†Œํ•˜์ง€๋งŒ ์ค‘์š”ํ•œ ํฌ์ธํŠธ๋“ค์„ ๋ฐฐ์› ๋‹ค.

this

  • ์‹คํ–‰์ž ํ•จ์ˆ˜ ๋‚ด์—์„œ this
    ์ƒ์„ฑ์ž ํ•จ์ˆ˜์—์„œ new ์—ฐ์‚ฐ์ž๋ฅผ ๋ถ™์ด์ง€ ์•Š๊ณ  ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋ฉด this๊ฐ€ ์ „์—ญ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ๋˜์–ด ๋ฒ„๋ฆฐ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ์—์„œ๋Š” ์ „์—ญ๊ฐ์ฒด์— this๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋˜๋ฏ€๋กœ ์†์„ฑ์„ ์ฐพ์„ ์ˆ˜ ์—†์–ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
function Person(name, age) {
 this.name = name;
 this.age = age;
}
const person1 = Person('ikjun', 11); // this๊ฐ€ ์ „์—ญ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ
console.log(person1.name);
/*
 Uncaught TypeError: Cannot read properties of undefined (reading 'name') 
 ์ „์—ญ๊ฐ์ฒด์—๋Š” name ์†์„ฑ์ด ์—†์œผ๋ฏ€๋กœ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ
*/

์ด๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— new ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ ์ƒˆ๋กœ์šด ๊ฐ์ฒด์— this๋ฅผ ๋ฐ”์ธ๋”ฉํ•ด์ค˜์•ผ ํ•œ๋‹ค.

const person1 = new Person('ikjun', 11); // this๊ฐ€ Person ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ
console.log(person1.name); // ikjun, ์ •์ƒ ์ถœ๋ ฅ



  • ๋ฉ”์„œ๋“œ ์•ˆ์—์„œ์˜ this
    ํ•จ์ˆ˜๊ฐ€ ๊ฐ์ฒด์˜ ์†์„ฑ ๊ฐ’์ด๋ฉด ๋ฉ”์†Œ๋“œ๋กœ ํ˜ธ์ถœ๋œ๋‹ค. ์ด๋•Œ ๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์˜ this๋Š” ๋ณธ์ธ์„ ์†Œ์œ ํ•œ ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.
const obj1 = {
  name: 'Cho',
  sayName: function () {
    console.log(this.name); // ์—ฌ๊ธฐ์„œ this๋Š” obj1
  },
};
const obj2 = {
  name: 'ikjun',
  member: {
    frontend: {
      sayName: function () {
        console.log(this.name); // ์—ฌ๊ธฐ์„œ this๋Š” member
      },
    },
  },
};
obj1.sayName(); // Cho
obj2.member.frontend.sayName(); // undefined



  • arrow function์—์„œ์˜ this
    ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์˜ this๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„์˜ this๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค. ๋‹ค์‹œ ๋งํ•ด์„œ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์— this๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
    ์•„๋ž˜์˜ ์˜ˆ์‹œ์—์„œ this๋Š” person ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ์ƒ์œ„ ์Šค์ฝ”ํ”„์ธ ์ „์—ญ ๊ฐ์ฒด์ด๋ฏ€๋กœ this๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด {}๊ฐ€ ๋‚˜์˜จ๋‹ค.
const person = {
  name: 'ikjun',
  sayHi: () => console.log(`Hi ${this.name}`),
};
person.sayHi(); // Hi undefined
console.log(this); // {}



์ฆ‰์‹œ์‹คํ–‰ํ•จ์ˆ˜(IIFE, Immediately Invoke Function)

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

(function iife(name) {
  const value = 12;
  console.log(`hello! ${name}`);
})('ikjun'); // hello! ikjun
console.log(value);
// ReferenceError: value is not defined, ๋‚ด๋ถ€ ๋ณ€์ˆ˜ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅ



์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

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

// ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ
function double1(arr) {
  let results = [];
  for (let i = 0; i < arr.length; i++) {
    results.push(arr[i] * 2);
  }
  console.log(results);
}
// ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ
function double2(arr) {
  console.log(arr.map((number) => number * 2));
}
const arr = [1, 2, 3];
double1(arr); // [ 2, 4, 6 ]
double2(arr); // [ 2, 4, 6 ]



๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํ”„๋กœ์„ธ์Šค

ํŠน์ • ์ฝ”๋“œ์˜ ์—ฐ์‚ฐ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ์ฝ”๋“œ์˜ ์‹คํ–‰์„ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•˜๋Š” JavaScript์˜ ๊ณ ์œ ํ•œ ํŠน์„ฑ์ด๋‹ค.
ex) addEventListener, setInterval, setTimeout, XMLHttpRequest

XHR(XMLHttpRequest)

๋ฐ์ดํ„ฐ๋ฅผ ๋น„๋™๊ธฐ๋กœ ์š”์ฒญํ•˜๊ณ , ์š”์ฒญ ํ›„์˜ ๋™์ž‘์„ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

function request(url, successCallback, failCallback) {
  const xhr = new XMLHttpRequest();
  xhr.addEventListener('load', (e) => {
    if (xhr.readyState === 4) {
      if (xhr.status === 200) {
        successCallback(JSON.parse(xhr.responseText));
      } else {
        failCallback(xhr.statusText);
      }
    }
  });
  xhr.addEventListener('error', (e) => failCallback(xhr.statusText));
  xhr.open('GET', url);
  xhr.send();
}



Callback

๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์กฐํšŒํ–ˆ๋‹ค๋ฉด callback ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ๋ฐ›๊ณ  ๋‹ค์Œ ์กฐ๊ฑด์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•ด๋‚˜๊ฐ„๋‹ค. ์•„๋ž˜๋Š” ์œ„์˜ request ํ•จ์ˆ˜๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  callback ํ•จ์ˆ˜๋กœ ๋„˜๊ฒจ๋ฐ›๋Š” ์˜ˆ์‹œ ์ฝ”๋“œ์ด๋‹ค.

const API_URL = 'https://ikjun.todoList';
request(`${API_URL}/todos`, (todos) => {
  const completedTodo = todos.find((todo) => todo.isCompleted);
  if (completedTodo) {
    request(`${API_URL}/comments?todo.id=${completedTodo.id}`, (comments) => {
      comments.forEach((comment) => console.log(comment.content));
    });
  }
});




์ผ๋ฐ˜์ ์ธ callback ํŒจํ„ด์˜ ๊ฒฝ์šฐ์—๋Š” ์ค‘์ฒฉ๋˜์–ด ๋‚˜๊ฐ„๋‹ค. ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์ด ๋„ˆ๋ฌด ๋งŽ๊ฒŒ ๋˜๋ฉด callback hell์— ๋น ์ง€๊ฒŒ ๋œ๋‹ค.

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

Promise

async-await

fetch API


๐Ÿ™„ ์•Œ๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๋” ๊ณต๋ถ€ํ•ด์•ผ ํ•  ๊ฒƒ

this์˜ ์‹ค์งˆ์  ์‚ฌ์šฉ๋ฒ•

์ด๋ก ์ ์œผ๋กœ๋Š” 70~80% ์ •๋„ ์ดํ•ดํ•œ ๊ฒƒ ๊ฐ™์œผ๋‚˜ ์‹ค์ œ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ๋‚˜ ๊ณผ์ œ๋ฅผ ํ•˜๋ฉด์„œ this๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ฒดํฌํ•ด๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค. ํ•ญ์ƒ this๊ฐ€ ์–ด๋””๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์—ฌ ์ฝ”๋”ฉํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์—ฌ๋‚˜๊ฐˆ ๊ฒƒ์ด๋‹ค.

์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ ์šฉ

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•ž์œผ๋กœ ์ง„ํ–‰ํ•  ๊ณผ์ œ๋‚˜ ํ”„๋กœ์ ํŠธ์— ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€ํ–ฅํ•˜์—ฌ ์ฝ”๋”ฉ์„ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ํ˜„์žฌ 3์ฃผ์ฐจ ๊ณผ์ œ์— ์ ์šฉํ•ด๋ณด์•˜๋Š”๋ฐ ์ƒ๊ฐ๋ณด๋‹ค ์ต์ˆ™ํ•ด์ง€๋‹ˆ ํฌ๊ฒŒ ์–ด๋ ต์ง€๋Š” ์•Š์•˜๋‹ค.

LocalStorage ์‚ฌ์šฉ๋ฒ•

๋‹จ์ˆœํžˆ setItem, getItem, clear ๋ฉ”์„œ๋“œ๋กœ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ์ค„๋งŒ ์•Œ์•˜๋‹ค. ๊ฐ•์‚ฌ๋‹˜์ด ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๋‹ค๋ฃจ๋Š” ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด ๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋„ ์ง„ํ–‰ํ•˜๋„๋ก ๋ถ„๊ธฐํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค. ์•ž์œผ๋กœ ํ”„๋กœ์ ํŠธ์—์„œ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” ๋”ฐ๋กœ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผ๊ฒ ๋‹ค.


๐Ÿ‘€ ๋А๋‚€์ 

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

  • Local Storage ๋ฐ ๋ชจ๋“ˆํ™” ์‚ฌ์šฉ๋ฒ•, ๋น„๋™๊ธฐ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•ด ๋ฐฐ์› ๋‹ค.
    ๋น„๋™๊ธฐ ์ž‘์—… ์ˆ˜ํ–‰์„ ์œ„ํ•œ Promise, async-await, fetch api์— ๋Œ€ํ•ด ์‹ค์ œ Todo List ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ๊ณต๋ถ€ํ•˜๋‹ˆ๊นŒ ํ›จ์”ฌ ์Šต๋“์ด ์ž˜ ๋˜์—ˆ๋‹ค.

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


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

๊ด€๋ จ ๋ ˆํผ๋Ÿฐ์Šค
poiemaweb : this
poiemaweb : IIFE

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

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