440 likes | 815 Views
자바 개발자를 위한 XML. Chap5. XML 스키마 (Schema) 김만수. CHAPTHER 5. XML Schema Schema 소개 데이터 타입 Schema 구조 기타 예제 프로그램. 5.1 Schema 소개. DTD 의 문제점 XML 문법이 아닌 다른 문법 형태로 기술 DTD 를 위한 문법을 다시 배워야 함 제한된 데이터 타입만 지원 문서의 내용을 정확하게 표현하기 어려움 재사용성이나 확장성이 부족 XML Schema DTD 의 문제점을 해결 W3C 에서 개발
E N D
자바 개발자를 위한 XML Chap5. XML 스키마(Schema) 김만수
CHAPTHER 5 • XML Schema • Schema 소개 • 데이터 타입 • Schema 구조 • 기타 • 예제 프로그램
5.1 Schema 소개 • DTD의 문제점 • XML 문법이 아닌 다른 문법 형태로 기술 DTD를 위한 문법을 다시 배워야 함 • 제한된 데이터 타입만 지원 문서의 내용을 정확하게 표현하기 어려움 • 재사용성이나 확장성이 부족 • XML Schema • DTD의 문제점을 해결 • W3C에서 개발 • http://www.w3.org.XML/Schema • 2001년 5월에 표준화
5.1 Schema 소개 • 표준화된 Schema 문서 구성 • XML Schema Part 0: Primer • XML Schema 개발자와 응용프로그램 개발자를 위해 예제 중심으로 설명 • http://www.w3.org/TR/xmlschema-0/ • XML Schema Part 1: Structures • XML Schema에서 XML 문서의 구조를 기술하는 방법에 대한 표준을 기술 • http://www.w3.org/TR/xmlschema-1/ • XML Schema Part 2: Datatypes • XML 문서의 원소와 속성이 가질 수 있는 데이터 형태와 새로운 데이터 타입을 선언하는 방법 기술 • http://www.w3.org/TR/xmlschema-2/
XML Java Schema Class 문서 Object (Instance) 5.1 Schema 소개 • XML Schema • 문서의 구조와 사용 가능한 데이터 타입을 정의 • 유효성 체크를 위해 XML Parser는 XML 문서가 XML Schema 규칙의 준수 여부를 확인 • Schema 작성은 Java의 Class를 정의하는 것과 유사 • XML Schema의 네임스페이스 • http://www.w3.org/2001/XMLSchema • XML Schema 인스턴스 네임스페이스 • http://www.w3.org/2001/XMLSchema-instance
employee.xsd employee.java <?xml version=“1.0” encoding=“euc-kr”?> <xsd:schema xmlns:xsd=“http://www.w3.org/2001/XMLSchema”> <xsd:element name=“employee”> <xsd:complexType> <xsd:sequence> <xsd:element name=“name”type=“xsd:string”/> <xsd:element name=“id”type=“xsd:string”/> <xsd:element name=“age”type=“xsd:int”/> <xsd:element name=“dept”type=“xsd:string”/> <xsd:element name=“title”type=“xsd:string”/> <xsd:sequence> <xsd:complexType> </xsd:element> <xsd:schema> class employee { public String name; public String id; public int age; public String dept; public String title; } employee2.xml employee2.xml <?xml version=“1.0” encoding=“euc-kr”?> <employee xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:noNamespaceSchemaLocation=“employee.xsd”> <name>홍길동</name> <id>GD199703-123</id> <age>27</age> <dept>개발부</dept> <title>대리</title> </employee> class employee2 { public employee2() { employee person; person.name = “홍길동”; person.id = “GD199703-123”; person.age = 27; person.dept = “개발부”; person.title = “대리”; } }
5.1 Schema 소개 원소의 데이터 타입을 선언하는 방법 • <complexType> element를 이용한 방법 • type 속성을 이용 1 2 Schema에 준하는 문서 작성 네임스페이스 네임스페이스를 사용하지 않는 Schema이고, Schema파일은 employee.xsd 임을 명시
5.1 Schema 소개 • XML Schema와 XML 문서의 유효성 체크 • Chap2의 ValidChecker Java 애플리케이션 이용 • XMLSpy 상용 애플리케이션을 이용한 방법 • ValidChecker 사용 • 환경 변수 CLASSPATH에 다음과 같은 항목 추가 • C:\JavaSoft\xerces-2_1_0\xmlParserAPIs.jar
5.1 Schema 소개 • XMLSpy 사용 애플리케이션 사용 유효성 검사
5.1 Schema 소개 • XML Schema의 새로운 Data Type • Schema의 자식 원소로 <complexType> Element로 선언 • name 속성에 complexType 이름을 기술 재 사용성이 가능한 Data Type 선언
5.1 Schema 소개 • XML Schema에서 속성 정의 • XML Schema의 attribute Element를 이용해서 기술 • attribute도 데이터 타입을 가짐 • attribute Element의 type 속성을 이용해서 기술
5.1 Schema 소개 • DTD 구조에서 XML Schema 구조로 선언이 없을 경우 한번만 존재
5.2 데이터 타입 • 원소와 속성은 데이터 타입을 기술 • 데이터 타입의 종류 • built-in datatype • user-derived datatype 기본형(primitive datatype) 미리 정의된 타입(built-in datatype) 단순 타입(simple type) 유도형(derived datatype) 단순 타입(simple type) 제한(restriction) 사용자 정의 타입(user-derived datatype) 제한(restriction) 복합 타입(complex type) 확장(extension)
5.2 데이터 타입 • 5.2.1 미리 정의된 데이터 타입 • 개요 • XML Schema 표준에서 정의한 데이터 타입 • p. 5-10 <표 5.2> 참조 • 단순 타입(simple datatype)으로 기본형(primitive datatype)과 유도형(derived datatype)이 있음 • 단순 타입은 사용자에 의해서 확장 가능 • 기본형(primitive datatype) – 4개의 범주로 19개로 구성 • 문자열 관련 기본형 : string 등 • 바이너리 관련 기본형 : boolean, hexBinary, baasee64Binary • 숫자 관련 기본형 : decimal, float, double 등 • 날짜와 시간 관련 기본형 : duration, dateTime, date, time 등
5.2 데이터 타입 • 5.2.1 미리 정의된 데이터 타입 • 유도형(derived datatype) – 2개의 범주로 25개 구성 • string으로부터 유도된 타입 • ID, IDREF, NMTOKEN, ENTITY 등 • decimal로 부터 유도된 타입 • integer, negativeInteger, byte, short, long 등 p. 5-14 <그림 5.3> 참조
5.2 데이터 타입 • 5.2.2 사용자가 정의하는 단순 타입 • 필요한 경우에 새로운 데이터 타입을 정의 • 단순 타입과 복합 타입으로 구분 • 단순 타입 • <simpleType> Element로 정의 • XML Schema에서 정의한 다른 단순 타입을 이용해서 정의 • 내부에 원소나 속성을 포함할 수 없음 • 종류 • 단일 타입(atomic type) • XML Schema 관점에서 더 이상 나눌 수 없는 값을 갖는 데이터 • int, date, NMTOKEN 등 • 리스트 타입(list type) • 유니온 타입(union type) • 복합 타입 • complexType 원소 사용 • 내부에 다른 원소와 속성을 포함 • 속성의 데이터 타입은 항상 단순 타입만 사용
5.2.2 사용자가 정의하는 단순 타입 • 단순 타입(simple datatype) • restriction, list, union을 이용해서 확장 가능 • 제한(restriction)을 통한 타입 정의 • 기존의 단순 타입이 가질 수 있는 값의 범위를 제한하여 정의 • 새로운 타입을 정의하기 위해 restriction 원소를 사용 • 바탕이 되는 기존 단순 타입을 base 속성을 이용해서 기술 • 패싯(facet)를 이용 값의 범위 제한 형식 <simpleType final = (#all | (list | union | restriction)) id = ID name = NCName {any attributes with non-schema namespace . . . }> 값의 범위를 한 관점에서 정의 숫자인 경우 값의 범위, 문자열 경우 문자열의 길이나 패턴
5.2.2 사용자가 정의하는 단순 타입 • 제한(restriction)을 통한 단순 타입 정의 값의 범위를 지정하는 패싯 예 문자열에서 우편 번호 타입 정의 예 <xsd:simpleType name=“ScoreType”> <xsd:restriction base = “xsd:integer”> <xsd:minInclusive value = “0”/> <xsd:maxInclusive value = “100”/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name=“ZipCodeType”> <xsd:restriction base = “xsd:string”> <xsd:pattern value = “\d{3}-\d{3}”/> </xsd:restriction> </xsd:simpleType> ZipCodeType 사용 예 <xsd:element name=“address”> <xsd:complexType> <xsd:sequence> <xsd:element name=“city” type=“xsd:string”/> <xsd:element name=“street” type=“xsd:string”/> </xsd:sequence> <xsd:attribute name=“zipCode”type=“ZipCodeType”/> </xsd:complexType> </xsd:element> XML 문서 예 <address zipcode=“608-737”> <city>부산</city> <street> 대연3동 부경대학교 </street> </address>
5.2.2 사용자가 정의하는 단순 타입 • 제한(restriction)을 통한 단순 타입 정의 • 열거형 데이터 타입(enumeration datatype) • 주어진 몇 개의 값들 중에서 하나만 골라서 사용 값의 범위를 지정하는 패싯 예 <xsd:simpleType name=“CPUType”> <xsd:restriction base = “xsd:string”> <xsd:enumeration value = “Pentium4”> <xsd:enumeration value = “Pentium3”> <xsd:enumeration value = “Pentium2”> </xsd:restriction> </xsd:simpleType> 각 데이터 타입별 사용할 수 있는 패싯들의 목록 p. 5-17 – p.5-19 참조
5.2.2 사용자가 정의하는 단순 타입 • 제한(restriction)을 통한 단순 타입 정의 • employee 예제 ‘영문 대문자 2개, 6자리 정수, 하이픈(-), 2자리 정수’ 패턴을 의미
5.2.2 사용자가 정의하는 단순 타입 • 리스트(list)를 이용한 단순 타입 확장 • 리스트 타입 • 단일 타입 값들의 집합 • NMTOKENS, IDREFS, ENTITIES 등이 대표적인 리스트 타입 • 사용자 정의 새로운 리스트 타입 생성 가능 • list 원소를 이용하여 정의 • itemType 속성은 리스트에서 사용할 수 있는 데이터 타입 기술 • 패싯 • length : 리스트 타입에서의 값의 개수 • minLength : 리스트 타입이 가질 수 있는 값의 최소 개수 • maxLength : 리스트 타입이 가질 수 있는 값의 최대 개수 리스트 타입 정의 리스트 타입의 사용 <xsd:simpleType name=“author”> <xsd:restriction base=“xsd:string”> </xsd:simpleType> <xsd:simpleType name=“authors”> <xsd:list itemType=“author”/> <xsd:simpleType> <authors> 김만수 백정원 주낙순</authors>
5.2.2 사용자가 정의하는 단순 타입 • 유니온(union)을 이용한 단순 타입 확장 • 유니온 타입 • 여러 개의 단일 타입이나 리스트 타입 주에서 한 타입을 지정해서 사용할 수 있는 방법을 제공 • <union> Element로 정의 • memberType 속성을 이용해서 사용 가능한 데이터 타입들을 기술 유니온 타입 정의 유니온 타입의 사용 <xsd:simpleType name=“author”> <xsd:restriction base=“xsd:string”> </xsd:simpleType> <xsd:simpleType name=“authors”> <xsd:list itemType=“author”/> <xsd:simpleType> <xsd:simpleType name=“writer”> <xsd:union memberType=“xsd:positiveInteger authors”> <xsd:simpleType> <writer>123</writer> <writer>김만수 백정원 주낙순 </writer>
5.2.3 복합 타입과 합성자(compositor) • 복합 타입 • 자식 원소를 갖거나 속성을 필요로 하는 데이터 타입 • <complexType> Element로 정의 형식 <complexType abstract = boolean : false block = (#all | List of (extension | restriction)) final = (#all | List of (extension | restriction)) id = ID mixed = boolean : false name = NCName {any attributes with non-schema namespace . . .}> (annotation?, (simpleContent | complexContent | ((group | all | choice | sequence) ?, ((attribute | attributeGroup)*, anyAttribute?)))) </complexType>
5.2.3 복합 타입과 합성자(compositor) • 복합 타입 • 순차(sequence) • 자식 원소들이 순서대로 나타나야 하는 경우 • <sequence> Element로 정의 형식 <sequence id = ID maxOccurs = (nonNegativeInteger | unbounded) : 1 minOccurs = (nonNegativeInteger | unbounded) : 1 {any attributes with non-schema namespace . . .}> Content : (annotation?, (element | group | choice | sequence | any)*) </sequence> <xsd:complexType name=“OrderType”> <xsd:sequence> <xsd:element name=“customer” type=“CustomerType”/> <xsd:element name=“items” type=“ItemType”/> <xsd:element name=“ship” type=“ShipAddressType”/> </xsd:sequence> </xsd:complexType>
5.2.3 복합 타입과 합성자(compositor) • 복합 타입 • 선택(choice) • 여러 개의 서브 원소중에서 하나를 선택할 수 있는 것 • <choice> Element로 정의 형식 <choice id = ID maxOccurs = (nonNegativeInteger | unbounded) : 1 minOccurs = (nonNegativeInteger | unbounded) : 1 {any attributes with non-schema namespace . . .}> Content : (annotation?, (element | group | choice | sequence | any)*) </choice> <xsd:complexType name=“PaymentType”> <xsd:choice> <xsd:element name=“currency” type=“xsd:decimal”/> <xsd:element name=“creditcard” type=“xsd:string”/> <xsd:element name=“check” type=“xsd:string”/> </xsd:choice> </xsd:complexType>
5.2.3 복합 타입과 합성자(compositor) • 복합 타입 • 그룹(group) • 여러 개의 원소들을 하나의 단위로 묶어서 사용 • <group> Element로 정의 형식 <group id = ID maxOccurs = (nonNegativeInteger | unbounded) : 1 minOccurs = (nonNegativeInteger | unbounded) : 1 name = NCName ref = QName {any attributes with non-schema namespace . . .}> Content : (annotation?, (element | group | choice | sequence | any)*) </group> • GoodsGroup은 반복 사용 • 지불 방법은 PaymentType 중에 하나를 선택 <xsd:group name=“GoodsGroup”> <xsd:sequence> <xsd:element name=“goodsid” type=“xsd:string”/> <xsd:element name=“qty” type=“xsd:nonNegativeInteger/> </xsd:sequence> </xsd:group> <xsd:complexType name=“itemType”> <xsd:sequence> <xsd:group ref=“GoodsGroup” minOccurs=“1” maxOccurs = “unbounded”/> <xsd:element name=“payment” type=“PaymentType”/> </xsd:sequence> </xsd:complexType>
5.2.3 복합 타입과 합성자(compositor) • 복합 타입 • 전체(all) • SGML의 DTD에는 있지만, XML의 DTD에는 생략 • 하위 원소들의 순서에 관계없이 서술 하기 위해 사용 형식 <all id = ID maxOccurs = 1 : 1 minOccurs = (0 | 1) : 1 {any attributes with non-schema namespace . . .}> Content : (annotation?, element*)) </all> <xsd:complexType name=“ShipAddressType”> <xsd:all> <xsd:element name=“city” type=“xsd:string”> <xsd:element name=“street” type=“xsd:string”> <xsd:element name=“phone” type=“xsd:string”> </xsd:all> </xsd:complexType>
5.2.4 복합 타입 확장 • extension을 이용한 복합 타입 확장 • <simpleContent>와 <complexContent> Element의 <extension> Child Element를 이용하여 새로운 타입을 정의 • <simpleContent> • 단순 타입을 복합 타입으로 변환하기 위해서 사용 • string 데이터 타입 element에 속성을 추가하는 경우 • 속성은 복합 타입으로만 선언이 가능 형식 형식 <simpleContent id = ID {any attributes with non-schema namespace . . .}> Content : (annotation?, (restriction | extension)) </simpleContent> <extension base = Qname id = ID {any attributes with non-schema namespace . . .}> Content : (annotation?, ((attribute | attributeGroup)*, anyAttribute?)) </extension>
5.2.4 복합 타입 확장 • extension을 이용한 복합 타입 확장 • <simpleContent> Schema <xsd:complexType name=“PriceType”> <xsd:simpleContent> <xsd:extension base = “xsd:float:> <xsd:attribute name=“currency” type= “xsd:NMTOKEN”/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> 데이터 타입 선언 예 <xsd:element name = “price” type=“PriceType”/> 문서 예 <price currency=“USD”>500.25</price> . . . . . <price currency=“WON”>25000</price>
5.2.4 복합 타입 확장 • extension을 이용한 복합 타입 확장 • <complexContent> • 복합 타입을 바탕으로 새로운 복합 타입을 정의 형식 <complexContent id = ID mixed = boolean {any attributes with non-schema namespace . . .}> Content : (annotation?, (restriction | extension)) </complexContent> 형식 <extension base = Qname id = ID {any attributes with non-schema namespace . . .}> Content : (annotation?, ((group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?))) </extension>
5.2.4 복합 타입 확장 • extension을 이용한 복합 타입 확장 • <complexContent> Schema <xsd:simpleType name="IdType"> <xsd:restriction base="xsd:string"> <xsd:pattern value="[A-Z]{2}\d{6}-\d{3}"/> </xsd:restriction> </xsd:simpleType> <xsd:complexType name="EmployeeType"> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="age" type="xsd:int"/> <xsd:element name="dept" type="xsd:string"/> <xsd:element name="title" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="id" type="IdType"/> </xsd:complexType> 문서 예 <manager id=“AJ199904-001”> <name>주낙순</name> <age>31</age> <dept>연구개발부</dept> <title>팀장</title> <subordinates>백정원 신만수</subordinates> <xsd:complexType name=“ManagerType”> <xsd:complexContent> <xsd:extension base = “EmployeeType”> <xsd:sequence> <xsd:element name=“subordinates” type=“xsd:NMTOKENS”/> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> <xsd:element name=“manager” type=“ManagerType”/> Java에서 EmployeeType를 상속 받은 ManagerType 클래스에서 ‘subordinates’멤버를 추가하는 의미와 같음
5.2.4 복합 타입 확장 • restriction을 이용한 복합 타입 확장 • 기존 데이터 타입에 제약 사항들을 기술 • <simpleContent>에서 <restriction> 형식 : p 5-32 참조 Schema <xsd:complexType name=“PhoneType”> <xsd:simpleContent> <xsd:restriction base=“xsd:string”> <xsd:pattern value=“\d{3}-\d{4}”/> <xsd:attribute name=“where” type=“HomeOffice”/> </xsd:restriction> </xsd:simpleContent> </xsd:complexType> <xsd:simpleType name=“HomeOffice”> <xsd:restriction base=“xsd:string”> <xsd:enumeration value=“home”/> <xsd:enumeration value=“office”/> <xsd:restriction> </xsd:simpleType> 데이터 타입 선언 예 <phone where=“office”>234-4567</phone>
5.2.4 복합 타입 확장 • restriction을 이용한 복합 타입 확장 • 기존 데이터 타입에 제약 사항들을 기술 • <complexContent>에서 <restriction> 형식 : p 5-33 참조 Schema <xsd:simpleType name="IdType"> <xsd:restriction base="xsd:string"> <xsd:pattern value="[A-Z]{2}\d{6}-\d{3}"/> </xsd:restriction> </xsd:simpleType> <xsd:complexType name="TopManagerType"> <xsd:complexContent> <xsd:restriction base="EmployeeType"> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="age" type="xsd:int"/> <xsd:element name="dept" type="xsd:string" minOccurs="0" maxOccurs="0"/> <xsd:element name="title" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="id" type="IdType"/> </xsd:restriction> </xsd:complexContent> </xsd:complexType> <xsd:element name="topmanager" type="TopManagerType"/> <xsd:complexType name="EmployeeType"> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="age" type="xsd:int"/> <xsd:element name="dept" type="xsd:string"/> <xsd:element name="title" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="id" type="IdType"/> </xsd:complexType> 고위 관리자(top manager)는 특정 부서에 속하지 않음
5.2.4 복합 타입 확장 • 추상 타입과 교체 • 추상 원소와 타입 • Java의 추상 클래스 사용 개념과 유사 • ‘abstract’ Attribute 값을 “true”로 지정 • 추상 원소나 데이터 타입은 XML 문서에서는 직접 사용이 불가능 상속을 통해서 사용 Schema : transport.xsd . . . <xsd:complexType name=“Vehicle” abstract=“true”/> <xsd:complexType name=“Car”> <xsd:complexContent> <xsd:extension base=“Vehicle”> </xsd:complexContent> </xsd:complexType> <xsd:complexType name=“Plane”> <xsd:complexContent> <xsd:extension base=“Vehicle”/> </xsd:complexContent> </xsd:complexType> <xsd:element name=“transport” type=“Vehicle”/> <?xml vesion=“1.0” encoding=“euc-kr”?> <transport xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:noNamespaceSchemaLocation=“transport.xsd”> <Car> . . . </Car> </transport> <?xml vesion=“1.0” encoding=“euc-kr”?> <transport xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:noNamespaceSchemaLocation=“transport.xsd”> <Plane> . . . </Plane> </transport>
5.2.4 복합 타입 확장 • 추상 타입과 교체 • 교체 그룹(Substitution Group) • Element를 다른 Element로 교체할 수 있음 Schema . . . <xsd:element name=“comment” type = xsd:string” abstract = “true”/> <element name=“shipComment” type=“string” substitutionGroup=“comment”/> <element name=“customerComment” type=“string” substitutionGroup=“comment”/> comment 대신에 shipComment 혹은 customerComment로 대신 할 수 있음
5.3 스키마의 구조 • Schema Element 형태
5.3 스키마의 구조 • element
5.3.2 element • 속성이 있는 공백 원소 • 속성을 가지는 타입은 <complexType> • 다른 원소를 포함하지 않기 때문에 <simpleContent> Schema <xsd:complexType name=“ToType”> <xsd:simpleContent> <xsd:extension base = “xsd:string”> <xsd:attribute name=“what” type=“xsd:string”/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> <xsd:element name=“to” type=“ToType”/> 데이터 타입 선언 예 <to what=“name”>홍길동</to>
5.4 기타 • 네임스페이스 • Schema 원소의 targetNamespace 속성을 이용해서 Schema에서 정의하는 원소, 속성, 데이터 타입 등에 NameSpace를 기술 가능 • 전역으로 선언된 원소, 속성, 데이터 타입은 Target Namespace에 소속 • 지역으로 선언된 원소, 속성, 데이터 타입은 Target Namespace에 포함되지 않음
5.4.1 네임스페이스 • 다른 XML 스키마에서 정의하는 원소, 속성, 데이터 타입 등을 위한 네임스페이스 이름 • 접두어 ssu에 대한 네임스페이스를 정의 • 전역으로 선언된 데이터 타입 • 다른 Schema 문서에서 참조 가능한 데이터 타입
5.4.1 네임스페이스 • Schema에서 namespace를 사용하기 xsi:schemaLocation=“타겟네임스페이스이름스키마파일이름” Request가 어느 네임스페이스에서 선언된 타입인지를 기술 안 함 네임스페이스를 기술 안 함 지역적으로 선언된 것들은 네임스페이스 접두어를 붙이지 못함
5.4.1 네임스페이스 • Schema에서 namespace를 사용하기
5.4.2 외부 스키마 사용하기 • Manager, TopManager, Employee 관계에서 • 객체지향적인 방법으로 XML 스키마를 사용하기 위해서는 Employee를 위한 스키마와 Manager, TopManager 스키마 파일을 분리 • <include>와 <import> Element를 사용 • <include> Element • 동일한 네임스페이스를 사용하는 외부 스키마를 포함 시킬 경우 • <import> Element • 다른 네임스페이스를 사용하는 외부 스키마를 사용하는 경우
5.4.2 외부 스키마 사용하기 같은 네임스페이스