{{위키데이터 속성 추적}}
{{Infobox technology standard
| title             = 문서 객체 모델
| image             = DOM-model.svg
| caption           = HTML 문서 내의 DOM 계층의 예
| status            = 
| year_started      = 
| first_published   = {{시작 날짜와 나이|1998|10|1}}
| version           = DOM4<ref>모든 버전은 W3C DOM만을 가리킨다.</ref>
| version_date      = {{시작 날짜와 나이|2015|11|19}}
| preview           = 
| preview_date      = 
| organization      = [[월드 와이드 웹 컨소시엄]], [[WHATWG]]
| committee         = 
| editors           = 
| authors           = 
| base_standards    = [https://dom.spec.whatwg.org/ WHATWG DOM Living Standard]<br />[https://www.w3.org/TR/dom/ W3C DOM4]
| related_standards = 
| abbreviation      = DOM
| domain            = 
| license           = 
}}
{{HTML}}
'''문서 객체 모델'''({{llang|en|Document Object Model|도큐먼트 오브젝트 모델}}, DOM)은 XML, HTML 문서의 각 항목을 계층으로 표현하여 생성, 변형, 삭제할 수 있도록 돕는 인터페이스이다. [[W3C]]의 표준이다. W3C의 표준화한 [[API]]들의 기반이 된다.

DOM은 [[HTML]] 문서의 [[HTML 요소|요소]]를 제어하기 위해 [[웹 브라우저]]에서 처음 지원되었다. DOM은 동적으로 문서의 내용, 구조, 스타일에 접근하고 변경하는 수단이었다. 브라우저 사이에 DOM 구현이 호환되지 않음에 따라, W3C에서 DOM 표준 규격을 작성하게 되었다.

DOM은 문서의 기반이 되는 [[데이터 구조]]에 제한을 두지 않는다. 잘 구조화된 문서는 DOM을 사용하여 [[트리 구조]]를 얻어낼 수 있다. 대부분의 [[XML]] 해석기와 [[XSL]] 처리기는 트리 구조의 이용에 대응해 개발되었다. 이 같은 구현에서는 문서의 전체 내용이 해석되어 메모리 저장되어야 한다. 때문에 DOM은 문서 요소가 임의적으로 접근되고 변경할 수 있어야 하는 응용 프로그램에 가장 적합하다. 한 번 해석 시 단 한 번의 선택적 읽기/쓰기가 이루어지는 XML 기반 응용 프로그램에서, DOM은 메모리에 상당한 부하를 가져온다. 이 경우처럼 속도와 효율적인 메모리 소비가 중요한 상황일 경우 [[SAX]] 모델이 장점을 가진다.

== 역사 ==
문서 객체 모델의 역사는 1990년대 말 [[웹 브라우저]]의 [[자바스크립트 엔진]]에 널리 구현된 최초의 [[스크립트 언어]]들인 [[자바스크립트]]와 [[J스크립트]]의 역사, 그리고 [[넷스케이프 내비게이터]]와 [[인터넷 익스플로러]] 간 [[브라우저 전쟁]]의 역사와 뒤얽혀있다.

자바스크립트는 1995년 [[넷스케이프 커뮤니케이션스]]에 의해 넷스케이프 내비게이터 2.0과 함께 출시되었다. 넷스케이프의 경쟁사 [[마이크로소프트]]는 자바스크립트의 재구현체인 JScript와 더불어 [[인터넷 익스플로러 3]]을 이듬해 출시하였으며 JScript는 [[웹 개발자]]들이 [[클라이언트 사이드]] 상호작용으로 웹 페이지를 만들 수 있게 한다. 이 언어들의 1세대에서는 사용자가 생성한 [[이벤트]]를 감지하고 HTML 문서를 수정하는 기능에 제한이 있었으므로 이를 "DOM 레벨 0", "레거시 DOM"이라고 부르게 되었다. DOM 레벨 0을 위해 어떠한 독립적인 표준도 개발되지 않았으나 [[HTML4|HTML 4]]의 사양에는 부분적으로 기술되었다.

레거시 DOM은 접근 가능한 [[HTML 요소|요소]]의 종류에 제한을 받았다. 폼, [[하이퍼링크|링크]], 이미지 요소들은 루트 문서 객체로 시작하는 계층 이름으로 참조가 가능하였다.  계층 이름은 경유되는 요소의 이름이나 일련의 색인을 이용할 수 있었다. 이를테면, [[텍스트 상자|폼 입력 요소]]는 <code>document.formName.inputName</code> 또는 <code>document.forms[0].elements[0]</code>으로 접근이 가능하였다.

이 레거시 DOM은 클라이언트 사이드 폼 유효성 확인 및 대중적인 롤오버 효과를 가능케 하였다.

1997년, 넷스케이프와 마이크로소프트는 각각 넷스케이프 내비게이터 4.0과 인터넷 익스플로러 4.0을 출시하였으며 여기에는 로드된 HTML 문서의 변경을 가능케 하는 [[동적 HTML]](DHTML) 기능 지원이 추가되었다. DHTML은 레거시 DOM 구현체에서 사용이 가능하였던 초기 문서 객체의 확장이 요구되었다. JScript가 자바스크립트에 기반을 둔 덕에 레거시 DOM 구현체들이 상당히 호환성이 좋았으나 DHTML DOM 확장은 각각의 브라우저 개발사가 병렬로 개발되었기 때문에 비호환 상태로 유지되었다.
이 DOM 버전들은 "중간 DOM"(Intermediate DOM)이라는 이름으로 알려져 있다.

[[ECMA스크립트]]의 표준화 이후 [[월드 와이드 웹 컨소시엄|W3C]] DOM 워킹 그룹은 표준 DOM 사양의 초안화를 시작하였다. "DOM 레벨 1"이라는 이름의 완성된 사양은 1998년 말 W3C 권고안이 되었다. 2005년, W3C DOM의 대부분이 공통 ECMA스크립트 지원 브라우저들에 양호하게 지원이 되었으며 이 브라우저들에는 [[마이크로소프트 인터넷 익스플로러 6|마이크로소프트 인터넷 익스플로러 버전 6]](2001년부터), [[오페라 (웹 브라우저)|오페라]], [[사파리 (웹 브라우저)|사파리]], [[게코 (레이아웃 엔진)|게코]] 기반 브라우저(예: [[모질라 애플리케이션 스위트|모질라]], [[모질라 파이어폭스|파이어폭스]], [[시몽키]], [[카미노]])가 포함된다.

== DOM 단계 ==
현행의 DOM 규격은 단계 2이다. 그러나 일부 단계 3 규격 역시 현재 W3C의 권고안이다.
; 단계 0 : DOM이 만들어지기 이전의 모든 벤더 종속적인 DOM을 포함한다. 예: <code>document.images</code>, <code>document.forms</code>, <code>document.layers</code>, <code>document.all</code>. 그러나 이것은 W3C이 공식적으로 공개한 규격이 아니며, 표준화 이전에 있던 단계를 말한다.
; 단계 1 : DOM 문서에 대한 탐색과 조정
; 단계 2 : XML [[이름공간]](네임스페이스; namespace) 지원, 필터링된 뷰(view)와 [[DOM 이벤트]].
; 단계 3 : 6가지 다른 규격으로 구성:
# 코어
# 불러와서 저장(Load and Save)
# XPath
# 보기 및 초기화(formatting)
# 요구사항
# 유효 확인

== 웹 브라우저간의 비호환 문제 ==
브라우저간의 DOM 구현의 차이 때문에 [[상호 운용성]] 문제가 생기게 되었다.

마이크로소프트의 [[인터넷 익스플로러]] 브라우저는 [[2005년]] 현재 사실상의 표준 웹 브라우저의 위치를 차지하고 있기 때문에, [[모질라]]와 같이 표준을 준수하는 브라우저에 대한 개발에 곤란한 문제가 된다. 만약 개발자가 마이크로소프트의 DOM 확장을 사용한다면 표준 준수에 대한 [[신뢰성]]을 잃을 수 있으며, 반대의 경우라면 비표준 확장을 사용하지 않음으로 생기는 기능적 제약 때문에 사용자가 이탈할 수도 있다. 얄궂게도 마이크로소프트와 [[넷스케이프 커뮤니케이션즈 코퍼레이션|넷스케이프]] 양쪽 다 표준 경쟁의 와중에서 비표준 기능을 퍼트리게 된 것에 대한 책임을 피할 수 없다. 더구나 최근의 상황을 빼면, 역사적으로 언제나 인터넷 익스플로러의 표준 지원이 넷스케이프의 그것에 비해 우위에 있었다.

만약 표준 호환 브라우저가 웹 시장에서 주목할 만한 점유율을 차지하게 된다면 이 같은 상황이 바뀌게 될 것이며, 비표준 확장을 사용하는 것이 작성자에게 상업적 불이익으로 다가올 것이라는 것에 대해서는 일반적으로 의견이 일치하고 있다.

== 같이 보기 ==
* [[문서 객체 모델 이벤트]]
* [[Simple API for XML|SAX]] - 순차적 방법으로 XML 문서에 접근/수정하는 API 집합
* [[JDOM]] - DOM, SAX, 그리고 문서를 작성을 위한 사용자 해석기를 통합한 XML용 자바 기반 문서 객체 모델

== 각주 ==
{{각주}}

== 외부 링크 ==
{{위키공용분류}}
* [https://dom.spec.whatwg.org/ DOM Living Standard] by the WHATWG
* [https://www.w3.org/DOM/ Original W3C DOM hub] by the W3C DOM Working Group (outdated)
* [https://www.w3.org/WebPlatform/WG/ Web Platform Working Group] (current steward of W3C DOM)

{{자바스크립트}}
{{W3C 표준}}
{{웹 인터페이스}}
{{전거 통제}}

[[분류:W3C 표준]]
[[분류:XML 기반 표준]]
[[분류:API]]
[[분류:HTML]]