๐Ÿคฟ (3) ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ณผ์ • ํƒ๊ตฌ - HTML ํŒŒ์„œ

Kayยท2023๋…„ 2์›” 28์ผ
0

Javascript

๋ชฉ๋ก ๋ณด๊ธฐ
4/12

โ€œ(1) ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ โ†’ ์›น ํ™”๋ฉด์— ๋‚˜์˜ค๊ธฐ๊นŒ์ง€ - ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ณผ์ •โ€ ์ž‘์„ฑ์„ ์œ„ํ•ด ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ณผ์ •์„ ๊ฒ€์ƒ‰ ํ•˜๋‹ค๊ฐ€ HTML ํŒŒ์„œ๋ฅผ ๊ฐ„๋‹จํžˆ ๊ตฌํ˜„ํ•œ ๋ถ„์˜ ๊ธ€์„ ์ฝ์—ˆ๋‹ค!๐Ÿซข

๋ฐ”๋กœ ์ด ๊ธ€! ๋ธŒ๋ผ์šฐ์ € ์ž‘๋™๋ฐฉ์‹ ํƒ๊ตฌ - HTML ํŒŒ์„œ(Parser) ๊ตฌํ˜„ํ•˜๊ธฐ

ํƒ๊ตฌํ•˜๊ณ  ๋” ๊นŠ์ด ํŒŒ๊ณ  ๋“ค์–ด๊ฐ€๋Š” ๋ถ„๋“ค์˜ ๋ชจ์Šต ์ง„์งœ ๋„ˆ๋ฌด๋‚˜ ๋ฉ‹์ง€๊ณ  ๋ณธ๋ฐ›๊ณ  ์‹ถ์€ ๋ชจ์Šต!

๊ณผ์—ฐ HTML ํŒŒ์„œ๋ฅผ ํ†ตํ•ด DOM ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •์€ ์–ด๋–ป๊ฒŒ ์ง„ํ–‰๋ ๊นŒ?

๊ทธ๋ฆฌ๊ณ  ๊ตฌํ˜„ํ•ด๋ณธ๋‹ค๋ฉด ์–ด๋–ค ์ฝ”๋“œ๋“ค์ด ๋‚˜์˜ฌ๊นŒ?

(์‹ค์ œ HTML ํŒŒ์„œ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์งœ์—ฌ์ง„ ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ํ•™์Šตํ•œ ํ›„ ๊ตฌํ˜„ํ•ด๋ณด๊ณ  ์‹ถ์€๋Œ€๋กœ ๊ตฌํ˜„ํ•œ ๊ณผ์ •์„ ๋‹ด์•˜์Šต๋‹ˆ๋‹ค!)
(์ด๋ฒˆ ํ”„๋กœ์ ํŠธ ๊นƒํ—ˆ๋ธŒ ์ฃผ์†Œ)

๊ทธ๋Ÿฌ๋ฉด ์‹œ์ž‘โ—๏ธ

๋ชฉ์ฐจ

  1. ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ณผ์ • ๊ฐ„๋‹จํ•œ ์ •๋ฆฌ
  2. ํŒŒ์‹ฑ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์ •๋ฆฌ
  3. ๋…ธ๋“œ ๊ตฌํ˜„ - ์ž„์˜๋กœ ๋งŒ๋“  Node ๊ณ„์ธต ํŠธ๋ฆฌ
  4. ํŒŒ์„œ ๊ตฌํ˜„ - ๋ฌธ์ž โ†’ ํ† ํฐ, ํ† ํฐ โ†’ ๋…ธ๋“œ โ†’ ๊ฐ์ฒด ๋ชจ๋ธ์˜ ๊ฐ ๊ณผ์ •

  1. ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ๊ณผ์ • ๊ฐ„๋‹จํ•œ ์ •๋ฆฌ

    ๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์„ ๋งŒ๋“œ๋Š” ๋‹จ๊ณ„์ธ ๋ Œ๋”๋ง ๊ณผ์ •์„ Critical Rendering Path๋ผ๊ณ  ํ•œ๋‹ค.

    ๊ทธ ์ค‘ HTML์„ ํŒŒ์‹ฑํ•˜์—ฌ DOM ํŠธ๋ฆฌ๋กœ ๋งŒ๋“œ๋Š” ๊ณผ์ •์€ ๋ฐ”์ดํŠธ โ†’ ๋ฌธ์ž โ†’ ํ† ํฐ โ†’ ๋…ธ๋“œ โ†’ ๊ฐ์ฒด ๋ชจ๋ธ์ด๋‹ค.

  2. ํŒŒ์‹ฑ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์ •๋ฆฌ

    2 - 1) ๋ฌธ๋ฒ•

    • ํŒŒ์‹ฑ์€ ๋ฌธ์„œ์— ์ž‘์„ฑ๋œ ์–ธ์–ด ๋˜๋Š” ํ˜•์‹์˜ ๊ทœ์น™์— ๋”ฐ๋ฅด๋Š”๋ฐ ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํ˜•์‹์€ ์ •ํ•ด์ง„ ์šฉ์–ด์™€ ๊ตฌ๋ฌธ ๊ทœ์น™์— ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค. (โ†’ ๋ฌธ๋งฅ ์ž์œ  ๋ฌธ๋ฒ•)

    2 - 2) ํŒŒ์„œ-์–ดํœ˜ ๋ถ„์„๊ธฐ ์กฐํ•ฉ

    • ํŒŒ์‹ฑ์€ ์–ดํœ˜ ๋ถ„์„๊ณผ ๊ตฌ๋ฌธ ๋ถ„์„์œผ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ์–ดํœ˜ ๋ถ„์„: ์ž๋ฃŒ๋ฅผ ํ† ํฐ์œผ๋กœ ๋ถ„ํ•ดํ•˜๋Š” ๊ณผ์ • (์‚ฌ์ „์— ๋“ฑ์žฅํ•˜๋Š” ๋ชจ๋“  ๋‹จ์–ด๋ฅผ ๋งํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.)
      • โ†’ ์–ดํœ˜ ๋ถ„์„๊ธฐ(lexical analysis)๊ฐ€ ํ•˜๋Š” ์ผ์ด๋ฉฐ ์–ดํœ˜ ๋ถ„์„์„ ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฌด์˜๋ฏธํ•œ ๊ณต๋ฐฑ, ์ค„ ๋ฐ”๊ฟˆ๊ณผ ๊ฐ™์€ ๋ฌธ์ž๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.
      • ๊ตฌ๋ฌธ ๋ถ„์„: ์–ธ์–ด์˜ ๊ตฌ๋ฌธ ๊ทœ์น™์„ ์ ์šฉํ•˜๋Š” ๊ณผ์ •
      • โ†’ ํŒŒ์„œ(parser)๊ฐ€ ํ•˜๋Š” ์ผ์ด๋ฉฐ ๊ทœ์น™๊ณผ ๋งž์ง€ ์•Š์„ ๊ฒฝ์šฐ ์—๋Ÿฌ๋ฅผ ๋‚ธ๋‹ค.

    2 - 3) ํŒŒ์‹ฑ ๊ณผ์ •

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

  1. ๋…ธ๋“œ ๊ตฌํ˜„ - ์ž„์˜๋กœ ๋งŒ๋“  Node ๊ณ„์ธต ํŠธ๋ฆฌ

    1. ์ž„์˜๋กœ ๋งŒ๋“  Node ๊ณ„์ธต ํŠธ๋ฆฌ

      (์‹ค์ œ ๋…ธ๋“œ ๊ณ„์ธต๊ณผ ํฐ ์—ฐ๊ด€์ด ์—†์œผ๋ฉฐ ๊ฒฐ๊ณผ๋ฅผ ์ •ํ•ด๋†”์•ผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋ฆ„๋Œ€๋กœ ๋งŒ๋“ค์–ด ๋ณด์•˜๋‹ค!)

      • CommonNode: Node ๊ฐ์ฒด์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ€์žฅ ์ƒ์œ„ ๊ฐ์ฒด

      • EachNode: CommonNode์˜ ํ•˜์œ„ ๊ฐ์ฒด์ด๋ฉด์„œ ElementNode ์™ธ์— ๋ชจ๋“  ํ…์ŠคํŠธ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋…ธ๋“œ

      • EachELement: CommonNode์˜ ํ•˜์œ„ ๊ฐ์ฒด์ด๋ฉด์„œ element์— ํ•ด๋‹นํ•˜๋Š” ๋ชจ๋“  ๋…ธ๋“œ

        ๊ฐ๊ฐ์˜ ๊ฐ์ฒด๋ฅผ ํด๋ž˜์Šค๋กœ ์ •์˜ํ•˜์˜€๋‹ค.

        export class CommonNode {
            depth: number;
            nodeName: string;
            nodeType: number;
            innerHTML: string;
            value: string | null;
            childNodes: Array<IEachNode | IEachElement>;
            nodeValue?: string;
            tagName?: string;
            attributes?: string;
            children?: Array<IEachNode | IEachElement>;
        
            constructor({ depth, nodeName, nodeType, innerHTML, value, childNodes }: ICommonNode) {
                this.depth = depth;
                this.nodeName = nodeName;
                this.nodeType = nodeType;
                this.innerHTML = innerHTML;
                this.value = value;
                this.childNodes = childNodes;
            }
        }
        
        export class EachNode extends CommonNode {
            constructor({ depth, nodeName, nodeType, innerHTML, value, childNodes, nodeValue }: IEachNode) {
                super({ depth, nodeName, nodeType, innerHTML, value, childNodes, nodeValue });
                this.nodeValue = nodeValue;
            }
        }
        
        export class EachElement extends CommonNode {
        
            constructor({ depth, nodeName, nodeType, innerHTML, value, childNodes, tagName, attributes, children }: IEachElement) {
                super({ depth, nodeName, nodeType, innerHTML, value, childNodes, tagName, attributes, children });
                this.tagName = tagName;
                this.attributes = attributes;
                this.children = children;
            }
        }

  1. ํŒŒ์„œ ๊ตฌํ˜„ - ๋ฌธ์ž โ†’ ํ† ํฐ, ํ† ํฐ โ†’ ๋…ธ๋“œ โ†’ ๊ฐ์ฒด ๋ชจ๋ธ์˜ ๊ฐ ๊ณผ์ •

    ๋ฌธ์ž โ†’ ํ† ํฐ, ํ† ํฐ โ†’ ๋…ธ๋“œ โ†’ ๊ฐ์ฒด ๋ชจ๋ธ์˜ ๊ฐ ๊ณผ์ •์„ ๋จผ์ € ๊ทธ๋ ค๋ณด๊ณ ์ž ํ•œ๋‹ค!

    4 - 1) ๋ฌธ์ž โ†’ ํ† ํฐ

    ์‹ค์ œ ๋ฌธ์ž โ†’ ํ† ํฐ ๋‹จ๊ณ„์—์„œ ํƒœ๊ทธ ๋ฐฐ์—ด์— depth๋ฅผ ์ฃผ๋Š” ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์•˜์ง€๋งŒ, ๊ฐœ๋ฐœ์˜ ํŽธ์˜๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ๋„ฃ์—ˆ๊ณ ,

    ์ˆœ์„œ๋ฅผ ๊ธ€๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

    4 - 2) ํ† ํฐ โ†’ ๋…ธ๋“œ


์ถœ์ฒ˜
๋ธŒ๋ผ์šฐ์ € ์ž‘๋™๋ฐฉ์‹ ํƒ๊ตฌ - HTML ํŒŒ์„œ(Parser) ๊ตฌํ˜„ํ•˜๊ธฐ
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•  ๋ธŒ๋ผ์šฐ์ €์˜ ๋™์ž‘ ๊ณผ์ •(2)
๋ Œ๋”๋ง ์—”์ง„(1) - ํŒŒ์‹ฑ๊ณผ DOMํŠธ๋ฆฌ ๊ตฌ์ถ•

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