ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ถ„์•ผ๋Š” ์›น ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•˜๋Š” ์›นํŽ˜์ด์ง€/์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” OS๋‚˜ VM์œ„์—์„œ ์‹คํ–‰๋˜๋Š” ๋ฐ˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ HTML, CSS์™€ ํ•จ๊ป˜ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์„ ๊ณ ๋ คํ•  ๋•Œ ํšจ์œจ์ ์ธ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

๋ธŒ๋ผ์šฐ์ €๋Š” HTML, CSS, JS๋กœ ์ž‘์„ฑ๋œ ํ…์ŠคํŠธ ๋ฌธ์„œ๋ฅผ ํŒŒ์‹ฑ(ํ•ด์„)ํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์— ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

  • ํŒŒ์‹ฑ : ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ๋ฌธ๋ฒ•์— ๋งž๊ฒŒ ์ž‘์„ฑ๋œ ํ…์ŠคํŠธ ๋ฌธ์„œ๋ฅผ ์ฝ์–ด ๋“ค์—ฌ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ…์ŠคํŠธ ๋ฌธ์„œ์˜ ๋ฌธ์ž์—ด ํ† ํฐ์œผ๋กœ ๋ถ„ํ•ดํ•˜๊ณ , ํ† ํฐ์— ๋ฌธ๋ฒ•์  ์˜๋ฏธ์™€ ๊ตฌ์กฐ๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์ธ ํŒŒ์Šค ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •
  • ๋ Œ๋”๋ง : HTML, CSS, JS๋กœ ์ž‘์„ฑ๋œ ๋ฌธ์„œ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์— ์‹œ๊ฐ์ ์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ

 

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ Œ๋”๋ง๋˜๋Š” ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. ๋ธŒ๋ผ์šฐ์ €๋Š” HTML, CSS, JS, ์ด๋ฏธ์ง€, ํฐํŠธ ํŒŒ์ผ ๋“ฑ ๋ Œ๋”๋ง์— ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•˜๊ณ  ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์„ ๋ฐ›์Œ

2. ๋ธŒ๋ผ์šฐ์ €์˜ ๋ Œ๋”๋ง ์—”์ง„์€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต๋œ HTML๊ณผ CSS๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ DOM๊ณผ CSSOM์„ ์ƒ์„ฑํ•˜๊ณ  ์ด๋“ค์„ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑ

3. ๋ธŒ๋ผ์šฐ์ €์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ AST(Abstract Syntax Tree)๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‹คํ–‰

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” DOM API๋ฅผ ํ†ตํ•ด DOM์ด๋‚˜ CSSOM์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ
  • ๋ณ€๊ฒฝ๋œ DOM๊ณผ CSSOM์€ ๋‹ค์‹œ ๋ Œ๋” ํŠธ๋ฆฌ๋กœ ๊ฒฐํ•ฉ

4. ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ HTML ์š”์†Œ์˜ ๋ ˆ์ด์•„์›ƒ์„ ๊ณ„์‚ฐํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์— HTML ์š”์†Œ๋ฅผ ํŽ˜์ธํŒ…


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

๋ธŒ๋ผ์šฐ์ €์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์€ ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์„œ๋ฒ„์— ์š”์ฒญ(request)ํ•˜๊ณ  ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต(response)๋ฐ›์•„ ๋ธŒ๋ผ์šฐ์ €์— ์‹œ๊ฐ์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋ Œ๋”๋ง์— ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋Š” ๋ชจ๋‘ ์„œ๋ฒ„์— ์กด์žฌํ•˜๋ฏ€๋กœ ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์„œ๋ฒ„์— ์š”์ฒญํ•˜๊ณ  ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ๋ Œ๋”๋ง ํ•˜๋Š”๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์„œ๋ฒ„์— ์š”์ฒญ์„ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ฃผ์†Œ์ฐฝ์— URL์„ ์ž…๋ ฅํ•˜๊ณ  ์—”ํ„ฐ ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด URL์˜ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์ด *DNS๋ฅผ ํ†ตํ•ด IP ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜๋˜๊ณ  ์ด IP ์ฃผ์†Œ๋ฅผ ๊ฐ–๋Š” ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

 

*DNS : ๋„๋ฉ”์ธ ์ด๋ฆ„ ์‹œ์Šคํ…œ. ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ๋จธ์‹ ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” IP ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜

 

 

์˜ˆ๋ฅผ ๋“ค์–ด poiemaweb.com์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ๋ฐ›์•„๋Š” ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ์ฐฝ์— https://poiemaweb.com ์„ ์ž…๋ ฅํ•˜๊ณ  ์—”ํ„ฐ ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด *๋ฃจํŠธ ์š”์ฒญ์ด poiemaweb.com ์„œ๋ฒ„๋กœ ์ „์†ก
  • ์„œ๋ฒ„๋Š” ๋ฃจํŠธ ์š”์ฒญ์— ๋Œ€ํ•ด ์„œ๋ฒ„์˜ ๋ฃจํŠธ ํด๋”์— ์กด์žฌํ•˜๋Š” ์ •์  ํŒŒ์ผ index.html์„ ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)๋กœ ์‘๋‹ต
  • index.html์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์ •์  ํŒŒ์ผ์„ ์„œ๋ฒ„์— ์š”์ฒญํ•˜๋ ค๋ฉด ๋ธŒ๋ผ์šฐ์ €์˜ ์ฃผ์†Œ์ฐฝ์— ์š”์ฒญํ•  ์ •์  ํŒŒ์ผ์˜ ๊ฒฝ๋กœ์™€ ํŒŒ์ผ ์ด๋ฆ„์„ URL ํ˜ธ์ŠคํŠธ ๋’ค์˜ ํŒจ์Šค์— ๊ธฐ์ˆ ํ•˜์—ฌ ์„œ๋ฒ„์— ์š”์ฒญํ•จ (ex. https://poiemaweb.com/assets/data/data.json)
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ๋™์ ์œผ๋กœ ์„œ๋ฒ„์— ์ •์ /๋™์  ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ์ˆ˜๋„ ์žˆ์Œ(ajax, REST API)

*๋ฃจํŠธ ์š”์ฒญ : /, ์Šคํ‚ด๊ณผ ํ˜ธ์ŠคํŠธ๋งŒ์œผ๋กœ ๊ตฌ์„ฑ๋œ URL์— ์˜ํ•œ ์š”์ฒญ. ๋ฃจํŠธ ์š”์ฒญ์—๋Š” ๋ช…ํ™•ํžˆ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•˜๋Š” ๋‚ด์šฉ์ด ์—†์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋ฒ„๋Š” ๋ฃจํŠธ ์š”์ฒญ์— ๋Œ€ํ•ด ์•”๋ฌต์ ์œผ๋กœ index.html์„ ์‘๋‹ตํ•˜๋„๋ก ๊ธฐ๋ณธ ์„ค์ •์ด ๋˜์–ด ์žˆ์Œ

 

๋‹ค์Œ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ poiemaweb.com ์„œ๋ฒ„์— ์š”์ฒญํ•œ ๋‚ด์šฉ๊ณผ ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•œ ๋‚ด์šฉ์€ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ Network ํŒจ๋„์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๋ธŒ๋ผ์šฐ์ €์˜ ๋ Œ๋”๋ง ์—”์ง„์€ HTML(index.html)์„ ํŒŒ์‹ฑํ•˜๋Š” ๋„์ค‘ ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค๋ฅผ ๋กœ๋“œํ•˜๋Š” ํƒœ๊ทธ๋ฅผ ๋งŒ๋‚˜๋ฉด HTML์˜ ํŒŒ์‹ฑ์„ ์ผ์‹œ ์ค‘๋‹จํ•˜๊ณ  ํ•ด๋‹น ๋ฆฌ์Šค์†Œ ํŒŒ์ผ์„ ์„œ๋ฒ„๋กœ ์š”์ฒญํ•˜๊ธฐ ๋•Œ๋ฌธ์— index.html๋ฟ๋งŒ ์•„๋‹ˆ๋ผ CSS,JS,์ด๋ฏธ์ง€, ํฐํŠธ ํŒŒ์ผ ๋“ฑ ์š”์ฒญํ•˜์ง€ ์•Š์€ ๋ฆฌ์†Œ์Šค๋“ค๋„ ํ•จ๊ป˜ ์‘๋‹ต๋ฉ๋‹ˆ๋‹ค.


HTTP 1.1๊ณผ HTTP 2.0

HTTP๋Š” ์›น์—์„œ ๋ธŒ๋ผ์šฐ์ €์™€ ์„œ๋ฒ„๊ฐ€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ(๊ทœ์•ฝ)์ž…๋‹ˆ๋‹ค. 1989๋…„ HTTP, URL๊ณผ ํ•จ๊ป˜ ํŒ€ ๋ฒ„๋„ˆ์Šค ๋ฆฌ ๊ฒฝ์ด ๊ณ ์•ˆํ•œ HTTP๋Š” 1991๋…„ ์ตœ์ดˆ๋กœ ๋ฌธ์„œํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ€์šด๋ฐ HTTP/1.1๊ณผ HTTP/2๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

HTTP/1.1

  • 1999๋…„์— ๋ฐœํ‘œ
  • ์ปค๋„ฅ์…˜๋‹น ํ•˜๋‚˜์˜ ์š”์ฒญ๊ณผ ์‘๋‹ต๋งŒ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ํ•œ ๋ฒˆ์— ์ „์†กํ•  ์ˆ˜ ์—†์Œ
  • HTML ๋ฌธ์„œ ๋‚ด์— ํฌํ•จ๋œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฆฌ์†Œ์Šค ์š”์ฒญ๊ณผ ์‘๋‹ต์ด ๊ฐœ๋ณ„์ ์œผ๋กœ ์ „์†ก๋จ
  • ์š”์ฒญํ•  ๋ฆฌ์†Œ์Šค์˜ ๊ฐœ์ˆ˜์— ๋น„๋ก€ํ•˜์—ฌ ์‘๋‹ต ์‹œ๊ฐ„๋„ ์ฆ๊ฐ€ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์Œ

 

HTTP/2

  • 2015๋…„์— ๋ฐœํ‘œ
  • ์ปค๋„ฅ์…˜๋‹น ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์š”์ฒญ๊ณผ ์‘๋‹ต์ด ๊ฐ€๋Šฅํ•จ
  • HTTP/1.1์— ๋น„ํ•ด ํŽ˜์ด์ง€ ๋กœ๋“œ ์†๋„๊ฐ€ ์•ฝ 50% ์ •๋„ ๋น ๋ฅด๋‹ค๊ณ  ์•Œ๋ ค์ ธ ์žˆ์Œ

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

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

 

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ index.html์ด ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต๋˜์—ˆ์„ ๋•Œ ํŒŒ์‹ฑ๋˜๊ณ  DOM์ด ์ƒ์„ฑ๋˜๋Š” ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
    <ul>
      <li id="apple">Apple</li>
      <li id="banana">Banana</li>
      <li id="orange">Orange</li>
    </ul>
    <script src="app.js"></script>
  </body>
</html>
  1. ์„œ๋ฒ„์— ์กด์žฌํ•˜๋˜ HTML ํŒŒ์ผ์ด ๋ธŒ๋ผ์šฐ์ €์˜ ์š”์ฒญ์— ์˜ํ•ด ์‘๋‹ต๋จ. ์„œ๋ฒ„๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์š”์ฒญํ•œ HTML ํŒŒ์ผ์„ ์ฝ์–ด ๋“ค์—ฌ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•œ ๋‹ค์Œ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๋ฐ”์ดํŠธ(2์ง„์ˆ˜)๋ฅผ ์ธํ„ฐ๋„ท์„ ๊ฒฝ์œ ํ•˜์—ฌ ์‘๋‹ต
  2. ๋ธŒ๋ผ์šฐ์ €๋Š” ์„œ๋ฒ„๊ฐ€ ์‘๋‹ตํ•œ HTML ๋ฌธ์„œ๋ฅผ ๋ฐ”์ดํŠธ ํ˜•ํƒœ๋กœ ์‘๋‹ต๋ฐ›์•„ metaํƒœ๊ทธ์˜ charset ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์— ์˜ํ•ด ์ง€์ •๋œ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์„ ๊ธฐ์ค€์œผ๋กœ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋จ. (์‘๋‹ต ํ—ค๋”์— content-type: text/html; charset=utf-8๊ณผ ๊ฐ™์ด ๋‹ด๊ฒจ ์žˆ์Œ)
  3. ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋œ HTML ๋ฌธ์„œ๋ฅผ ์ฝ์–ด ๋“ค์—ฌ ๋ฌธ๋ฒ•์  ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š” ์ฝ”๋“œ์˜ ์ตœ์†Œ ๋‹จ์œ„์ธ ํ† ํฐ๋“ค๋กœ ๋ถ„ํ•ด
  4. ๊ฐ ํ† ํฐ๋“ค์„ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•จ. (ํ† ํฐ ๋‚ด์šฉ์— ๋”ฐ๋ผ ๋ฌธ์„œ/์š”์†Œ/์–ดํŠธ๋ฆฌ๋ทฐํŠธ/ํ…์ŠคํŠธ ๋…ธ๋“œ๊ฐ€ ์ƒ์„ฑ)
  5. HTML ๋ฌธ์„œ๋Š” HTML ์š”์†Œ๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋ฉฐ HTML ์š”์†Œ์˜ ์ค‘์ฒฉ ๊ด€๊ณ„๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ ๋ชจ๋“  ๋…ธ๋“œ๋“ค์„ ํŠธ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ์ธ DOM(Document Object Mode)์œผ๋กœ ๊ตฌ์„ฑํ•จ

 

์ด์ฒ˜๋Ÿผ DOM์€ HTML ๋ฌธ์„œ๋ฅผ ํŒŒ์‹ฑํ•œ ๊ฒฐ๊ณผ๋ฌผ์ž…๋‹ˆ๋‹ค.


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

๋ Œ๋”๋ง ์—”์ง„์€ DOM์„ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ CSS๋ฅผ ํŒŒ์‹ฑํ•˜๊ณ  CSSOM์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

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

 

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ index.html์ด ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต๋˜์—ˆ์„ ๋•Œ CSS๊ฐ€ ํŒŒ์‹ฑ๋˜๊ณ  CSSOM์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

 

// HTML
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="style.css">
...


// CSS
body {
  font-size: 18px;
}

ul {
  list-style-type: none;
}
  1. ๋ Œ๋”๋ง ์—”์ง„์€ meta ํƒœ๊ทธ๊นŒ์ง€ HTML์„ ์ˆœ์ฐจ์ ์œผ๋กœ ํ•ด์„ํ•œ ๋‹ค์Œ, link ํƒœ๊ทธ๋ฅผ ๋งŒ๋‚˜๋ฉด DOM ์ƒ์„ฑ์„ ์ผ์‹œ ์ค‘๋‹จํ•˜๊ณ  link ํƒœ๊ทธ์˜ href ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์— ์ง€์ •๋œ CSS ํŒŒ์ผ์„ ์„œ๋ฒ„์— ์š”์ฒญ
  2. ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ CSS ํŒŒ์ผ์ด ์‘๋‹ต๋˜๋ฉด ๋ Œ๋”๋ง ์—”์ง„์€ HTML๊ณผ ๋™์ผํ•œ ํ•ด์„ ๊ณผ์ •์„ ๊ฑฐ์ณ CSS๋ฅผ ํŒŒ์‹ฑ
  3. CSSOM์€ CSS์˜ ์ƒ์†์„ ๋ฐ˜์˜ํ•˜์—ฌ ์ƒ์„ฑ๋จ. (body ์š”์†Œ์— ์ ์šฉํ•œ font-size ํ”„๋กœํผํ‹ฐ์™€ ul ์š”์†Œ์— ์ ์šฉํ•œ list-style-type ํ”„๋กœํผํ‹ฐ๋Š” ๋ชจ๋“  li ์š”์†Œ์— ์ƒ์†)


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

๋ Œ๋”๋ง ์—”์ง„์ด ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต๋ฐ›์€ HTML๊ณผ CSS๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ์ƒ์„ฑ๋œ DOM๊ณผ CSSOM์€ ๋ Œ๋”๋ง์„ ์œ„ํ•ด "๋ Œ๋”๋ง์„ ์œ„ํ•œ ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ ์ž๋ฃŒ๊ตฌ์กฐ"์ธ ๋ Œ๋” ํŠธ๋ฆฌ๋กœ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ๋ Œ๋” ํŠธ๋ฆฌ๋Š” ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์— ๋ Œ๋”๋ง ๋˜๋Š” ๋…ธ๋“œ๋งŒ์œผ๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, ํ™”๋ฉด์— ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋Š” ๋…ธ๋“œ์™€ CSS์— ์˜ํ•ด ๋น„ํ‘œ์‹œ๋˜๋Š” ๋…ธ๋“œ๋“ค์€ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

 

์ดํ›„ ์™„์„ฑ๋œ ๋ Œ๋” ํŠธ๋ฆฌ๋Š” ๊ฐ HTML ์š”์†Œ์˜ ๋ ˆ์ด์•„์›ƒ์„ ๊ณ„์‚ฐํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์— ํ”ฝ์…€์„ ๋ Œ๋”๋งํ•˜๋Š” ํŽ˜์ธํŒ… ์ฒ˜๋ฆฌ์— ์ž…๋ ฅ๋ฉ๋‹ˆ๋‹ค.

 

 

์ด๋Ÿฌํ•œ ๋ Œ๋”๋ง ๊ณผ์ •์€ ๋ฐ˜๋ณตํ•ด์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์˜ํ•œ ๋…ธ๋“œ ์ถ”๊ฐ€ ๋˜๋Š” ์‚ญ์ œ
  • ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์˜ ๋ฆฌ์‚ฌ์ด์ง•์— ์˜ํ•œ ๋ทฐํฌํŠธ ํฌ๊ธฐ ๋ณ€๊ฒฝ
  • HTML ์š”์†Œ์˜ ๋ ˆ์ด์•„์›ƒ์— ๋ณ€๊ฒฝ์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์Šคํƒ€์ผ ๋ณ€๊ฒฝ (width/height, margin, padding ๋“ฑ)

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

๋ฆฌ๋ Œ๋”๋ง์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


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

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์‹ฑ๊ณผ ์‹คํ–‰์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ CPU๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ €์ˆ˜์ค€ ์–ธ์–ด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ์—ญํ• 
  • ๊ตฌ๊ธ€ ํฌ๋กฌ, Node.js, V8, ํŒŒ์ด์–ดํญ์Šค์˜ SpiderMonkey, ์‚ฌํŒŒ๋ฆฌ์˜ JavaScriptCore ๋“ฑ
  • ๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ECMAScript ์‚ฌ์–‘์„ ์ค€์ˆ˜

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ๋ Œ๋”๋ง ์—”์ง„์œผ๋กœ๋ถ€ํ„ฐ ์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ๋ฐ›์•„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ•ด์„ํ•˜์—ฌ AST(์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ)๋ฅผ ์ƒ์„ฑํ•ด AST๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ค‘๊ฐ„ ์ฝ”๋“œ์ธ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

 

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

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

๊ณผ์ •์ž…๋‹ˆ๋‹ค.  (๋ ‰์‹ฑ์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•˜์ง€๋งŒ ํ† ํฌ๋‚˜์ด์ง•๊ณผ๋Š” ๋ฏธ๋ฌ˜ํ•œ ์ฐจ์ด๊ฐ€ ์žˆ์Œ)

 

ํŒŒ์‹ฑ(parsing)

ํ† ํฐ๋“ค์˜ ์ง‘ํ•ฉ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜์—ฌ AST(์ถ”์ƒ์  ๊ตฌ๋ฌธ ํŠธ๋ฆฌ)๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

 

AST๋Š” ํ† ํฐ์— ๋ฌธ๋ฒ•์  ์˜๋ฏธ์™€ ๊ตฌ์กฐ๋ฅผ ๋ฐ˜์˜ํ•œ ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, AST๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด TypeScript, Babel, Prettier ๊ฐ™์€ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

*AST Explorer ์›น์‚ฌ์ดํŠธ(https://astexplorer.net)์— ๋ฐฉ๋ฌธํ•˜๋ฉด ๋‹ค์–‘ํ•œ ์˜คํ”ˆ์†Œ์Šค ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์„œ๋ฅผ ์‚ฌ์šฉํ•ด AST๋ฅผ ์ƒ์„ฑํ•ด ๋ณผ ์ˆ˜ ์žˆ์Œ

 

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

ํŒŒ์‹ฑ์˜ ๊ฒฐ๊ณผ๋ฌผ๋กœ์„œ ์ƒ์„ฑ๋œ AST๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ค‘๊ฐ„ ์ฝ”๋“œ์ธ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋˜๊ณ  ์ธํ„ฐํ”„๋ฆฌํ„ฐ์— ์˜ํ•ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

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

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

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์—์„œ DOM API์„ ์‚ฌ์šฉํ•˜์—ฌ DOM๊ณผ CSSOM์ด ๋ณ€๊ฒฝ๋˜๋ฉด DOM๊ณผ CSSOM์€ ๋‹ค์‹œ ๋ Œ๋” ํŠธ๋ฆฌ๋กœ ๊ฒฐํ•ฉ๋˜๊ณ  ๋ณ€๊ฒฝ๋œ ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ ˆ์ด์•„์›ƒ๊ณผ ํŽ˜์ธํŠธ ๊ณผ์ •์„ ๊ฑฐ์ณ ๋ธŒ๋ผ์šฐ์ €์˜ ํ™”๋ฉด์— ๋‹ค์‹œ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. 

 

์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๋ฆฌํ”Œ๋กœ์šฐ์™€ ๋ฆฌํŽ˜์ธํŠธ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

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

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


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

๋ Œ๋”๋ง ์—”์ง„๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์ง๋ ฌ์ ์œผ๋กœ ํŒŒ์‹ฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 

 

 

์ด์ฒ˜๋Ÿผ ๋ธŒ๋ผ์šฐ์ €๋Š” ๋™๊ธฐ์ ์œผ๋กœ(์œ„์—์„œ ์•„๋ž˜ ๋ฐฉํ–ฅ์œผ๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ) HTML, CSS, JS๋ฅผ ํŒŒ์‹ฑํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ script ํƒœ๊ทธ์˜ ์œ„์น˜์— ๋”ฐ๋ผ HTML ํŒŒ์‹ฑ์ด ๋ธ”๋กœํ‚น๋˜์–ด DOM ์ƒ์„ฑ์ด ์ง€์—ฐ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์— script ํƒœ๊ทธ์˜ ์œ„์น˜๋Š” ์ค‘์š”ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์˜ ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ app.js์˜ ํŒŒ์‹ฑ๊ณผ ์‹คํ–‰ ์ด์ „๊นŒ์ง€๋Š” DOM์˜ ์ƒ์„ฑ์ด ์ผ์‹œ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ, app.js์˜ ์ฝ”๋“œ์—์„œ DOM์ด๋‚˜ CSSOM์„ ๋ณ€๊ฒฝํ•˜๋Š” DOM API๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, DOM๊ณผ CSSOM์˜ ์ƒ์„ฑ์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋ผ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="style.css">
    <script>
      /*
      DOM API์ธ document.getElementById๋Š” DOM์—์„œ id๊ฐ€ 'apple'์ธ HTML ์š”์†Œ๋ฅผ
      ์ทจ๋“ํ•œ๋‹ค. ์•„๋ž˜ DOM API๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ์ ์—๋Š” ์•„์ง id๊ฐ€ 'apple'์ธ HTML ์š”์†Œ๋ฅผ ํŒŒ์‹ฑํ•˜์ง€
      ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— DOM์—๋Š” id๊ฐ€ 'apple'์ธ HTML ์š”์†Œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค.
      ๋”ฐ๋ผ์„œ ์•„๋ž˜ ์ฝ”๋“œ๋Š” ์ •์ƒ์ ์œผ๋กœ id๊ฐ€ 'apple'์ธ HTML ์š”์†Œ๋ฅผ ์ทจ๋“ํ•˜์ง€ ๋ชปํ•œ๋‹ค.
      */
      const $apple = document.getElementById('apple');

      // id๊ฐ€ 'apple'์ธ HTML ์š”์†Œ์˜ css color ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค.
      // ์ด๋•Œ DOM์—๋Š” id๊ฐ€ 'apple'์ธ HTML ์š”์†Œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
      $apple.style.color = 'red'; // TypeError: Cannot read property 'style' of null
    </script>
  </head>
  <body>
    <ul>
      <li id="apple">Apple</li>
      <li id="banana">Banana</li>
      <li id="orange">Orange</li>
    </ul>
  </body>
</html>

 

๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํšŒํ”ผํ•˜๊ธฐ ์œ„ํ•ด body ์š”์†Œ์˜ ๊ฐ€์žฅ ์•„๋ž˜์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(<script>)๋ฅผ ์œ„์น˜์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

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

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

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

 

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

 

<script async src="extern.js"></script>
<script defer src="extern.js"></script>

 

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

 

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

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

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

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

[์ถœ์ฒ˜] ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive

https://wikibook.co.kr/mjs/

 

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋™์ž‘ ์›๋ฆฌ

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

wikibook.co.kr

https://poiemaweb.com/js-dom

 

DOM | PoiemaWeb

๋ธŒ๋ผ์šฐ์ €๋Š” ์›น ๋ฌธ์„œ(HTML, XML, SVG)๋ฅผ ๋กœ๋“œํ•œ ํ›„, ํŒŒ์‹ฑํ•˜์—ฌ DOM(๋ฌธ์„œ ๊ฐ์ฒด ๋ชจ๋ธ. Document Object Model)์„ ์ƒ์„ฑํ•œ๋‹ค. ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋Š” ์›น ๋ฌธ์„œ๋ฅผ ๋ธŒ๋ผ์šฐ์ €์— ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์›น ๋ฌธ์„œ๋ฅผ ๋ธŒ๋ผ์šฐ์ €

poiemaweb.com