HTML - DOM에 대해서

HTML

HTML에 대해 깊이 있게 공부하기 위해 만든 tag이다.


최근에 html을 제대로 공부하기 시작했다. 그 첫번째가 바로 DOM이었다. 대충 이런게 있다고만 들었지 정확히 뭔지는 잘 모르고 있었기에 이번 기회에 정리를 해보려고 한다.

지금 보시는 이 포스팅은 WIT블로그MDN Web Docs의 글을 보고 정리하여 쓴 것입니다.

What is DOM?

DOM(Document Object Model) : HTML, XML 문서(웹 페이지)의 프로그래밍 interface이다. DOM은 문서의 구조화된 표현을 제공하며 프로그래밍 언어가 DOM 구조에 접근할 수 있는 방법을 제공하여 그들이 문서 구조, 스타일, 내용 등을 변경할 수 있게 돕는다. DOM 은 구조화된 nodes와 property 와 method 를 갖고 있는 objects로 문서를 표현한다. 이들은 웹 페이지를 스크립트 또는 프로그래밍 언어들에서 사용될 수 있게 연결시켜주는 역할을 담당한다.

기본적으로 페이지에 대한 API이며 프로그램이 페이지의 내용, 구조, 스타일을 읽고 조작할 수 있게 해준다. DOM은 웹 페이지의 객체지향 표현이며 JS와 같은 언어를 이용해 DOM을 수정할 수도 있다.


웹 페이지는 어떻게 생성될까?

브라우저가 HTML을 읽은 후, style을 입히고 대화형 페이지로 만들어 뷰 포트에 표시하기 까지의 과정을 Critical Rendering Path라고 한다.


Critical Rendering Path는 크게 2단계로 나뉠 수 있다.

  1. 브라우저는 읽어드린 문서를 parsing하여 최종적으로 어떤 내용을 rendering할지 결정한다. 이 과정에서 Render Tree가 생성된다.
  2. 해당 rendering을 수행한다.


DOM은 어떻게 생성될까?

DOM의 개체 구조는 Node Tree로 표현된다. 아래와 같은 예시를 보면 이해가 빠르다.

<html>
  <head>
    <title>Web Page Title</title>
  </head>
  <body>
    <h1>Hello World!!</h1>
    <p>I love HTML!!</p>
  </body>
</html>

와 같은 HTML document가 있다고 해보자. DOM은 이와 같은 HTML의 구조화된 표현이다.(아래)

html
∟ head
  ∟ title
    ∟ Web Page Title
∟ body
  ∟ h1
    ∟ Hello World!!
  ∟ p
    ∟ I love HTML!!


DOM이 아닌 것

  1. DOM은 HTML이 아니다.

    • 작성된 HTML이 유효하지 않은 상황

      DOM은 유효한 HTML의 interface이다. DOM을 생성하는 동안 브라우저는 유효하지 않은 HTML 코드를 올바르게 교정해준다.

      <html>
        Hello HTML
      </html>
      

      HTML의 필수 규칙 사항인 <head>, <body> tag가 빠져있다. 따라서 해당 HTML code는 유효하지 않다. 그러나 생성된 DOM을 보게 되면,

      html
      ∟ head
      ∟ body
        ∟ Hello HTML
      

      과 같이 올바른 형식으로 나타나게 된다. 따라서 DOM은 HTML이다라는 말은 틀렸다.

    • Javascript에 의해 DOM이 수정되는 상황

      DOM은 HTML 문서의 내용을 볼 수 있는 인터페이스 역할을 하는 동시에 동적 자원이 되어 수정될 수 있다. 그렇게 되면 DOM은 업데이트 되지만 HTML 문서의 내용은 변경시키지 않는다. 따라서 DOM은 HTML이다라는 말은 틀렸다.

  2. DOM은 브라우저에서 보이는게 아니다.

    브라우저의 뷰 포트에 보이는 것은 Render Tree 로 DOM+CSSOM의 조합이다. 그렇다면 뭐가 다르냐?

    Render Tree는 ‘rendering되는 요소들’만 관련있기에 시각적으로 안보이는 요소는 제외된다. 따라서 DOM은 시각적인 것에 상관없이 구조화하여 나타내고 있기에 다르다.

  3. DOM는 개발도구에서 보이는게 아니다.

    CSS의 가상요소는 CSSOM과 Render Tree의 일부를 구성한다. 그러나 기술적으로 DOM의 일부는 아니다.

    → DOM은 오직 원본 HTML로 부터 빌드되고, 요소에 적용되는 style은 포함하지 않기 때문이다.


요약 정리