스콧 민즈, XML in a Nutshell의 공동 저자

2000년 11월 13일 DOM Level 2가 공식적인 W3C(
World Wide Web Consortium)의 권고안(recommendation)이 되었다. DOM Level 1에서 발생한 몇 가지 문제를 수정했을 뿐만 아니라, XML 권고안의 이름공간(Namespace)도 지원한다. 이 글에서는 DOM을 처음 접하는 독자에게는 DOM(Document Object Model)에 대해 포괄적으로 소개하며, DOM Level 1에 익숙한 프로그래머에게는 쉽게 Level 2의 특성을 익힐 수 있도록 할 것이다.
DOM Core 권고안의 최신 버전은 W3C의 웹 사이트에서 볼 수 있다.
DOM이란?
DOM은 클라이언트 애플리케이션이 문서의 컨텐츠를 수정할 수 있도록 XML 파서(parser)에서 사용하는 표준 객체 인터페이스이다. 이 인터페이스에서는 계층 트리 구조의 원 문서에서 생성된 모든 정보에 접근할 수 있다. 문서 구조는 다음과 같은 특화된 인터페이스 중 한 가지로 나타난다:
- Document
- Attr
- Element
- Text
- Comment
- CDATASection
- DocumentType
- Notation
- Entity
- EntityReference
- ProcessingInstruction
위의 특화된 인터페이스에는 노드 인터페이스가 제공하는 기본적인 속성과 메소드가 있으며, 특정 XML 문서 아이템과 연관 있는 고유한 정보에 접근할 수 있다(예를 들면, ProcessingInstruction 인터페이스는 타겟과 데이터 속성을 가진다). 이렇게 해서 나타난 전문 노드는 “리스트의 리스트” 구조로 저장되어, 부모-자식(parent-child) 링크나 형제 (sibling) 링크를 가지게 된다. 다음과 같은 문서를 예로 들 수 있다:
38.9-77.03
다음에 나오는 DOM 노드 트리를 기억해 두자:
이러한 구조는 노드 인터페이스를 통해 부모, 자식, 그리고 형제 링크 사이를 옮겨 다닐 수 있다.
이름공간 지원
DOM Level 2에 새로 부가된 특성 중 가장 중요한 것은 XML 권고안의
이름공간을 지원할 수 있다는 것으로, XML 권고안은 1999년 1월 14일에 승인되었다. 이름공간을 이용하면, 하나의 문서에 여러 개의 XML 용어를 섞어서 사용할 수 있다. 가령 XHTML 페이지에
엘리먼트가 있는 책의 리스트가 있으며, XHTML 페이지에도 이란 엘리먼트가 있다고 해 보자. 이름공간이 없다면 하나의 문서 안에서 엘리먼트를 구별할 수 없다. 이름공간이 있어야만 접두사(prefix)를 사용하여, 각각 엘리먼트 태그가 이름공간 URI(Uniform Resource Identifier)와 결합할 수 있는 것이다.
접두사는 태그 이름의 URI를 사용하는 단축키이다. 접두사를 사용하면 입력하는 시간을 많이 줄일 수 있으며, 대부분의 URI에는 유효한 XML 이름 토큰이 없다. 그래서 접두사를 사용하기 전에는 특별한 xmlns 속성 접두사를 사용하여 정의를 해 두어야 한다. 다음의 예를 보자:
xmlns:svg 속성을 파싱하고 나면, svg: 접두사는 태그와 속성을 가지게 된다. DOM Level 1은 이름공간이 지원하지 않기 때문에 DOM으로 접두사가 있는 특정 태그의 이름을 알아내는 것은 애플리케이션의 몫이었다. DOM Level 2는 Level 1 메소드에서 새로운 이름공간인식 버전을 제공해서 이름공간을 지원한다:
각각의 새로운 이름공간 메소드는 namespaceURI라는 매개 변수를 더해서 메소드의 기본 버전을 확장한다. 단순히 태그 이름을 지나치는 것뿐만 아니라, 권한이 부여된 이름(이름공간 접두사가 있는 이름), 그리고 관련 URI를 지나치는 것도 가능하다. DOM은 분명히 필요한 xmlns 속성을 삽입한다.
검색
속성과 엘리먼트를 찾아내는 메소드 역시 이름공간 인식 버전을 가지고 있는데, 이를 이용하면 조회하고 있는 XML 애플리케이션과 일치하는 태그와 속성만을 찾아낸다. 앞에서 예로 들었던 XHTML 문서를 예로 들어 보자. 이 문서에는 이라는 엘리먼트가 있는 책의 리스트가 있다. 엘리먼트 인터페이스의 이름공간을 인식하는 getElementsByTagNameNS()메소드를 사용하면, 다음과 같은 이름공간 URI를 포함하는 적정한 태그를 찾아 낼 수 있다:
Element elXHTMLTitle = document.
getElementsByTagNameNS("http://www.w3.org/1999/xhtml", "title");
이와 똑같은 과정으로 특정 애플리케이션에 속하는 속성을 찾을 수 있다.
수정하기
DOM Level 1 Core의 큰 한계중 한 가지는 프로그램에 입각해서 새로운 빈 문서 인스턴스를 만들 수 없다는 것이었다. 문서 객체의 인스턴스를 얻는 유일한 방법은 지금 있는 문서를 파싱하는 것인데, 그러면 다른 애플리케이션이 제대로 작동하지 않을 수도 있다. DOMImplementation 인터페이스에는 createDocument()와 createDocumentType()이라는 두 가지 메소드가 있다. 이를 이용해서 새로운 빈 문서와 관련 DTD(문서 타입 정의)를 생성한다. 그리고 DTD는 다큐먼트 인터페이스로 조작한다. 하지만 아직도 DocumentType 인터페이스에서 DTD를 수정하지는 못하기 때문에, DOM만을 사용하여 완벽한 특성을 지니는 문서 편집기를 구현하는 것도 아직은 불가능하다.
한번에 여러 문서 띄우기
DOM API의 기본 개념 중 하나는 부모 문서 밖에는 어떤 문서 트리(하나의 노드가 있는 객체 인스턴스)도 없다는 것이다. 한 번에 여러 개의 문서를 열어 놓을 수는 있지만, 하나의 트리에서 노드를 제거하고 열어 놓은 다른 문서로 삽입하는 것은 불가능하다. Level 2는 다큐먼트 인터페이스의 새로운 importNode()를 제공한다. 임포팅하는 대신에 소스 다큐먼트의 명시된 부분을 복사해서 타겟 문서 내에서 사용할 수 있도록 한다.
맺음말
Level 2에서는 이름공간과 문서 편집을 지원한다는 것 외에도 Level 1에서 발생하는 큰 문제(특정 Attr 노드가 속하는 엘리먼트를 결정할 수 없는 것과 같은 문제)를 많이 수정했다. DOM이 최종 목표에 도달하려면 아직 갈 길이 멀지만, XML의 인기가 급상승하고 있기 때문에 새로운 특성에 대한 요구도 함께 증가할 것이다. 하지만 XML의 인기와 새로운 애플리케이션과 함께 사용할 수 있는 구현의 수도 많다는 것을 감안하면, 앞으로 DOM은 모든 XML 프로그래머의 툴킷의 중요한 일부가 될 것이다.