◎ XML문서의 구조를 표현하기 위한 방법
: DTD방식, XML스키마 방식 등이 있다.


◎ DTD방식
: DTD는 SGML시절부터 오랜 동안 사용되어 왔지만 여러 가지 문제점들을 가지고 있다.

ο DTD를 위한 문법을 배워야한다는 어려움이 있다.
    => XML문법이 아닌 다른 문법 형태로 기술해야 한다.
ο DTD는 제한된 데이터 타입만 지원하고 있기 때문에 문서의 내용을 정확하게 표현하기 어렵다.
   => 예로, 원소는 다른 원소나 PCDATA 타입만 사용가능하고
       속성은 CDATA, ID, ENTITY 등의 데이타 타입만 가질 수 있다.
ο DTD는 재사용성이나 확장성이 부족하다.
    => 기존에 작성한 DTD의 일부원소나 속성을 재사용하는 방법이 매우 제한적이다.
ο 그리하여, XML문서의 구조를 표현할 때 DTD의 문제점을 해결하기 위해서 W3C에서 개발한 것이 XML 스키마(Schema)이다.


◎ XML 스키마 방식
: XML문법을 이용해서 문서의 구조를 표현할 수 있는 방법.

ο 2001년 5월 표준화 됨
ο 문서 작성자가 문서의 구조와 사용 가능한 데이터 타입을 정의할 수 있다.
ο 유효성을 체크하는 XML파서는 XML문서가 XML스키마의 규칙을 따르고 있는지 체크할 수 있다.
ο XML 스키마의 네임스페이스는 http://www.w3.org/2001/XMLSchema이다.
ο XML 스키마 인스턴스의 네임스페이스는 http://www.w3.org/2001/XMLSchema-instance이다.
ο XML스키마는 아래와 같은 규칙으로 작성할 수 있다.
    1) XML스키마는 XML문서로 되어 있기 때문에 XML선언을 기술한다.
    2) XML 스키마의 가장 상위 원소는 schema이고, 네임스페이스를 사용한다.
    3) 스키마에서 원소를 선언할 때는 element라는 원소를 이용하고, 모든 element는 데이타 타입을 기술하여야 한다.
ο 예제
  : (1) 다음과 같은 블로그 정보를 표현하는 XML문서를 생각해보자.
 blog.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <blog>
         <title>2% able</title>
         <description>나날이 자라기, 관찰하고 기록하기</description>        
         <author>epro</author>
         <createdate>2007.01.01</createdate>
         <today>123</today>
    </blog>

 (2) blog.xml을 위한 XML스키마는 다음과 같이 작성할 수 있을 것이다.
blog.xsd

<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <xsd:element name="blog">
        <xsd:complexType>
              <xsd:sequence>
                    <xsd:element name="title" type="xsd:string" />
                    <xsd:element name="description" type="xsd:string" />
                    <xsd:element name="author" type="xsd:string" />
                    <xsd:element name="createdate" type="xsd:string" />
                    <xsd:element name="today" type="xsd:int" />
              </xsd:sequence>
        </xsd:complexType>
   </xsd:element>
</xsd:schema>

(3) DTD를사용하는 경우에도 XML 문서에 DTD파일의 위치를 지정하는 것과 동일하게 XML 스키마를 사용하는 경우도 XML문서에 스키마 파일을 지정해 주면 된다.
 blog_schema.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <blog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="blog.xsd">
         <title>2% able</title>
         <description>나날이 자라기, 관찰하고 기록하기</description>
         <author>epro</author>
         <createdate>2007.01.01</createdate>
         <today>123</today>
    </blog>

=> 설명
<blog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="blog.xsd">
XMLSchema-instance 네임스페이스를 이용해서 스키마 파일의 위치를 기술한다는 의미.
네임스페이스를 사용하지 않는 스키마파일(blog.xsd)는 noNamespaceSchemaLocation속성을 이용해서 기술한다.


스키마란?

스키마(Schema)는 관계형 데이타베이스에서 사용되던 용어이다. 관계형 데이타베이스에서 테이블, 컬럼, 프라이머리 키 등을 정의하는 것을 스키마라고한다. 스키마는 데이타베이스의 구조를 정의하고, 실제 데이터를 기술하지는 않는다. XML에서도 문서의 구조를 정의하고, 실제 문서 내용에 대해서는 정의하지 않기 때문에 스키마라고 한다. XML에서 문서의 구조를 기술하기 위한 방법은 여러 가지가 개발되어 있다. 예를 들어 DTD, XML Schema, SOX, RELAX, XDR등이 개발되었다. 이렇게 문서의 구조를 기술할 수 있는 방법들을 스키마(schema)라고 부른다. 이중에서 W3C에서 표준화된 스키마는 XML Schema이다. 책에서 "스키마"라고 하면 일반적인 의미의 스키마를 뜻하고, "XML 스키마"라고 하면 W3C의 표준인 XML Schema를 의미한다.

- 자바 개발자를 위한 XML에서 발최 (p.5-3)


◎ Reference
- W3C XML Schema 
- 자바 개발자를 위한 XML  / 홍릉과학출판사 / 최종명 외 2인 공저