๐ŸŒ• F-lab ๋ฉ˜ํ† ๋ง ๊ธฐ๋ก

๋ฉ˜ํ† ๋ง ์ดํ›„ ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์„ ์ฑ„์šฐ๊ธฐ ์œ„ํ•œ ๊ธฐ๋ก

์ด๋ฒคํŠธ ๋ฃจํ”„, ๋งคํฌ๋กœ/๋งˆ์ดํฌ๋กœ ํ…Œ์Šคํฌ ํ

eventLoop-taskQueue

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜์˜ ์–ธ์–ด์ด์ง€๋งŒ, ๊ตฌ๋™๋˜๋Š” ํ™˜๊ฒฝ(๋ธŒ๋ผ์šฐ์ €, Node.js)๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ์ด ๋•Œ, ๊ตฌ๋™ ํ™˜๊ฒฝ๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์„ ์—ฐ๋™ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์žฅ์น˜๊ฐ€ ์ด๋ฒคํŠธ ๋ฃจํ”„
    • ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ํ˜ธ์ถœ๋˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋“ค์„ ๊ด€๋ฆฌํ•˜์—ฌ ํƒœ์Šคํฌ ํ์— ์ „๋‹ฌํ•˜๊ณ  ์ฝœ์Šคํƒ์ด ๋น„์—ˆ์„ ๋•Œ, ์ฝœ์Šคํƒ์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค.
  • ๋งคํฌ๋กœ ํ…Œ์Šคํฌ ํ: DOM, setTimeout ๋“ฑ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๋‹ด๊ธฐ๋Š” ํ ์ž๋ฃŒ๊ตฌ์กฐ
  • ๋งˆ์ดํฌ๋กœ ํ…Œ์Šคํฌ ํ: Promise, async ๋“ฑ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๋‹ด๊ธฐ๋Š” ํ ์ž๋ฃŒ๊ตฌ์กฐ
  • ์ฝ”๋“œ ์‹คํ–‰ ์šฐ์„  ์ˆœ์œ„: ์ฝœ์Šคํƒ(๋ฉ”์ธ ์Šค๋ ˆ๋“œ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„) > ๋งˆ์ดํฌ๋กœ ํ…Œ์Šคํฌ ํ > ๋งคํฌ๋กœ ํ…Œ์Šคํฌ ํ
console.log('script start'); // A

setTimeout(function () {
  // B
  console.log('setTimeout');
}, 0);

Promise.resolve()
  .then(function () {
    // C
    console.log('promise1');
  })
  .then(function () {
    // D
    console.log('promise2');
  });

console.log('script end'); // E

์œ„ ์ฝ”๋“œ์˜ ์‹คํ–‰ ์ˆœ์„œ: A E C D B

Variable Environment์™€ Lexical Environment

  • Variable Environment: ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ์ƒ์„ฑ ์‹œ ์ดˆ๊ธฐ ์ƒํƒœ๋ฅผ ์Šค๋ƒ…์ƒท ํ˜•ํƒœ๋กœ ์ €์žฅ(์ดˆ๊ธฐ๊ฐ’ ์œ ์ง€), ์ดํ›„ ์ด๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ LE์— ํ• ๋‹น
  • Lexical Environment: ์ฝ”๋“œ ์‹คํ–‰ ๋„์ค‘์˜ ๋ณ€๊ฒฝ๋˜๋Š” ์‚ฌํ•ญ์ด ์ฆ‰์‹œ ๋ฐ˜์˜, ๊ทธ๋ ‡๊ธฐ์— ์ฃผ๋กœ LE๋ฅผ ํ™œ์šฉ

[[Prototype]]์„ ์ง์ ‘ ๋ณ€๊ฒฝํ–ˆ์„ ๋•Œ์˜ ๋‹จ์ 

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์†์„ฑ์˜ ์ ‘๊ทผ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ์‹์˜ ํŠน์„ฑ ์ƒ, ๊ต‰์žฅํžˆ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋Š” ๊ณผ์ •์ด๋‹ค.
  • ๋”ฐ๋ผ์„œ Object.create(_.prototype)์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์›น ์ปดํฌ๋„ŒํŠธ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด

  • ๋ผ์ดํ”„์‚ฌ์ดํด: ๋ง ๊ทธ๋Œ€๋กœ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๋œปํ•˜๋ฉฐ, ์›น์—์„œ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์€ ํ•œ ํ™”๋ฉด์ด ์ƒ์„ฑ๋˜๊ณ  ์‚ฌ๋ผ์ง€๊ธฐ๊นŒ์ง€์˜ ๊ณผ์ •์ด๋‹ค.
  • ์ฆ‰, ์ปดํฌ๋„ŒํŠธ ๋ผ์ดํ”„์‚ฌ์ดํด์ด๋ž€ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ์„ฑ๋ถ€ํ„ฐ ์ œ๊ฑฐ๋  ๋•Œ๊นŒ์ง€์˜ ๊ณผ์ •์„ ๋งํ•˜๋ฉฐ, ์ด ๊ณผ์ •์—์„œ ์ด๋ฒคํŠธ๋ฅผ ํ•ธ๋“ค๋งํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ API๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • ์›น ์ปดํฌ๋„ŒํŠธ ๋ผ์ดํ”„์‚ฌ์ดํด
    • connectedCallback(): customElement๊ฐ€ DOM ์š”์†Œ๋กœ ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋˜๋Š” API
    • disconnectedCallback(): customElement๊ฐ€ DOM์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์„ ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋˜๋Š” API
    • attributeChangedCallback(name, oldVlaue, newValue): ์ธ์ž๋กœ ์†์„ฑ์ด๋ฆ„, ์ด์ „ ์†์„ฑ๊ฐ’, ์ดํ›„ ์†์„ฑ๊ฐ’์„ ๋ฐ›์œผ๋ฉฐ ์†์„ฑ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” API
      • static get observedAttributes(): ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ [โ€˜์†์„ฑ์ด๋ฆ„โ€™]ํ˜•ํƒœ๋ฅผ ์ง€์ •ํ•ด์ฃผ์–ด์•ผํ•˜๋ฉฐ ํ•ด๋‹นํ•˜๋Š” ์†์„ฑ์ด๋ฆ„์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
    • adoptedCallback(): customElement๊ฐ€ ๋‹ค๋ฅธ document๋กœ ์ด๋™๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋˜๋Š” API

๋ฆฌํ”Œ๋กœ์šฐ์™€ ๋ฆฌํŽ˜์ธํŠธ

๋ฆฌํ”Œ๋กœ์šฐ์™€ ๋ฆฌํŽ˜์ธํŠธ

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

์›น ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” shadow DOM์ด๋ผ๋Š” ๊ฐ ์ปดํฌ๋„ŒํŠธ๋งˆ๋‹ค์˜ ๋…๋ฆฝ์ ์ธ DOM์„ ๋‘์–ด ์œ„ ๊ณผ์ •์ด ํ•ด๋‹นํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ์ผ์–ด๋‚˜๊ฒŒ ํ•˜์˜€๋‹ค.

reset CSS์™€ normalize CSS

๋จผ์ € ์ด ๋‘˜์ด ํ•„์š”ํ•œ ์ด์œ ๋ฅผ ์•Œ์•„์•ผํ•œ๋‹ค.
์•Œ๊ฒŒ ๋ชจ๋ฅด๊ฒŒ ์ด๋ฏธ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ์ œ๊ณตํ•˜๋Š” stylesheet์ด ์žˆ๋Š”๋ฐ ์ด๋ฅผ user-agent stylesheet๋ผ๊ณ  ํ•œ๋‹ค.
์ด๋Ÿฐ ๊ธฐ๋ณธ์ ์ธ ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ, ์œ„ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค.

  • reset css: ๋ง ๊ทธ๋Œ€๋กœ ๋ชจ๋“  ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด๋ฒ„๋ฆฌ๋Š” ๊ฒƒ! ์•„์˜ˆ ํ•˜์–€ ๋„ํ™”์ง€๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋‚ด๊ฐ€ ๋‹ค์‹œ ๊ทธ๋ฆฌ๊ฒ ๋‹คํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • normalize css: ๋ฆฌ์…‹ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๋ธŒ๋ผ์šฐ์ €์˜ ์Šคํƒ€์ผ์„ ์ ๋‹นํžˆ ๋น„์Šทํ•˜๊ฒŒ ๋ณด์ด๋„๋ก ๋งŒ๋“ ๋‹ค. ๊ตณ์ด ๋‹ค ์ง€์šฐ์ง€๋ง๊ณ , ์ ๋‹นํžˆ ๊ณตํ†ต๋œ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ์Šคํƒ€์ผ์‹œํŠธ๋ฅผ ์ ์šฉํ•˜์ž๋Š” ๋ฐฉ๋ฒ•!

์ •๋ง ๊ณต๋ถ€ํ•˜๊ณ  ํ•˜๋ฉด ํ• ์ˆ˜๋ก ๋ชจ๋ฅด๋Š” ๊ฒŒ ํˆฌ์„ฑ์ด๊ณ  ์•Œ์•„์•ผํ•  ๊ฒŒ ํˆฌ์„ฑ์ด๋‹ค. ์‚ฌ์‹ค์€ ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ณต๋ถ€ํ•˜๋Š” ์žฌ๋ฏธ๊ฐ€ ์žˆ๊ธฐ๋„ ํ•˜๋‹ค. ์ด๋ฒˆ ๋ฉ˜ํ† ๋ง์—์„œ ๋‚˜์˜จ ํผ์งํผ์งํ•œ ์งˆ๋ฌธ๋“ค์ด ๋ช‡๊ฐœ ๋” ์žˆ์–ด์„œ ์ถ”ํ›„ 2๋ฒˆ์งธ ๊ธ€๋กœ ์ž‘์„ฑ ์˜ˆ์ •์ด๋‹ค.

๐Ÿ—’๏ธ Reference

์ด๋ฒคํŠธ๋ฃจํ”„, ๋งคํฌ๋กœ/๋งˆ์ดํฌ๋กœ ํƒœ์Šคํฌ ํ

Prototype ์ง์ ‘ ๋ณ€๊ฒฝ์˜ ๋ฌธ์ œ

์›น ์ปดํฌ๋„ŒํŠธ ์ƒ๋ช…์ฃผ๊ธฐ

reset css์™€ normalize css