DOM이란 Document Object Model의 약어이다. DOM은 HTML, XML 문서의 프로그래밍 인터페이스라고 할 수 있다. 문서의 구조화된 표현을 제공함으로써 프로그래밍 언어가 DOM 구조에 접근할 수 있도록 해주는 매우 중요한 역할이다. 개발자는 DOM 구조에 접근하여 문서 구조를 바꾸거나 스타일과 내용 등을 변경하고 이벤트를 연결시키는 등 다양한 작업을 수행할 수 있다. 우리가 흔히 쓰는 javascript
언어를 통해 HTML 태그를 변경/추가/삭제하고 CSS 스타일을 바꾸고 조정하는 것이 DOM이 중간에서 연결해주는 역할을 하기때문에 가능하다고 할 수 있다. DOM 프로그래밍 언어는 아니지만 DOM 없이는 자바스크립트가 웹페이지 또는 XML 페이지의 요소들에 대한 정보를 가지고 접근하여 조작하는 것이 불가능하다.
위 그림에서 확인 할 수 있는 것처럼 문서안의 모든 element
는 문서를 위한 DOM의 한 부분이다. 이렇게 트리형으로 구조화 되어있기 때문에 자바스크립트와 같은 스크립팅 언어로 원하는 element
에 접근하여 조작이 가능한 것이다. 과거에는 자바스크립트와 DOM이 더 밀접했지만 현재는 분리되어 발전하고 있다. DOM은 자바스크립트가 아닌 다른 언어를 통해서도 충분히 가능하다.
DOM은 프로그래밍 언어가 DOM에 접근하고 수정할 수 있도록 방법을 제공하는데, 일반적으로는 프로퍼티와 메서드를 가지고 있는 자바스크립트 객체로 제공한다. 이것이 DOM API이다. 정적인 웹페이지에 접근해서 동적으로 변경하기 위해서는 메모리 상의 DOM을 변경하는 것인데, DOM을 조작하는데 필요한 것이 DOM API라고 생각하면 된다.
브라우저는 HTML 문서를 로드하고 해당 문서에 대한 모델을 메모리에 생성하는데, 이때 생성되는 트리 모양의 모델이 DOM tree이다.
<!DOCTYPE html>
<html>
<head>
<style>
.red { color: #ff0000; }
.blue { color: #0000ff; }
</style>
</head>
<body>
<div>
<h1>Clubs</h1>
<ul>
<li id="one" class="blue">Chelsea</li>
<li id="two" class="red">ManUtd</li>
<li id="three" class="red">Liverpool</li>
<li id="four">Mancity</li>
</ul>
</div>
</body>
</html>
위와 같이 HTML
코드를 작성하여 브라우저가 로드 후 파싱하면 아래와 같은 DOM tree 모델을 생성하게 된다.
위의 DOM 트리를 보면서 DOM의 구조에 대해 집중해보자.
DOM에 포함된 모든 요소와 어트리뷰트, 텍스트와 같은 모든 노드는 document
객체의 자식이다. document
가 root node라고 할 수 있다. document
노드는 트리의 최상위에 위치하여 DOM tree에 접근하기 위한 시작점이다.
요소 노드는 HTML
요소를 표현한다. 요소 노드는 문서의 구조를 서술하며, 어트리뷰트나 텍스트 노드에 접근하기 위해서는 먼저 요소 노드에 먼저 접근해야 한다.
어트리뷰트 노드는 HTML
요소의 어트리뷰트를 표현하는데 어트리뷰트 노드의 경우 해당 요소의 자식이 아닌 요소의 일부로 표현된다. 어트리뷰트를 참조, 수정하려면 해당 요소 노드에 접근하면 된다.
텍스트 노드의 경우 HTML 요소의 텍스트를 표현하고, 요소 노드의 자식이다. 그리고 텍스트 노드 자체는 자식 노드를 가지는 것이 불가능하다. DOM tree의 최하위 노드라고 할 수 있겠다.
document.getElementById(id)
document.querySelector(cssSelector)
document.getElementsByClassName(class)
document.getElementsByTagName(tagName)
document..querySelectorAll(selector)
parentNode
firstChild
,lastChild
hasChildNodes()
childNodes
children
Element
요소만 반환한다.previousSibling
, nextSibling
previousElementSibling
, nextElementSibling
Element
요소만 탐색한다.DOM 을 조작하고 수정하는 DOM Manipulation에 대해서는 다음 포스트에 다루도록 하겠다.