XML 네임스페이스

2021. 6. 4. 23:27개발/기타

Spring을 사용하다 보면 종종 아래와 같은 xmlns같은 attribute를 볼 수 있는데, 지금까지 별 생각없이 사용하다가 의미를 파악해보기 위해 구글링을 했다. 이에 대해 잘 설명해둔 Stackoverflow 답변이 있어서 기록한다.  ( 잘못 기록된 부분 있으면 언제든 댓글로 달아주세요!! )

Spring MVC의 Dispathcer 관련 설정 XML

 

A와 B 두명이서 하나의 XML문서를 작성한다고 해보자. A는 사람(person)에 대한 정보를 작성하고 B는 도시(homecity)에 대한 정보를 작성해야하는 상황이다. 

<person>
    <name>Rob</name>
    <age>37</age>
    <homecity>
        <name>London</name>
        <lat>123.000</lat>
        <long>0.00</long>
    </homecity>
</person>

작성한 XML을 보니 문제점이 하나 있다. person과 city가 모두 name이라는 태그를 가지고 있다는 점이다. name 태그만 봐서는 사람의 이름인지, 도시의 이름인지 알 수 없다.

 

 

따라서 A와 B는 name을 구분하기 위해 접두사(prefix)를 사용한다. personxml과 cityxml 이라는 prefix를 사용함으로써 name이 unique한 의미를 가질 수 있도록 했다.

<personxml:person xmlns:personxml="http://www.your.example.com/xml/person"
                  xmlns:cityxml="http://www.my.example.com/xml/cities">
    <personxml:name>Rob</personxml:name>
    <personxml:age>37</personxml:age>
    <cityxml:homecity>
        <cityxml:name>London</cityxml:name>
        <cityxml:lat>123.000</cityxml:lat>
        <cityxml:long>0.00</cityxml:long>
    </cityxml:homecity>
</personxml:person>

 

위 문서에서 xmlns(XML namespace)라는 속성을 볼 수 있다.

"xmlns:personxml="http://www.your.example.com/xml/person" 뜻은 personxml의 구분자(identifier)로 "http://www.your.example.com/xml/person"을 사용하겠다는 뜻이다. XML Parser는 결국 이 구분자(identifier)를 보고 name이 사람이름인지 도시이름인지 판단한다.

personxml과 cityxml 접두사는 identifier를 간단하게 쓰기위해 존재하는 변수(?) 같은거라고 보면된다. 

 

 

아래 예시를 보면 personxml과 cityxml이 똑같은 구분자를 가지고있다. 이렇게 셋팅하면 접두사는 personxml과 cityxml로 다르더라도 구분자는 같기때문에 XML Parser는 차이점을 인식하지 못한다.

<personxml:person 
     xmlns:personxml="http://example.com/same/url"
     xmlns:cityxml="http://example.com/same/url" />

 

지금까지 예시에서 구분자를 웹 URL같은것을 사용했지만 뭘 사용하든 큰 의미는 없고, 구분자의 고유성을 나타낼수 있기만 하면된다. 주로 내가 만든 사용하는 URI나 IRI를 사용한다고한다.

 

또한 XML namespace는 아래처럼 상속의 형태로 표현할 수 있다.

<person xmlns="http://www.your.example.com/xml/person">
    <name>Rob</name>
    <age>37</age>
    <homecity xmlns="http://www.my.example.com/xml/cities">
        <name>London</name>
        <lat>123.000</lat>
        <long>0.00</long>
    </homecity>
</person>

 

 

 

첫번째 사진을 다시보면 xmlns = "http://www.springframework.org/schema/beans" 처럼 구분자 없는 경우도 있다. 이는 접두사 없이(즉, 명시적인 구분자 할당이 없는 경우) 작성된 태그는 "http://www.springframework.org/schema/beans" 구분자를 default로 가지도록 한다. 아래에 bean 태그 같은 경우가 default 구분자가 할당될것이다.

 

 

참고사이트


 

What does "xmlns" in XML mean?

I saw the following line in an XML file: xmlns:android="http://schemas.android.com/apk/res/android" I have also seen xmlns in many other XML files that I've come across. What is it?

stackoverflow.com