๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
javascript/๐Ÿ“– study

[8์ฃผ์ฐจ ์Šคํ„ฐ๋””]38์žฅ-๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง

by HomieKim 2022. 3. 27.

๋ธŒ๋ผ์šฐ์ €์˜ ๋ Œ๋”๋ง ๊ณผ์ •

  • ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ธŒ๋ผ์šฐ์ € ์œ„์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ HTML, CSS, javascript ๋กœ ์ž‘์„ฑ๋œ ํ…์ŠคํŠธ ๋ฌธ์„œ๋ฅผ ์–ด๋–ป๊ฒŒ ํŒŒ์‹ฑํ•˜์—ฌ ๋ Œ๋”๋งํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์‹ฑ(parsing)

  • ํŒŒ์‹ฑ(๊ตฌ๋ฌธ ๋ถ„์„ syntax analysis)์€ ํ…์ŠคํŠธ ๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋“ค์—ฌ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ…์ŠคํŠธ ๋ฌธ์„œ์˜ ๋ฌธ์ž์—ด์„ ํ† ํฐ(token)์œผ๋กœ ๋ถ„ํ•ด(์–ดํœ˜ ๋ถ„์„ lexical analysis)ํ•˜๊ณ  ํ† ํฐ์˜ ๋ฌธ๋ฒ•์  ์˜๋ฌด์™€ ๊ตฌ์กฐ๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ ํŒŒ์Šค ํŠธ๋ฆฌ(parse tree)๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์‹ฑ์ด ์™„๋ฃŒ๋œ ์ดํ›„์—๋Š” ํŒŒ์ŠคํŠธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ค‘๊ฐ„์–ธ์–ด์ธ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋ Œ๋”๋ง(rendering)

  • ๋ Œ๋”๋ง HTML, CSS ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ž‘์„ฑ๋œ ๋ฌธ์„œ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์— ์‹œ๊ฐ์ ์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ณผ์ •
    1. ๋ธŒ๋ผ์šฐ์ €๋Š” HTML, CSS, JS ๋“ฑ ๋ Œ๋”๋ง์— ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•˜๊ณ  ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ์‘๋‹ต์„ ๋ฐ›๋Š”๋‹ค.
    2. ๋ธŒ๋ผ์šฐ์ €์˜ ๋ Œ๋”๋ง์—”์ง„์€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต๋œ HTML๊ณผ CSS๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ DOM๊ณผ CSSOM์„ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑ
    3. ๋ธŒ๋ผ์šฐ์ €์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์„œ๋ฒ„๋กœ ๋ถ€ํ„ฐ ์‘๋‹ต๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ AST(Abstract Syntax Tree)๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‹คํ–‰(์ด๋•Œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” DOM API๋ฅผ ํ†ตํ•ด DOM์ด๋‚˜ CSSOM์„ ๋ณ€๊ฐ€๋Šฅ)
    4. ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ HTML ์š”์†Œ์˜ ๋ ˆ์ด์•„์›ƒ์„ ๊ณ„์‚ฐํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์— HTML์š”์†Œ๋ฅผ ํŽ˜์ธํŒ…ํ•œ๋‹ค.

์š”์ฒญ๊ณผ ์‘๋‹ต

  • ๋ธŒ๋ผ์šฐ์ €์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์€ ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค(HTML, CSS, JS ๋“ฑ๋“ฑ..)๋ฅผ ์š”์ฒญ(request)ํ•˜๊ณ  ์‘๋‹ต(response)๋ฐ›์•„ ๋ธŒ๋ผ์šฐ์ €์— ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ๋ Œ๋”๋ง์— ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋Š” ๋ชจ๋‘ ์„œ๋ฒ„์— ์กด์žฌํ•˜๋ฏ€๋กœ ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์„œ๋ฒ„์— ์š”์ฒญํ•˜๊ณ  ์‘๋‹ต ๋ฐ›์€ ๋ฆฌ์†Œ์Šค๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ๋ Œ๋”๋ง ํ•˜๋Š” ๊ฒƒ
  • ๋ธŒ๋ผ์šฐ์ €๋Š” ์„œ๋ฒ„์— ์š”์ฒญ์„ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ์†Œ์ฐฝ์„ ์ œ๊ณตํ•œ๋‹ค.
  • ์ฃผ์†Œ์ฐฝ์— URL์„ ์ž…๋ ฅํ•˜์—ฌ ์ „์†ก ํ•˜๋ฉด URL์˜ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์ด DNS๋ฅผ ํ†ตํ•ด IP์ฃผ์†Œ๋กœ ๋ณ€ํ™˜๋˜๊ณ  ์ด IP ์ฃผ์†Œ๋ฅผ ๊ฐ–๋Š” ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญ์„ ์ „์†กํ•œ๋‹ค.
  • ๋ฃจํŠธ ์š”์ฒญ์€ ์•”๋ฌต์ ์œผ๋กœ index.html์„ ์‘๋‹ต
  • index.html์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์ •์  ํŒŒ์ผ์„ ์š”์ฒญํ•  ๊ฒฝ์šฐ ํ•ด๋‹น ์ •์  ํŒŒ์ผ์„ ๊ฒฝ๋กœ๋ฅผ Path์— ๊ธฐ์ˆ ํ•˜์—ฌ ์„œ๋ฒ„์— ์š”์ฒญ

    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ๋™์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋ฅผ 'ajax'๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  • ์„œ๋ฒ„์— index.html ์š”์ฒญ์‹œ CSS, JS, ์ด๋ฏธ์ง€, ํฐํŠธ ๋“ฑ ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค๋„ ๊ฐ™์ด ์‘๋‹ต ๋ฉ๋‹ˆ๋‹ค.

    ์ด๋Š” ๋ธŒ๋ผ์šฐ์ € ์—”์ง„์ด HTML์„ ํŒŒ์‹ฑํ•˜๋Š” ๋„์ค‘ img, link, script ๋“ฑ์˜ ํƒœ๊ทธ๋ฅผ ๋งŒ๋‚˜๋ฉด HTMLํŒŒ์‹ฑ์„ ์ž ์‹œ ์ค‘๋‹จํ•˜๊ณ  ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ์„ ์š”์ฒญํ•˜๊ธฐ ๋•Œ๋ฌธ

HTTP 1.1 ๊ณผ HTTP 2.0

  • HTTP(HyperText Transfer Protocol)๋Š” ์›น์—์„œ ๋ธŒ๋ผ์šฐ์ €์™€ ์„œ๋ฒ„๊ฐ€ ํ†ต๊ธฐํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ ์ž…๋‹ˆ๋‹ค.
  • HTTP/1.1์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปค๋„ฅ์…˜๋‹น ํ•˜๋‚˜์˜ ์š”์ฒญ๊ณผ ์‘๋‹ต๋งŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • HTTP/2.0์€ ์ปค๋„ฅ์…˜๋‹น ์—ฌ๋Ÿฌ๊ฐœ์˜ ์š”์ฒญ๊ณผ ์‘๋‹ต, ์ฆ‰ ๋‹ค์ค‘ ์š”์ฒญ/์‘๋‹ต์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค์˜ ๋™์‹œ ์ „์†ก์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ HTTP/1.1์— ๋น„ํ•ด ๋กœ๋“œ ์†๋„๊ฐ€ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.

HTML ํŒŒ์‹ฑ๊ณผ DOM ์ƒ์„ฑ

  • HTML ๋ฌธ์„œ๋Š” ๋ฌธ์ž์—ด๋กœ ์ด๋ฃจ์–ด์ง„ ์ˆœ์„œํ•œ ํ…์ŠคํŠธ์ž…๋‹ˆ๋‹ค.
  • HTML ๋ฌธ์„œ๋ฅผ ๋ธŒ๋ผ์šฐ์ €์— ์‹œ๊ฐ์ ์ธ ํ”ฝ์…€๋กœ ๋ Œ๋”๋ง ํ•˜๋ ค๋ฉด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ(๊ฐ์ฒด)๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฆ‰, ๋ธŒ๋ผ์šฐ์ € ์—”์ง„์€ HTML๋ฌธ์„œ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ธ DOM(Document Object Model)์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

DOM ์ƒ์„ฑ ๊ณผ์ •

  1. ์„œ๋ฒ„์— ์กด์žฌํ•˜๋˜ HTML ํŒŒ์ผ์ด ๋ธŒ๋ผ์šฐ์ € ์š”์ฒญ์— ์˜ํ•ด ์‘๋‹ต ๋œ๋‹ค.
  2. ์„œ๋ฒ„๋Š” ์š”์ฒญ๋œ HTML ํŒŒ์ผ์„ ์ฝ์–ด๋“ค์—ฌ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•œ ๋‹ค์Œ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๋ฐ”์ดํŠธ(2์ง„์ˆ˜)๋ฅผ ๊ฒฝ์œ ํ•˜์—ฌ ์‘๋‹ต
  3. ๋ธŒ๋ผ์šฐ์ €๋Š” ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•œ HTML ๋ฌธ์„œ๋ฅผ ๋ฐ”์ดํŠธ(2์ง„์ˆ˜)ํ˜•ํƒœ๋กœ ์‘๋‹ต๋ฐ›์Œ
  4. ์‘๋‹ต๋œ HTML ๋ฌธ์„œ๋Š” meta ํƒœ๊ทธ์˜ charset ์–ดํ‹ฐ๋ฆฌ๋ทฐํŠธ์— ์˜ํ•ด ์ง€์ •๋œ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์„ ๊ธฐ์ค€์œผ๋กœ ๋ฌธ์ž์—ด๋ณ€ํ™˜
    (์ด๋•Œ meta ํƒœ๊ทธ์˜ ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋Š” ์‘๋‹ต ํ—ค๋”(response header)์— ๋‹ด๊ฒจ ์‘๋‹ต๋ฉ๋‹ˆ๋‹ค.)
  5. ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋œ HTML ๋ฌธ์„œ๋ฅผ ์ฝ์–ด ๋“ค์—ฌ ๋ฌธ๋ฒ•์  ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š” ์ฝ”๋“œ์˜ ์ตœ์†Œ ๋‹จ์œ„์ธ ํ† ํฐ(token)๋“ค๋กœ ๋ถ„ํ•ด
  6. ๊ฐ ํ† ํฐ๋“ค์„ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋…ธ๋“œ(node)๋ฅผ ์ƒ์„ฑ (ํ† ํฐ์˜ ๋‚ด์šฉ์— ๋”ฐ๋ผ ๋ฌธ์„œ ๋…ธ๋“œ, ์š”์†Œ ๋…ธ๋“œ ๋“ฑ์œผ๋กœ ๋ถ„๋ฅ˜)
  7. HTML ๋ฌธ์„œ๋Š” HTML ์š”์†Œ๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋ฉฐ HTML ์š”์†Œ๋Š” ์ค‘์ฒฉ๊ด€๊ณ„๋ฅผ ๊ฐ–๋Š”๋‹ค. ์ฆ‰, ์ค‘์ฒฉ ๊ด€๊ณ„์— ์˜ํ•ด ํ˜•์„ฑ๋œ ๋…ธ๋“œ๋“ค์„ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ๊ตฌ์„ฑ, ๋…ธ๋“œ๋“ค๋กœ ์ด๋ฃจ์–ด์ง„ ํŠธ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ DOM์ด๋ผ๊ณ  ํ•œ๋‹ค.

CSS ํŒŒ์‹ฑ๊ณผ CSSOM ์ƒ์„ฑ

  • ๋ Œ๋”๋ง ์—”์ง„์€ DOM์„ ์ƒ์„ฑํ•˜๋‹ค CSS๋ฅผ ๋กœ๋“œํ•˜๋Š” link ํƒœ๊ทธ๋‚˜ styleํƒœ๊ทธ๋ฅผ ๋งŒ๋‚˜๋ฉด DOM ์ƒ์„ฑ์„ ์ผ์‹œ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.
  • CSS ํŒŒ์ผ์ด๋‚˜ style ํƒœ๊ทธ ๋‚ด์˜ CSS๋ฅผ HTML๊ณผ ๋™์ผํ•œ ๊ณผ์ •์œผ๋กœ ํŒŒ์‹ฑํ•˜์—ฌ CSSOM(CSS Object Model) ์ƒ์„ฑ
  • CSSOM์ด ์ƒ์„ฑ ์™„๋ฃŒ๋˜๋ฉด ์ผ์‹œ ์ค‘๋‹จ๋˜ DOM ํŠธ๋ฆฌ ์ƒ์„ฑ์„ ์žฌ๊ฐœ
  • CSSOM์€ ์ƒ์†๊ด€๊ณ„๋ฅผ ๋ฐ˜์˜

๋ Œ๋” ํŠธ๋ฆฌ ์ƒ์„ฑ

  • DOM ๊ณผ CSSOM์€ ๋ Œ๋”๋ง์„ ์œ„ํ•ด ๋ Œ๋” ํŠธ๋ฆฌ(render tree)๋กœ ๊ฒฐํ•ฉ๋จ
  • ๋ Œ๋” ํŠธ๋ฆฌ๋Š” ๋ Œ๋”๋ง์„ ์œ„ํ•œ ์ž๋ฃŒ ๊ตฌ์กฐ๋กœ ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์— ํ‘œ์‹œ ๋˜์ง€ ์•Š๋Š” ๋…ธ๋“œ(meta ํƒœ๊ทธ ํ˜น์€ display : none ๋“ฑ..)๋Š” ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์™„์„ฑ๋œ ๋ Œ๋” ํŠธ๋ฆฌ๋Š” ๊ฐ HTML์š”์†Œ์˜ ๋ ˆ์ด์•„์›ƒ์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์— ํ”ฝ์…€์„ ๋ Œ๋”๋งํ•˜๋Š” ํŽ˜์ธํŒ… ์ฒ˜๋ฆฌ์— ์ž…๋ ฅ๋œ๋‹ค.
  • ์ •๋ฆฌ : ๋ Œ๋”ํŠธ๋ฆฌ ์ƒ์„ฑ -> ๋ ˆ์ด ์•„์›ƒ ๊ณ„์‚ฐ -> ํŽ˜์ธํŒ… ๊ณผ์ •
  • ์œ„ ๋ Œ๋”๋ง ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‹คํ–‰ ๋  ์ˆ˜ ์žˆ๋‹ค.
    1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์˜ํ•œ ๋…ธ๋“œ ์ถ”๊ฐ€ ๋˜๋Š” ์‚ญ์ œ
    2. ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์˜ ๋ฆฌ์‚ฌ์ด์ง•์— ์˜ํ•œ ๋ทฐํฌํŠธ ํฌ๊ธฐ ๋ณ€๊ฒฝ
    3. HTML ์š”์†Œ์˜ ๋ ˆ์ด์•„์›ƒ ๋ณ€๊ฒฝ(width, margin, padding, display, position ๋“ฑ์˜ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ)

๋ฆฌ๋ Œ๋”๋ง์€ ์„ฑ๋Šฅ์— ์•…์˜ํ–ฅ์„ ์ฃผ๋Š” ์ž‘์—…์ด๋ฏ€๋กœ ์ฃผ์˜ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์‹ฑ๊ณผ ์‹คํ–‰

  • DOM์€ HTML ๋ฌธ์„œ์˜ ๊ตฌ์กฐ์™€ ์ •๋ณด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ HTML์š”์†Œ์™€ ์Šคํƒ€์ผ ๋“ฑ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” DOM API๋ฅผ ์ œ๊ณต
  • CSS ํŒŒ์‹ฑ๊ณผ์ •๊ณผ ๋™์ผํ•˜๊ฒŒ DOM ์ƒ์„ฑ๊ณผ์ •์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋Š” scriptํƒœ๊ทธ๋ฅผ ๋งŒ๋‚˜๋ฉด DOM ์ƒ์„ฑ์„ ์ค‘์ง€
  • script ํƒœ๊ทธ์— ์š”์ฒญ๋œ ์ž๋ฐ”์Šคํฌ๋ง‚ํŠธ ์ฝ”๋“œ๋ฅผ ํŒŒ์‹ฑํ•˜๊ธฐ์œ„ํ•ด ์ œ์–ด๊ถŒ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์œผ๋กœ ๋„˜๊น€, ์ดํ›„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์‹ฑ๊ณผ ์‹คํ–‰์ด ์ข…๋ฃŒ๋˜๋ฉด ๋ Œ๋”๋ง ์—”์ง„์œผ๋กœ ๋‹ค์‹œ ์ œ์–ด๊ถŒ์„ ๋„˜๊น€
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ DOM์ด๋‚˜ CSSSOM์„ ์ƒ์„ฑํ•˜๋“ฏ์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ•ด์„ํ•˜์—ฌ ์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ(AST, Abstract Syntax Tree)๋ฅผ ์ƒ์„ฑ
  • AST๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑ

ํ† ํฌ๋‚˜์ด์ง•(tokenizing)

  • ๋‹จ์ˆœ ๋ฌธ์ž์—ด์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์–ดํœ˜ ๋ถ„์„(lexical analysis)ํ•˜์—ฌ ๋ฌธ๋ฒ•์  ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š” ์ฝ”๋“œ์˜ ์ตœ์†Œ ๋‹จ์œ„์ธ ํ† ํฐ๋“ค๋กœ ๋ถ„ํ•ด, ์ด ๊ณผ์ •์„ ๋ ‰์‹ฑ(lexing)์ด๋ผ๊ณ ํ•จ

ํŒŒ์‹ฑ(parsing)

  • ํ† ํฐ๋“ค์˜ ์ง‘ํ•ฉ์„ ๊ตฌ๋ถ„ ๋ถ„์„ํ•˜์—ฌ AST๋ฅผ ์ƒ์„ฑ (AST๋Š” ํ† ํฐ์— ๋ฌธ๋ฒ•์  ์˜๋ฏธ์™€ ๊ตฌ์กฐ๋ฅผ ๋ฐ˜์˜ํ•œ ํŠธ๋ฆฌ ๊ตฌ์กฐ)
  • AST๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋‚˜ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ตฌํ˜„
  • TypeScript, Babel, Prettier ๊ฐ™์€ ํŠธ๋žœ์Šค ํŒŒ์ผ๋Ÿฌ ๋˜ํ•œ ๊ตฌํ˜„ ๊ฐ€๋Šฅ

๋ฐ”์ดํŠธ ์ฝ”๋“œ ์ƒ์„ฑ๊ณผ ์‹คํ–‰

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

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

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

    ๋ ˆ์ด์•„์›ƒ์— ๋ณ€๊ฒฝ์ด ์—†๋Š” ๊ฒฝ์šฐ ๋ ˆํŽ˜์ธํŒ…๋งŒ ์ผ์–ด๋‚จ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์‹ฑ์— ์˜ํ•œ HTML ํŒŒ์‹ฑ ์ค‘๋‹จ

  • ๋ Œ๋”๋ง ์—”์ง„๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ๋ณ‘๋ ฌ์ ์œผ๋กœ ํŒŒ์‹ฑ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ์ง๋ ฌ์ ์œผ๋กœ ํŒŒ์‹ฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €๋Š” ๋™๊ธฐ์ (synchronous)์œผ๋กœ, ์œ„์—์„œ ์•„๋ž˜ ๋ฐฉํ–ฅ์œผ๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ํŒŒ์‹ฑํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค

    ๋”ฐ๋ผ์„œ script ํƒœ๊ทธ์˜ ์œ„์น˜๋Š” ์ค‘์š”ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š”๋‹ค.

  • ์˜ˆ๋ฅผ ๋“ค์–ด header์—์„œ DOM์„ ์กฐ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ ์‹คํ–‰ ์‹œ์ ์— HTML ์š”์†Œ๊ฐ€ ์ „๋ถ€ ํŒŒ์‹ฑ๋˜์–ด ๋ Œ๋” ํŠธ๋ฆฌ๊ฐ€ ํ˜•์„ฑ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋‚  ์ˆ˜ ์žˆ๋‹ค.
  • <script>ํƒœ๊ทธ๋ฅผ body ์š”์†Œ์˜ ๊ฐ€์žฅ ์•„๋ž˜์— ์œ„์น˜ ์‹œํ‚ค๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•

    ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด DOM์ด ์™„์„ฑ๋œ ์ƒํƒœ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰ ๋˜์–ด ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š์Œ
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋กœ๋”ฉ/ํŒŒ์‹ฑ/์‹คํ–‰ ์œผ๋กœ ์ธํ•ด HTML์š”์†Œ๋“ค์˜ ๋ Œ๋”๋ง์— ์ง€์žฅ๋ฐ›๋Š” ์ผ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์‹œ๊ฐ„ ๋‹จ์ถ•

script ํƒœ๊ทธ์˜ async / defer ์–ดํŠธ๋ฆฌ๋ทฐํŠธ

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์‹ฑ์— ์˜ํ•œ DOM ์ƒ์„ฑ ์ค‘๋‹จ (blocking)๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด HTML5๋ถ€ํ„ฐ script ํƒœ๊ทธ์— async ์™€ defer ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.
  • async /defer ์–ดํ‹ฐ๋ฆฌ๋ทฐํŠธ๋Š” src ํ†ตํ•ด ์™ธ๋ถ€ ์ž๋ฐ”์Šคํฌ๋ฆฌํŠธ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • HTML ํŒŒ์‹ฑ๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์˜ ๋กœ๋“œ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ง„ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
  • async / defer ์ฐจ์ด์ ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์‹คํ–‰ ์‹œ์ 

async ์–ดํŠธ๋ฆฌ๋ทฐํŠธ

  • HTML ํŒŒ์‹ฑ๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ๋กœ๋“œ๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ง„ํ–‰
  • ๋‹จ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์‹ฑ๊ณผ ์‹คํ–‰์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์˜ ๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋œ ์งํ›„ ์ง„ํ–‰๋˜๋ฉฐ, ์ด๋•Œ HTML ํŒŒ์‹ฑ ์ค‘๋‹จ
  • script ํƒœ๊ทธ์˜ ์ˆœ์„œ์™€ ์ƒ๊ด€์—†์ด ๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ถ€ํ„ฐ ์‹คํ–‰๋˜๋ฏ€๋กœ ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.

defer ์–ดํŠธ๋ฆฌ๋ทฐํŠธ

  • async ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์˜ ๋กœ๋“œ๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ง„ํ–‰
  • ๋‹จ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์‹ฑ๊ณผ ์‹คํ–‰์€ HTML ํŒŒ์‹ฑ์ด ์™„๋ฃŒ๋œ ์งํ›„, ์ฆ‰ DOM ์ƒ์„ฑ์ด ์™„๋ฃŒ๋œ ์งํ›„ ์ง„ํ–‰

    DOM ์ƒ์„ฑ์ด ์™„๋ฃŒ๋œ ์งํ›„์— DOMContentLoaaded ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€