GnuSmalltalkUsersGuide:AdditionalChapter8 3

From 흡혈양파의 번역工房
Revision as of 10:39, 1 February 2014 by Onionmixer (talk | contribs) (GSUG DTDs 사용하기 페이지 추가)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
DTDs 사용하기

DTDs 사용하기

필자가 첫 XML 프로젝트(이번 프로젝트)에서 차마 인지하지 못한 것은 들어오는 XML의 포맷을 검증하기 위해 얼마나 많은 오류 검사를 실행했는가였다. 검사 도중에 필자는 그 자리에 있어야 하지만 여러 가지 이유로 인해 존재하지 않는 속성이나 요소를 알아보았다. 정신없이 빨리 코딩을 했기 때문에 일부는 못 보고 지나치기도 하고 일부는 그냥 건너뛰기도 했다. 검사는 이러한 나의 부주의를 재빨리 인식했고, 필자의 애플리케이션은 선거 위원회가 차드(chad)를 내던질 때보다 빠르게 예외를 던지기 시작했다.


최소한 포맷팅에 있어서 해결책은 XML 포맷을 설명하는 문서 타입 정의(DTD)에 있었다. DTD의 구문에 관해서는 XML 명세에서 읽을 수 있다.


VisualWorks에서는 들어오는 XML가 DOCTYPE 문을 포함하도록 요구하는 경우를 제외하면 DTD를 어떻게 처리하는지 이해하는 프로그래머가 그다지 많지 않다. 프로그래머는 XML 파서가 오류를 발견할 때 던지는 예외를 처리하기 위해 어떤 일을 수행해야 한다.


필자는 스몰토크 예외 처리 코드의 작성과 관련해 전문가가 아니며, 애초에 잘못 포맷팅된 XML을 전송한 클라이언트에게 그러한 예외를 어떻게 보여야 하는지 결정하지 못했다. 아래 코드는 오류를 잡고(catch) 오류의 설명을 XML 응답에 넣는 작업을 무리 없이 수행할 것이다. 또한 앞서 논한 XML 문서의 빌드를 잘 보여주는 예외에 해당한다.

replyDoc := XML Document new.
replyDoc addNode: (XML Element tag: 'response').

[
    doc := XML XMLParser processDocumentString: (anIsdMessage message copyWithout: 0) a
    
] on: Exception do: [ :ex |
    replyDoc root
        addAttribute: (XML Attribute name: 'type' value: 'Exception');
        addNode: ((XML Element tag: 'description')
            addNode: (XML Text text: ex signal description));
        addNode: ((XML Element tag: 'message')
            addNode: (XML Text text: ex messageText))
    ].


앞서 필자는 DTDs를 처리할 수 있는 프로그래머가 그다지 많지 않다고 말했지만 VW의 XML 라이브러리가 수행했으면 하는 일들이 몇 가지 있다:


내가 빌드한 문서가 올바로 빌드되길 원한다. DTD를 빈 XML 문서로 부착하여 부적절한 요소가 추가 시 예외가 던져지면 좋을 것이다.


들어오는 XML를 파싱할 때 XML 파서가 어떤 DTD를 이용해야 하는지를 명시하여 들어오는 XML이 항상 <!DOCTYPE> 태그를 포함하지 않아도 되면 좋을 것이다. XML 텍스트 시작에 태그를 추가하기가 그리 까다롭진 않지만 그렇다고 그다지 단순한 작업도 아니다. <!DOCTYPE> 태그를 추가하기 전에는 XML의 루트 요소를 알아야 할 필요가 있지만 XML을 파싱하기 전까지는 사실상 알 수 없다. XML을 파싱하고, 루트 태그를 결정한 후, 첫 번째 문서의 출력(output)을 유효성이 켜진(validation turned-on) 새 XML 문서로 파싱해야 한다.


잇따른 파싱을 이용해 DTD 문서를 생성할 수 있는 또 다른 방법은 동일한 DTD을 계속해서 파싱 시 오버헤드를 피하는 것이다. 거래처리시스템에서는 이러한 유형의 중복 작업을 제거할 수 있으며, 여분의 CPU 사이클이 더 잘 사용된다.


Notes