본문 바로가기

SpringFramework Core - I. IoC 컨테이너/4. 의존성

4.2.10. p-namespace를 이용한 XML Shortcut

원문: https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-p-namespace

 

 

p-namespace는 <property/> 요소를 쓰지 않고도 bean요소의 속성을 사용할 수 있게 해준다. 이를 통해 프로퍼티 값이나 협력하는 bean들을 서술할 수 있다. 

 

스프링은 namespace들을 통해 XML 스키마에 기반을 둔 확장된 설정 포맷들을 제공한다. 이번 챕터에서 논의하는 bean 설정 포맷들은 XML 스키마 문서에 정의되는 것이다. 그러나 p-namespace는 XSD 파일에 정의되어 있지 않으며, 오직 스프링의 core에만 존재한다.

 

다음 예시는 같은 결과를 가진 두 XML 부분들을 보여준다. 첫번째는 표준적인 XML 형식을 사용한 것이고 두번째는 p-namespace를 사용한 것이다.

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    		https://www.springframework.org/schema/beans/spring-beans.xsd">
   
    
    <bean name="classic" class="com.example.ExampleBean">
        <property name="email" value="someone@somewhere.com" />
    </bean>
    
    <bean name="p-namespace" class="com.example.ExampleBean"
        p:email="someone@somewhere.com" />
        
</beans>

위 예시는 bean 정의 속에서 email이라는 p-namespace 속성을 사용한 것이다. 이것은 스프링으로 하여금 프로퍼티 선언을 포함하게 한다. 이전에 언급했듯, p-namespace는 스키마 정의를 가지고 있지 않다. 그래서 속성의 이름을 통해 프로퍼티의 이름을 세팅할 수 있다.

 

다음 예시는 다른 bean을 참조하고 있는 두 가지 bean의 정의이다.

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean name="john-classic" class="com.example.Person">
        <property name="name" value="John Doe" />
        <property name="spouse" ref="jane" />
    </bean>
    
    <bean name="john-modern" class="com.example.Person"
        p:name="John Doe"
        p:spouse-ref="jane" />
        
        
    <bean name="jane" class="com.example.Person">
        <property name="name" value="Jane Doe" />
    </bean>
</beans>

이 예시는 p-namespace를 이용해 프로퍼티 값을 채워줄 뿐 아니라 참조 프로퍼티를 위해서 특별한 형식을 사용하고 있다. 첫번째 bean 정의에서 john에게 jane을 참조하게 하기위해 '<property name="spouse" ref="jane" />'을 사용했다. 두번째 bean 정의에서는 정확히 같은 일을 하는 데에 'p:spouse-ref="jane"'을 사용했다. 이 경우에 spouse는 프로퍼티 이름이 되고, '-ref'부분은 직접적인 값이 아니라 다른 bean에 대한 참조라는 표시가 된다. 

 

p-namespace는 표준 XML 형식만큼 유연하지 못하다. 예를 들어 참조 프로퍼티를 선언하는 형식은 'Ref'로 끝나는 프로퍼티들과 충돌한다. 스프링 제작진은 접근법을 신중히 택할 것을 추천한다. 또한 동시에 세 가지 접근법을 모두 사용하여 XML 문서를 작성하는 것을 피할 수 있도록 팀 구성원들과 소통하기를 권장한다.