메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

한빛랩스 - 지식에 가능성을 머지하다 / 강의 콘텐츠 무료로 수강하시고 피드백을 남겨주세요. ▶︎

IT/모바일

엔티티로 XML 체계화하기

한빛미디어

|

2001-07-20

|

by HANBIT

11,168

by 에릭 레이(Erik Ray), XML 시작하기의 저자 엔티티는 마법과 같지만, 잘 사용하지 않는 XML 툴이다. 엔티티는 조용하면서도 기품 있게 복잡한 문서를 체계화하고, 시간을 절약해 주며, 반복되는 입력을 줄여 주고, 일관성을 유지해 주며, XML로 다양한 것을 할 수 있게 한다. HTML에서 앰퍼샌드(&) 등의 특정 문자를 코딩하는 데 엔티티를 제한적으로 사용해서, 파서가 이 문자를 혼동하지 않도록 하는 것을 본 적이 있을 것이다. 하지만 XML 파워 유저가 아니라면, 엔티티가 보여 주는 모든 마법을 알지 못할 것이다. 기본적인 사항 우선 기본적인 것들을 살펴 보자. XML 권고안(Recommendation)† 에 따르면, "XML 문서는 엔티티(entities)라고 하는 하나 이상의 저장 단위로 구성된다…." 그러니까 엔티티란 텍스트와 마크업(이를 혼합 컨텐츠라고 한다)의 한 조각이거나, 기본적으로 XML 문서의 한 부분집합이란 뜻이 된다. 전체 문서는 문서 엔티티라고 한다. (문서 형 선언[DTD]은 또 다른 엔티티이다.) XML 저자에게 더욱 흥미를 끌 만한 것은 엔티티에 포함되는 더 작은 비트와 조각이다. 모든 엔티티를 명명하여(문서와 이의 DTD 제외), 필요할 때 혼합 컨텐츠(mixed-content) 텍스트의 세그먼트를 요청할 수 있다. 곧 보게 되겠지만, 건조한 텍스트를 삽입하는 것부터 여러 페이지에 걸쳐 하나의 문서를 만드는 것까지 명명된(named) 엔티티를 위한 여러 애플리케이션이 있다. 일반 엔티티(General Entities) 명명된(혹은 일반) 엔티티를 사용하려면, 우선 엔티티 선언이라는 구문에서 이를 사용할 것임을 나타내야 한다. 엔티티는 대개 DTD의 내부 서브셋(internal subset)에서 선언한다. 이는 문서의 꼭대기에 있는 부분으로, 태그 안에 있다. 다음은 "friend"라는 일반 엔티티를 선언한 문서의 한 예이다.
<?xml version="1.0"?>
<!DOCTYPE memo
[
  <!ENTITY friend "Samuel Jeremiah Bagpipe-Grubbins">
]>
<memo priority="normal">
  <from>Julie</from>
  <to>roommates</to>
  <message>
My good friend, &friend;, will be stopping by to feed 
and talk to my goldfish while I"m away. I"ve given &friend; 
a set of keys and told him how to work the alarm. So please 
make &friend; feel at home when he"s here. Thanks. 
  </message>
</memo>
이 문서에서는 "Samuel Jeremiah Bagpipe-Grubbins" 텍스트에 대해 "friend"라는 엔티티를 선언했다. 나중에 &friend;라는 형식으로 엔티티 참조가 될 것이다. 앰퍼샌드(&)와 세미콜론(;)를 써 주면, XML 파서는 그 안의 단어를 엔티티 참조로 인식하게 된다. (&가 엔티티 참조에서는 특별한 의미를 지니고 있으므로, &를 문자로 사용할 때에는 엔티티 &라고 써 줘야 한다.) XML 파서가 이 문서를 읽어 들이면, 엔티티 참조는 자동으로 엔티티의 정의된 텍스트로 대체된다. 이것은 텍스트 비트를 저장 및 검색(retrieve)하는 강력한 방법이다. 이렇게 하는 이유는 다음과 같다.
 XML 파워 유저가 아니라면, 엔티티가 보여 주는 모든 마법을 알지 못할 것이다.
  • 일관성을 유지하기 위함이다. 반복적인 텍스트를 대신해 주는 엔티티를 사용하면 모든 인스턴스(instance)가 똑같아 질 것이다. 이는 Sam의 긴 이름처럼 복잡하고 쓰기 힘든 것에 유용하다.
  • 자주 변하는 정보를 표현하기 위함이다. 마지막 순간에 Julie의 친구인 Sam이 금붕어 돌보는 일을 하지 않겠다고 해서, Julie가 다른 사람을 물색한다면 memo의 내용을 금방 바꿀 수 있어야 할 것이다. 여기에서는 세 군데의 이름을 바꾸는 대신, 엔티티 선언만 바꿔 주면 된다. 물론 세 군데 이름을 바꾸는 건 하찮은 일일 수 있지만, 방대한 문서에서는 같은 이름이 수백군데 등장할 수도 있으므로, 엔티티가 수고를 덜어 준다.
  • 반복적으로 입력하는 것을 줄여 준다. Sam의 긴 이름 대신, "friend"라고 입력하는 게 훨씬 쉽다. 이처럼 같은 텍스트를 계속 입력해야 할 때 엔티티 참조를 사용하는 게 낫다.
외부 엔티티(External Entities) 엔티티의 가장 중요한 역할은 문서에 다른 파일의 텍스트를 삽입할 수 있다는 것이다. 외부 엔티티는 위에서 살펴본 일반 엔티티와 약간 달라서 대체될 텍스트는 외부 파일에 있다. 선언에서 파서가 텍스트를 어떻게 찾는지, 즉 텍스트가 같은 컴퓨터 시스템의 다른 위치에 있는지, 아니면 인터넷의 다른 시스템 어딘가에 있는지를 나타내 줘야 한다. 이 말이 링킹(HTML의 하이퍼링크와 같은)을 설명하는 것으로 이해했다면, 일부만 맞다고 할 수 있다. 이는 사실 하나의 문서를 다른 것에 링크하는 것이 아니라, 문서의 세그먼트를 서로 링크하는 방법인 것이다. XML 파서가 대체 텍스트를 발견하여 외부 엔티티 참조가 발견된 곳에 넣으면, 파서는 이 대체 텍스트가 원래 그 자리에 계속 있었던 것처럼 생각한다. 그래서 사용자는 외부 엔티티가 다른 파일에서 끌어 들어 온 것임을 모르게 된다(알 필요도 없다). 이는 XML의 링킹 패러다임인 XLink†† 와는 사뭇 다르다. XLink는 문서가 별개의 문서를 서로 링크하는 방법을 정의하는데, 이 때 사용자와 상호작용을 하게 된다(파란색 글씨를클릭하는 것과 같은). 다음 예는 Dr. Wyse라는 사람이 실험 보고서를 썼다고 상상해서 작성해 본 것으로, 이 문서는 여러 파일에 내용이 나뉘어 있다.
<?xml version="1.0"?>
<!DOCTYPE report
[
  <!ENTITY abstract     SYSTEM "abs.xml">
  <!ENTITY data         SYSTEM "dat.xml">
  <!ENTITY analysis     SYSTEM "ana.xml">
  <!ENTITY conclusion   SYSTEM "con.xml">
  <!ENTITY bibliography SYSTEM "bib.xml">
  <!ENTITY appendix     SYSTEM
      "http://www.scistuff.org/pub/info/tables/tbl34.xml">
  <!ENTITY bio          SYSTEM "/home/penny/bio.txt">
  <!ENTITY header       PUBLIC 
      "-//SCILAB//XML Corp Banner v1.3//EN" 
      "/company/boilerplate/banner3.xml">
  <!ENTITY equations    SYSTEM "/company/sci/eqs.ent">
  &eqs.ent;
]>
<report>
  <date>2001.04.13</date>
  <author>Dr. Penny Wyse<author/>

  <!--주 문서 부분 -->

  &header;         <!-- 회사 로고, 이용에 관한 조항, 기타 -->
  &abstract;       <!-- 실험 개관 -->
  &data;           <!-- 실험 결과를 큰 표로 나타냄 -->
  &analysis;       <!-- 그래프, 다이어그램, 방정식, 차이 -->
  &conclusion;     <!-- 나름대로의 결론-->
  &bibliography;   <!-- 인용 및 찾아 보기 -->
 <appendix>
    <title>Isotopic Measurements for Einsteinium</title>
    &appendix;     <!-- 인터넷에서 발견한 유용한 소스 -->
  </appendix>
  <colophon>       <!-- 짤막한 경력-->
    <authorbio>
      &bio;
    </authorbio>
  </colophon>
</memo>
우선 눈에 띄는 것은 이 예에 내용이 없다는 것이다. 내용은 모두 어디에 있는가? 엔티티를 적절하게 사용해서 Dr. Wyse는 여러 파일에 내용을 모두 흩뿌려 놓았다. 보고서의 헤더는 시스템의 한 파일에 있는 boilerplate의 일부이다. Abstract에서 bibliography까지 중요한 컴포넌트는 여기에 나타난 파일과 같은 위치에 있는 파일이다. Dr. Wyse는 또한 appendix에서 테이블을 포함시키고 있는데, 이는 인터넷에서 발견한 것이다. 마지막으로 Dr. Wyse는 자신의 개인적인 정보를 기록해 놓은 홈 디렉토리의 bio를 포함하고 있다. 두 번째로 보게 되는 것은 Dr. Wyse가 여러 종류의 외부 엔티티 선언을 사용했다는 점이다. 선언의 종류를 선택하는 문제는 리소스에 접근하는 방법에 따라 다르다. 첫 번째 선언은 시스템 식별이름(system identifier)으로, URL이나 인터넷의 파일에 대한 경로이다. 두 번째는 공식 식별이름(public identifier)으로, 모두가 알아 볼 수 있으며 정확히 어디에 있는지 알 필요가 없는 리소스 이름이다. 공식 식별이름에 관해서는 세세하게 다루지 않을 것이지만, 시스템 식별이름은 리소스 위치를 나타낼 때 URL이나 파일시스템 경로를 사용하기 때문에 꽤 유용하다. XML 문서를 컴포넌트로 나누기
 XML 저자에게 더욱 흥미를 끌 만한 것은 엔티티에 포함되는 더 작은 비트와 조각이다.
그렇다면 Dr. Wyse는 문서를 하나의 위치에 모아 두지 않고 왜 여러 개의 파일에 나눠 났을까? 이처럼 XML 문서를 컴포넌트로 나누는 데는 다음과 같은 몇 가지 이점이 있다.
  • 문서 부분을 체계화한다. 실험 보고서와 같은 복잡한 문서에서는 무언가를 찾는 것이 짜증나고 어렵다. 빽빽한 마크업으로 가득찬 긴 파일을 스크롤 다운하면서 섹션이 얼마나 많은가 세어 보고 싶은 사람은 없을 것이다. 위의 예와 같은 구조는 시간을 절약해 주며, 엔티티 참조로 된 문서 구조로 나타내어 여러분의 눈을 보호해 준다.
  • 문서 편집이 쉬워 진다. 문서의 규모는 계속 커진다. 수천 페이지의 책 한 권이 수백 메가비이트에 달하는 공간을 차지하는데, 이는 XML 에디터나 다른 텍스트 에디터가 처리할 수 있는 용량을 넘어선다. 중간 정도 크기의 문서도 몇 개의 파일로 쪼개 주면 편집하기가 훨씬 쉬워 진다. 예를 들어, 한 섹션만 집에서 작업할 생각이라면 이를 다운로드하는 데 훨씬 적은 시간이 소요될 것이다. 협업으로 작업하고 있다면, 나중에 내용을 합쳐야 하는 수고 없이, 각자 자신이 맡은 분야를 동시에 할 수도 있다.
  • 문서에 공통 자료를 공유할 수 있다. 이것이 외부 엔티티의 뛰어난 특성 중 하나이다. 더 이상 필요한 모든 문서에 계속 사용되는 문서 일부를 복사하지 않아도 된다. 이제는 문서가 한 곳에서 텍스트를 임포트하도록 만들면 되는 것이다. 이용에 관한 조항이라든가, 표준 저작권 페이지와 같은 boilerplate의 일부를 업데이트하려면, boilerplate가 들어 있는 파일을 편집하면 모든 문서가 이를 임포트해서 업데이트된다. 여기에서 한 가지 주의할 점이 있다면, 공공 식별이름과 같은 위치 의존적인(location-independent) 구조를 사용하지 않을 때엔, 이를 사용하는 모든 문서에서 외부 엔티티 선언을 고정하지 않은 채 임포트된 파일을 옮겨서는 안 된다는 것이다.
  • 공식 데이터 자료에 접근할 수 있다. 인터넷에는 방대한 자료가 있고, 모든 자료를 임포트할 수 있다. 여러분이 아니라도 누군가가 이 자료를 유지할 것이며, 자료는 항상 변하기 때문에 이런 식으로 정보를 배포할 수도 있다. 실험 보고서에는 eqs.ent 파일을 임포트하는 외부 엔티티 선언이 있는데, 이 파일은 MathML††† 과 같은 언어로 방정식을 정의하는 엔티티를 포함하고 있다. 자주 사용하는 내용은 계속해서 입력하는 것보다 중앙 리포지터리(central repository)에 저장하는 게 낫다. 그리고 만약 방정식 정의에 에러가 있다면, 한 곳에서 수정해서 다른 모든 곳에 반복하면 된다.
요약 엔티티는 XML의 전신인 SGML(Standardized General Markup Language)과 함께 도입되었다. 하지만 XML 저자들에게 아주 가치 있는 것으로 입증되어 더 간단한 XML 규약에도 계속 쓰이게 되었다. 엔티티의 사용을 마스터하면, XML로 문서를 작성하는 것이 더 쉬우며 더 관리하기 쉬운 작업이 될 것이다.
확장 마크업 언어(XML) 권고안은 W3C 워킹 그룹에서 작성 및 유지한다. (XML 리소스와 정보에 관한 W3C 페이지를 참조하자.) 이 문서의 두 번째 판인 버전 1.0은 온라인으로 볼 수 있다. †† XLink라고도 하는 XML 링킹 언어(XML Linking Language)는 W3C의 다른 권고안으로, 온라인으로 볼 수 있다. ††† MathML는 W3C에서 수학식 표현과 함수를 코딩하는 데 제안하는 XML 마크업 언어이다.
에릭 레이(Erik Ray)는 XML 소프트웨어 전문가이며, 오라일리의 개발자이다. 그의 아내와 다섯 마리의 앵무새와 함께 메사추세츠 소거스에 살고 있다.
TAG :
댓글 입력
자료실

최근 본 상품0