[이론] 자바스크립트 DOM 트리

강재영
5 min readJun 18, 2019

혼자서 정리하는 자바스크립트 이론

이번 포스팅에서는 웹 페이지를 제어하는 API인 DOM(Document Object Model)의 기본적인 것들을 정리해보겠습니다.

DOM 트리

웹 페이지의 모든 요소를 Document 객체가 관리합니다. 때문에 웹 페이지의 요소들을 관리하고 제어하기 위해서는 Document 객체가 웹 페이지 요소들을 잘 반영하는 자료구조를 가지고 있어야 합니다. 그래서 Document 객체 모델인 DOM은 트리 자료구조 형태를 가지고 있습니다. 트리 자료 구조는 HTML 문서를 읽어 들이고 제어하기 가장 좋은 자료구조입니다.

위의 html 파일을 브라우저에서 실행한 결과입니다.
루트란? 뿌리를 뜻합니다. 최상위 계층의 노드(덩어리)입니다.

웹 브라우저가 HTML 문서를 읽어 들이면 위에 그림처럼 Document 객체로 시작하는 DOM 트리가 만들어집니다. 트리 자료구조에서는 트리를 구성하고 있는 객체 하나를 노드(Node)라고 부릅니다. 위 그림에서 볼 수 있는 기본적인 세 가지 노드를 먼저 정리하겠습니다.

  1. 문서 노드: 보라색 도형으로 표현된 제일 위에 있는 노드가 문서노드입니다. 트리의 최상위 계층이면서 전체 문서를 가리키는 Document 객체입니다. document로 참조할 수 있으며 DOM 트리로 웹 페이지를 접근하는 시작점입니다.
  2. 요소 노드: 파란색 도형으로 표현된 노드들이 요소 노드입니다. HTML 태그에 해당되는 요소들입니다. 요소 노드는 속성 노드와 택스트 노드를 자식으로 가질 수 있습니다.
  3. 텍스트 노드: 초록색 도형으로 표현된 노드들이 텍스트 노드입니다. HTML 태그 안에 있는 텍스트들이 텍스트 노드이며 이들은 요소 노드와 달리 자식 노드를 가질 수 없습니다.
트리 자료구조는 부모-자식 관계라고 부릅니다.

트리 자료 구조에서는 기준보다 위에 있는 노드를 부모 노드라고 부르며 같은 층위에 존재하는 옆에 노드를 형제 노드라고 부릅니다. 부모 노드보다 위에 있는 노드를 조상 노드라 하고 최상위에 있는 더 이상 부모 노드가 없는 노드를 루트(뿌리)라고 합니다.

노드 객체의 프로퍼티

  • parentNode: 기준 노드의 부모 노드를 참조합니다. Document 객체일 경우 부모 노드가 없음으로 null이 됩니다.
  • childNode: 기준 노드의 자식 노드의 참조가 저장된 유사 배열을 참조합니다.(유사 배열은 NodeList 형태입니다.)
  • firstChild: 기준 노드의 첫 번째 자식 노드를 참조합니다. 자식이 없는 노드일 경우 null이 됩니다.
  • lastChild: 기준 노드의 마지막 자식 노드를 참조합니다. 마찬가지로 자식이 없는 노드일 경우 null이 됩니다.
  • nextSibling: 기준 노드와 같은 부모 노드를 가진 다음 형제 노드를 참조합니다.
  • previousSibling: 기준 노드와 같은 부모 노드를 가진 이전 형제 노드를 참조합니다.
  • nodeType: 노드 유형을 뜻하는 숫자를 참조합니다.(요소 노드:1, 텍스트 노드: 3, Document:9)
  • nodeValue: 텍스트 노드일 경우 텍스트 콘텐츠를 리턴합니다. 요소 노드는 null를 반환합니다.

노드 객체의 프로퍼티를 이용해서 조상, 부모, 자식, 형제 노드에 접근할 수 있습니다.

HTML 요소의 트리

만약 HTML 문서 안의 태그 요소에만 관심이 있다면 위에 노드 객체의 프로퍼티는 불편할 수 있습니다. 왜냐하면 트리 자료 구조 속에 텍스트 노드를 고려해야 하기 때문입니다. 그래서 DOM 트리 안의 텍스트 노드르 무시하고 HTML 문서에 요소의 계층 구조만 가져오는 프로퍼티가 있습니다.

  • childNodes: 기준 노드의 자식 요소 참조를 저장한 유사 배열 객체(NodeList)입니다.
  • parentElement: 기준 노드의 부모 요소 객체를 참조합니다.(텍스트 노드는 제외)
  • firstElementChild: 기준 노드의 첫 번째 자식 요소 객체를 참조합니다.(마찬가지로 텍스트 노드와 공백 노드 모두 제외합니다.)
  • lastElementChild: 기준 노드의 마지막 자식 요소 객체를 참조합니다.
  • nextElementSibling: 기준 노드와 같은 부모를 가진 다음 형제 노드 객체를 반환합니다.
  • previousElementSibling:기준 노드와 같은 부모를 가진 이전 형제 노드 객체를 반환합니다.
  • childElementCount: 기준 노드의 자식 요소 개수를 반환합니다. (children.length와 같습니다.)

--

--