본문 바로가기

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

4.2.11. c-namespace를 사용한 XML Shortcut

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

 

 

 스프링 3.1에서 소개된 c-namespace는 p-namespace와 유사하게 'constructor-arg' 요소 없이, 인라인 속성으로 생성자 매개변수를 설정할 수 있게 해준다. 

 

다음 예시는 'c:' namespace를 사용하여 생성자 기반의 의존성 주입과 같은 일을 하는 것을 보여준다.

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

    <bean id="beanTwo" class="x.y.ThingTwo" />
    <bean id="beanThree" class="x.y.ThingThree" />
    
    <!-- 선택적 인자 이름들을 통한 전통적인 선언 -->
    <bean id="beanOne" class="x.y.ThingOne">
        <constructor-arg name="thingTwo" ref="beanTwo" />
        <constructor-arg name="thingThree" ref="beanThree" />
        <constructor-arg name="email" value="something@somewhere.com" />
    </bean>
    
    <!-- c-namespace를 이용한 인자 이름 선언 -->
    <bean id="beanOne" class="x.y.ThingOne" c:thingTwo-ref="beanTwo"
    	c:thingThree-ref="beanThree" c:email="something@somewhere.com" />
        
</beans>

'c:' namespace는 '-ref'에서 bean들의 이름을 활용해 생성자 매개변수를 세팅한다는 점에서 'p:'와 같은 방식으로 사용된다. 또한 비슷하게도, XSD 스키마에는 정의가 되어 있지 않지만 XML 파일 안에서 선언되어야 한다(c-namespace도 스프링 코어에 존재한다).

 

드물게 생성자 매개변수의 이름을 사용할 수 없을 때(보통 디버깅 정보 없이 바이트 코드가 컴파일될 때)에는, 다음 예시처럼 인자에 인덱스를 사용하면 된다.

<!-- c-namespace의 인덱스 선언 -->
<bean id="beanOne" class="x.y.ThingOne"
    c:_0-ref="beanTwo"
    c:_1-ref="beanThree"
    c:_2="something@somewhere.com" />

 

XML 문법 때문에 인덱스 표시에는 선행하는 '_'가 필요하다. 비록 몇몇 IDE에서 허용해주긴 하지만 XML 속성의 이름은 숫자로 시작할 수 없기 때문이다. 동일한 인덱스 표시가 <constructor-arg>에도 사용될 수 있으나 보통 잘 사용하지는 않는다. 선언의 순서만으로도 충분하기 때문이다.

 

실제로, 생성자 작업 메커니즘은 인자를 매칭해 주는 데에 매우 효율적이다. 따라서 웬만하면 설정 전반에 걸쳐 이름 표기를 사용하는 것을 권장한다.