본문 바로가기
정보과학/웹서비스특론

XML 네임스페이스

by J1소프트 2023. 9. 5.
728x90

1. 네임스페이스의 필요성

 

1.1 엘리먼트 이름 충돌

XML에서 태그를 자유롭게 정의할 수 있다는 점은 장점이 될 수 있지만, 예를 들어 문서를 공유하는 경우에는 태그가 중복되는 문제가 발생할 수 있게 된다. 중복 태그로 인해 발생할 수 있는 이름 충돌의 문제를 해결하기 위해 등장한 개념이 바로 네임스페이스(namespace) 이.

<정보>
          <이름>XML 네임스페이스</이름>
         <출판사>방송대출판부</출판사>
         <정보>
                  <이름>홍길동</이름>
                  <소속>방송대</소속>
         </정보>
</정보>

또한 네임스페이스는 각 엘리먼트명과 속성명을 정확히 인식할 수 있는 개념을 제공한다.

예를 들어, 위의 XML 문서는 책과 관련된 데이터를 표현하기 위해 <정보><이름> 엘리먼트를 사용하고, 책 저자에 관한 정보를 표현하기 위해서 <정보><이름>이라는 엘리먼트를 사용하고 있다. 이 문서는 XML 문법에는 어긋나지 않지만, 엘리먼트를 통해서 문서의 의미를 파악하는 데에는 심각한 문제가 발생할 수 있다. 왜냐하면 <정보> 또는 <이름>이라는 엘리먼트만을 통해서는 이것이 과연 책과 관련된 데이터를 표현한지 아니면 저자와 관련된 데이터를 표현하는 지를 구분이 잘 안되기 때문이다. 물론 사람이 해석할 경우에는 전체적인 내용을 보고 도서 정보와 저자 정보를 구별해 낼 수 있는 있겠지만, XML 파서는 엘리먼트의 이름만으로는 구별할 수 없게 되고 이것은 결국 파서가 XML 문서를 처리하지 못한다는 의미이다.

이러한 문제점을 어떻게 해결할 수 있을까? 엘리먼트의 이름을 모두 다르게 부여하면 쉽게 해결할 수 있다. 하지만 엘리먼트의 이름을 고유하게 주기 위해 마크업 언어를 개발하는 개발자는 고유 이름을 찾는 과정에 많은 시간을 투자해야한다. 이런 문제를 보다 용이하게 해결할 수 있는 방법이 바로 XML 네임스페이스를 적용해서 충돌되는 엘리먼트의 이름을 문서의 의미에 맞게 처리하는 것이다.

 

1.2. 네임스페이스의 기본 개념

XML 문서에서 사용되는 모든 이름을 고유하게 사용하는 것은 거의 불가능하기 때문에엘리먼트 이름 앞에 접두사를 붙여서 각 이름을 구별하는 방법을 생각해 보자. 비록 엘리먼트의 이름이 같더라도 접두사가 다르므로 엘리먼트들을 구별할 수 있을 것이다. 이것이 바로 네임스페이스의 기본 개념이다 .

엘리먼트 이름에 접두사를 붙여 작성함으로써 해당 엘리먼트가 그 네임스페이스에 속한다는 것을 표시해서 엘리먼트/속성들이 서로 고유한 이름을 가지고 있는 것처럼 보여줌으로써서로를 구분하는 방법이다.

 

앞서서 살펴본 책의 정보를 표현하는 XML 문서를 네임스페이스를 사용해서 다음과 같이 수정해보자.

<?xml version="1.0" encoding="euc-kr"?>
<도서:정보 xmlns:도서="http://www.knou.ac.kr/books"
                   xmlns:저자="http://www.knou.ac.kr/books/authors">
          <도서:이름>XML 네임스페이스</도서:이름>
          <도서:출판사>방송대출판부</도서:출판사>
          <저자:정보>
                    <저자:이름>홍길동</저자:이름>
                    <저자:소속>방송대</저자:소속>
          </저자:정보>
</도서:정보>

그림1. 인터넷익스플로러의출력결과

동일한 마크업 언어에 속하는 엘리먼트는 동일한 접두사를 붙여 주었기 때문에 어떤 엘리먼트가 도서에 대한 정보를 나타내고, 어떤 엘리먼트가 저자에 대한 정보를 나타내고 있는지 확실히 구분된다. 예를 들어, 대한민국에서 김철호라는 사람의 이름을 검색한다면 동명이인으로 인해 많은 사람이 검색될 것이다. 하지만 한국건설주식회사에 다니는 김철호

라는 사람을 찾게 되면 단 한 명만 검색할 수 있을 것이다. 이와 같이 같은 이름을 가진 김철호라는 사람을 구별하기 위해서 한국건설주식회사라는 것을 김철호라는 이름 앞에 붙여 사용할 수 있고, 이것이 바로 네임스페이스가 되는 것이다.

 

접두사:엘리먼트명과 같은 형식의 이름을 네임스페이스 권고안에서는 Qname(Qualifiedname)이라고 부른다. 실제 XML 파서에 의해서 처리하는 엘리먼트 이름은 Qname이 된다.

즉 접두사, 콜론, 엘리먼트명까지를 모두 포함해서 하나의 태그 이름으로 인식한다. 따라서 <도서:정보> (또는 <도서:이름>)<저자:정보> (또는 <저자:이름>)를 서로 다른 이름을 가진 엘리먼트로 해석한다. 결국 "도서""저자"라는 접두사는 엘리먼트를 구별하기 위해 사용되는 그룹명(이름 공간명)으로 해석할 수 있다.

 

다음 그림은 네임스페이스와 엘리먼트와의 관계를 표현한 것이다. 중복한 엘리먼트명이나 속성명을 각각 어느 이름의 공간(집합)에 소속하고 있는 가를 지정하는 것에 의해, 각각의 XML 문서의 내부에서 정의하고 있는 엘리먼트명이나 속성명을 사용할 수 있다.

그림 2. 네임스페이스와 엘리먼트의 관계

중복 가능성이 있는 엘리먼트 이름을 구분하기 위해서 네임스페이스 접두사를 사용하려면 우선 네임스페이스 선언을 해야만 한다. 그렇지 않은 경우에는 선언되지 않은 이름 공간 접두사를 참조합니다라는 오류 메시지가 출력되기 때문에 브라우저에서 문서를 확인할 수 없게 된다.

 

1.3 네임스페이스 권고안

W3C에서는 이름 충돌을 해결하기 위해 엘리먼트와 속성 이름을 세계적으로 유일하게 식별할 수 있는 새로운 메커니즘을 개발하여 그에 대한 규격을 공포하였다. 이 규격의 이름은"Namespaces in XML"이며, 1999114일에 W3C의 권고안(Recommendation)으로 채택되었다.

<참고 사이트>

Namespace in XML 권고안 (네임스페이스의 선언 및 사용 방법 기술)
http://www.w3.org/TR/1999/REC-xml-names-19990114/

2. 네임스페이스 이름

2.1 이름 지정 방법

네임스페이스 이름은 마크업 언어를 개발할 때 만들어지고, 마크업 언어당 한 개를 가질 수 있다.

물론 네임스페이스 이름이 없는 마크업 언어도 있다. 네임스페이스 이름은 URI형태로 만들어진다.

[URI]

 URI(Uniform Resource Identifiers)는 자원을 식별할 수 있는 문자열이다. 이것은 선호도에 따라 URL URN 둘 중의 하나의 형태로 사용될 수 있다.

 
URN(Uniform Resource Name)은 자원 위치와 관계없이 이름만으로 구성한 식별자이
. URL과 유사하지만 URL은 자원 위치를 표현하지 않는다.

 
URL(Uniform Resource Locators)은 웹에서 자원을 표현하기 위해 사용하는 일반적
인 방법이다.

     URI 
문법 설명 http://www.ietf.org/rfc/rfc2396.txt

     URN 문법 설명 http://www.ietf.org/rfc/rfc2141.txt
     URL 문법 설명 http://www.ietf.org/rfc/rfc1738.txt

URI로 사용할 수 있는 대표적인 형태는 URL(Uniform Resource Locator)이다. URL은 프로토콜과 인터넷 웹서버명 그리고 고유하게 부여된 도메인 이름을 결합한 형태를 말한다.

일반적으로 다음과 같이 네임스페이스 이름을 짓는다.

프로토콜명 ://웹서버명.도메인이름/작성년도/구체적인_이름
 
예를 들면 XML 스키마를 사용하기 위해서는 W3C가 정한 다음과 같은 네임스페이스 이름을 사용한다.
http://www.w3.org/2001/XMLSchema
(www:서버명 w3.org:도메인이름)

 

2.2 URL 형태로 사용하는 이유

XML 네임스페이스 스펙은 네임스페이스가 URI를 통해 식별되는데, URL이나 URN 중의 어느 것을 사용할 것인가는 사용자에게 달려있다. 하지만, URNURL보다 네임스페이스의 이름으로 더 적합해 보인다. 네임스페이스는 개념적인 자원이지 인터넷을 통해 가져올 수 있는 물리적인 자원이 아니기 때문이다. 하지만 대부분의 네임스페이스가 URN보다 URL 름을 사용하고 있는 이유는 무엇일까?

그 이유는 URN의 경우에는 그것의 유일성을 누가, 어떻게 보장할 수 있겠는가하는 문제가 여전히 남아있기 때문이다. 네임스페이스를 사용하는 목적은 각기 다른 문서 형식으로부터 가져온 엘리먼트 이름이 우연히라도 겹치지 않게 하기 위한 것이고, URL의 경우에는 이미 그 고유성을 가지고 있기 때문이다.

 

, 네임스페이스 이름을 URL 형태로 만드는 이유는 세계적으로 유일한 이름을 부여해 주기 위해서이다. 웹 사이트의 도메인 이름 자체가 세계적으로 유일한 이름을 가지기 때문에 네임스페이스 이름도 세계적으로 유일한 이름이 되는 것이다.

이러한 네임스페이스 이름은 마크업 언어를 개발할 때 이미 정해지기 때문에 XML 문서 작성자가 마음대로 바꾸어 사용할 수 없다. 그래서 특정 마크업 언어를 사용해 XML 문서를 작성하는 사람은 해당 마크업 언어가 어떤 네임스페이스 이름을 가지고 있는지 알고 있어야 한다.

만약 마크업 언어가 네임스페이스 이름을 가지고 있지 않다면 네임스페이스 선언 없이 XML 문서를 작성할 수 있지만, 네임스페이스 이름을 가지고 있다면 반드시 네임스페이스 선언을 하고 사용해야 한다. 이것은 XML 문서 작성자가 반드시 숙지해야 할 사항이다.

 

2.3 네임스페이스 URI의 실제 의미

네임스페이스 URI, 예를 들어 http://www.knou.ac.kr/xml이 사용되었다면, 이것이 실제로 의미하는 것은 무엇인가?

XML 스펙에 따르면 이 URI는 아무것도 의미하지 않는다. URI는 단지 네임스페이스의 이름을 표시하는데 사용될 뿐이며, 그 이외의 아무런 의미도 갖지 않는다. 즉 네임스페이스 URI는 각각의 네임스페이스를 식별하기 위해서만 사용된다. 따라서 네임스페이스 참조 장소의 경로에 실제 XML 문서에 관련하는 정보을 저장하고 있을 필요는 없다.


3. 네임스페이스 선언

3.1 접두사를 사용한 네임스페이스 선언 마크업 언어가 네임스페이스 이름을 가지고 있을 때 네임스페이스 이름을 접두사 자리에 바로 사용할 수 없다. 왜냐하면 네임스페이스 이름은 URI 형태를 가지고 있기 때문에 태그명으로 부적합한 문자가 올 수 있기 때문이다. 그래서 네임스페이스 이름을 대신하는 접두사를 따로 만들어 사용해야 한다.

네임스페이스의 선언이라는 것은 네임스페이스 이름과 그 이름을 대신하여 사용할 접두사와 연관 짓는 것을 말한다. 다음은 네임스페이스 선언 문법이다.

<!-- 네임스페이스 선언 -->
<엘리먼트명 xmlns:접두사="네임스페이스_이름">

<!-- 
네임스페이스 사용 -->

<접두사:엘리먼트명> ~~~ </접두사:엘리먼트명>
...
</엘리먼트명>
네임스페이스의 선언은 엘리먼트의 속성에 기술된다. 속성명은 "xmlns:접두사"이고 속성값으로 "네임스페이스 이름"이 온다. 엘리먼트에 속성이 여러 개가 있을 경우 순서에 관계 없이 속성들을 작성하면 된다.
 
네임스페이스 접두사를 지정할 때에는 다음과 같은 문법 규칙을 따라야한다.
[접두사 지정 문법 규칙 ]
1. 접두사의 첫문자는 문자(한글 포함) 또는 밑줄(_)로 시작할 수 있다. 
    두 번째 문자 이
후부터는 글자숫자하이픈(-), 결합문자 또는 확장문자 등을 사용할 수 있다.
2. 네임스페이스_이름은 xmlns:속성값을 URI로 지정한다.

: 접두사를 사용한 네임스페이스 선언

<st:student>
          <st:sid>540101</st:sid>
                    <st:name>홍길동</st:name>
                    <st:age>20</st:age>
                    <st:address>서울 서초동</st:address>
          </st:student>
</st:students>
: 여러 개의 접두사를 사용한 네임스페이스 선언
<st:students xmlns:st="http://www.xml.ac.kr/2005/xml"
                    xmlns:ps="http://www.knou.ac.kr/press"> 
          <st:student>
                    <st:sid>540101</st:sid> 
                    <st:name>홍길동</st:name> 
                    <st:age>20</st:age>
                    <st:address>서울  서초동</st:address> 
                    <ps:book>
                              <ps:title>XML이란?</ps:title>
                              <ps:price  unit="       “>9,000</ps:price>                                                                       원 
                              <ps:author>홍박사</ps:author>
                              <ps:publishing>방송대출판부</ps:publishing> 
                    </ps:book>
          </st:student> 
</st:students>
 
3.2 기본 네임스페이스 선언
 
어떤 엘리먼트에 대하여 xmlns 속성을 사용해서 네임스페이스를 선언한 경우, 그 엘리먼트 내용 중 네임스페이스 접두사를 붙이지 않고 기술한 하위 엘리먼트에도 자동으로 상위 엘리먼트에 선언한 네임스페이스가 적용된다. 이와 같은 네임스페이스를 기본 네임스페이스 라고 한다.
XML 문서 중에서 기본 네임스페이스가 선언된 경우에는 네임스페이스 접두사를 붙이지 않는다.
<!-- 기본 네임스페이스 선언 -->
<엘리먼트명 xmlns="네임스페이스_이름">

<!-- 기본 네임스페이스 사용 -->
<엘리먼트명> ~~~ </엘리먼트명>
...
</엘리먼트명>

 

: 기본 네임스페이스 선언

<?xml version="1.0" encoding="euc-kr"?>
<students xmlns="http://www.xml.ac.kr/2005/xml">

          <student>
                    <sid>540101</sid>
                    <name>홍길동</name>
                    <age>20</age>
                    <address>서울 서초동</address>
          </student>
</students>
 
위의 예제에서 <students>를 포함한 모든 엘리먼트가 http://www.xml.ac.kr/2005/xml네임스페이스를 따르게 된다. 만일, 모든 엘리먼트가 단 하나의 네임스페이스를 공통적으로 따르면 기본 네임스페이스로 선언해서 사용하는 것이 효과적이다.

: 여러 개의 기본 네임스페이스를 사용한 경우

<students xmlns="http://www.xml.ac.kr/2005/xml">
          <student>
                    <sid>540101</sid> 
                    <name>홍길동</name> 
                    <age>20</age>
                    <address>서울  서초동</address>
                    <book  xmlns="http://www.knou.ac.kr/press"> 
                              <title>XML이란?</title>
                              <price  unit="        “>9,000</price>                                                           원 
                              <author>홍박사</author>
                              <publishing>방송대출판부</publishing> 
                    </book>
          </student> 
</students>

위와 같은 경우에는 속성을 제외한 <book>, <title>, <price>, <author>, <publishing> 엘리먼트는 ‘http://www.knou.ac.kr/press네임스페이스를 따르고, 나머지 엘리먼트들을 http://www.xml.ac.kr/2005/xml를 따른다.

: 기본 네임스페이스로 선언하고 하위 엘리먼트에서 접두사를 이용해서 네임스페이스를 선언한 경우

<students  xmlns="http://www.xml.ac.kr/2005/xml">
          <student>
                    <sid>540101</sid> 
                    <name>홍길동</name> 
                    <age>20</age>
                    <address>서울  서초동</address>
                    <ps:book  xmlns:ps="http://www.knou.ac.kr/press"> 
                              <ps:title>XML이란?</ps:title>
                              <ps:price  unit="       “>9,000</ps:price>                                                                       원 
                              <ps:author>홍박사</ps:author>
                              <ps:publishing>방송대출판부</ps:publishing> 
                    </ps:book>
          </student> 
</students>
기본 네임스페이스는 네임스페이스 접두사를 붙이지 않은 엘리먼트에만 적용하고, 네임스페이스 접두사가 붙어 있는 속성에는 적용하지 않는다. 따라서, 위와 같은 예제에서 <book>을 포함한 하위 엘리먼트들을 접두사를 가지고 있기 때문에 상위 엘리먼트에서 선언된 기본 네임스페이스가 적용되지 않는다.

 

3.3 속성에 네임스페이스 선언

이름 충돌은 엘리먼트명 뿐만 아니라 속성명에서도 발생할 수 있다. XML 네임스페이스에서는 네임스페이스 접두가가 붙어 있지 않은 속성에는 그 속성을 정의해 있는 엘리먼트가 속하는 네임스페이스를 적용한다. 따라서 어떤 속성에 대하여 특정 네임스페이스를 적용하기 위해서는 속성명에 네임스페이스 접두사와 콜론(:)을 붙여 표현한다.

<!-- 속성에 네임스페이스 선언 -->
<엘리먼트명 xmlns:접두사="네임스페이스_이름">

<!-- 속성에 네임스페이스 사용 -->
<엘리먼트명 접두사:속성명=“속성값> ~~~ </엘리먼트명>
...
</엘리먼트명>
 
: 속성에 네임스페이스를 선언한 경우
<students xmlns:bk="http://www.knou.ac.kr/press">
          <student>
                    <sid>540101</sid>
                    <name>홍길동</name> 
                    <book bk:bid="cs001">
                              <title>XML이란?</title>
                              <publishing>방송대출판부</publishing> 
                    </book>
          </student> 
</students>
기본 네임스페이스를 사용하고 있는 문서에서 속성은 기본 네임스페이스에 속하지 않는. 즉 기본 네임스페이스는 엘리먼트에 대해서만 적용되며 속성에는 적용되지 않는다. 라서 속성에 네임스페이스를 적용시키기 위해서는 반드시 접두사를 붙여서 사용해야 한다.
그렇기 때문에 기본 네임스페이스를 사용하고 있는 문서에서 속성에 대해서도 네임스페이스를 적용하기 위해서는 결국 기본 네임스페이스와 동일한 것을 접두사가 붙여 있는 형태로써 하나 더 선언하고 접두사를 붙여 속성을 기술하면 된다.

4. 기본 네임스페이스 취소 선언

 

기본 네임스페이스가 사용되는 범위 중에서 특정 영역에 있는 엘리먼트는 기본 네임스페이스에 속하지 않도록 구성할 수 있다. 기본 네임스페이스가 사용되는 범위에서 일부분을 사용해지 영역으로 만들고, 그 사용 해지 영역에 엘리먼트를 작성하면, 해당 엘리먼트는 기본 네임스페이스에 속하지 않는 엘리먼트가 된다.

다음은 기본 네임스페이스가 사용되는 범위에서 사용을 취소하는 문법이다.

<!-- 기본 네임스페이스 선언 -->
<엘리먼트명 xmlns="네임스페이스 이름">

          기본 네임스페이스가 사용되는 영역

          <!-- 기본 네임스페이스 사용 취소 -->
          <엘리먼트명 xmlns="">
          ~~~
          </엘리먼트명>

          기본 네임스페이스가 사용되는 영역

</엘리먼트명>

: 기본 네임스페이스를 취소한 경우

<?xml  version="1.0"  encoding="euc-kr"?>
<students  xmlns="http://www.xml.ac.kr/2005/xml">
          <student>
                    <sid>540101</sid> 
                    <name>홍길동</name> 
                    <age>20</age>
                    <address  xmlns="  ">서울  서초동</address> 
          </student>
</students>
위의 예제는 <address>에 대해서 기본 네임스페이스의 사용을 취소한 경우이다. 예제에서 보는 바와 같이 이미 선언한 기본 네임스페이스를 취소할 때에는 대상이 되는 엘리먼트에 대해 xmlns 속성값에 네임스페이스 URI 대신에 빈 문자열(“ ”)을 지정하여 기본 네임스페이스를 선언하면 된다. 이와 같이 선언한 경우에는 빈 문자열을 지정한 기본 네임스페이스를 선언한 엘리먼트와 그 엘리먼트의 내용 중 네임스페이스 접두사를 붙이지 않고 표현한 하위 엘리먼트에서는 기본 네임스페이스가 적용되지 않게 된다.

정리하기

네임스페이스란 한 문서 내에 중복 정의하고 있는 엘리먼트 이름이 충돌하는 것을 해결하고, 각각의 엘리먼트명과 속성명을 정확하게 인식하게 하는 방법이다.

 

엘리먼트명 앞에 접두사를 포함시켜 해당 엘리먼트가 그 네임스페이스에 속한다고 표시한다.

 

네임스페이스의 이름은 보통 URL 형태로 제공된다.

 

기본 네임스페이스는 어떤 엘리먼트에 접두사를 사용하지 않고 xmlns라는 속성만을 사용함으로써 하위 엘리먼트가 자동으로 상위 엘리먼트에서 선언한 네임스페이스를 따르는 것을 의미하며, 모든 엘리먼트가 단 하나의 네임스페이스를 공통적으로 따르는 경우에 효과적이다.

 

접두사를 사용한 네임스페이스 선언은 “xmlns:접두사="URI참조"” 형태로 이루어지며, XML 문서 중에서 사용하는 엘리먼트명 앞에 접두사:엘리먼트명형태로 사용한다.

 

엘리먼트명에 네임스페이스를 사용한 것과 마찬가지로 속성명에 대해서 네임스페이스를 적용할 수 있으며, 이 경우에는 반드시 접두사를 사용해야한다.

 

기본 네임스페이스를 취소할 때는 대상이 되는 엘리먼트에 대해 xmlns 속성값에 URI조 대신 빈 문자열(“”)을 지정하면 된다.

'정보과학 > 웹서비스특론' 카테고리의 다른 글

SOAP  (0) 2023.09.07
XML 스키마 (2)  (0) 2023.09.06
XML 스키마 (1)  (0) 2023.09.05
XML 문법  (0) 2023.09.04
웹 서비스 개요  (1) 2023.09.02