본문 바로가기

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

4.2.6. Collection 합치기

원문: https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-collection-elements-merging

 

 

스프링 컨테이너는 컬렉션을 합치는 기능도 제공한다. 애플리케이션 개발자는 부모 <list/>,<map/>,<set/>,<props/>요소를 정의하고 자식 <list/>,<map/>,<set/>,<props/>요소를 통해 부모 컬렉션의 값들을 상속하고 오버라이드 할 수 있다. 즉, 자식 컬렉션 요소들이 부모 컬렉션의 특정된 값들을 오버라이딩하고 있다면, 자식 컬렉션의 값들은 부모 컬렉션의 요소들과 자식 컬렉션의 요소들을 합한 결과와 같다. 

 

이 merging 주제에서는 부모-자식 bean 메커니즘에 대해 논의한다. 부모와 자식 bean 정의에 대해 익숙치 않은 독자들은 관련된 부분들 읽고 오길 바란다.

 

다음 예시는 collection merging을 보여준다.

<beans>
    <bean id="parent" abstract="true" class="example.ComplexObject">
        <property name="adminEmails">
            <props>
                <prop key="administrator">administrator@example.com</prop>
                <prop key="support">support@example.com</prop>
            </props>
        </property>
    </bean>
    
    <bean id="child" parent="parent">
        <property name="adminEmails">
            <!-- merge는 자식 컬렉션의 정의에서 설정된다 -->
            <props merge="true">
                <prop key="sales">sales@example.com</prop>
                <prop key="support">support@example.co.kr</prop>
            </props>
        </property>
    </bean>
<beans>

자식 bean의 adminEmails 프로퍼티의 <props/>요소에서 merge=true 속성을 사용한다는 점을 주의하라. 컨테이너에 의해 자식 bean이 인스턴스화될 때, 결과 인스턴스는 부모와 자식의 adminEmails 컬렉션을 합한 결과를 adminEmails에 갖고 있게 된다. 다음 리스트는 그 결과를 보여준다.

administrator=administrator@example.com
sales=sales@example.com
support=support@example.co.kr

자식 Properties 컬렉션 값들은 부모의 <props/>의 모든 프로퍼티 요소들을 상속받는다. 그리고 자식의 'support' 값은 부모 컬렉션의 'support' 값을 오버라이드한다.

 

이 merging 활동은 <list/>,<map/>,<set/> 컬렉션 타입에도 비슷하게 적용된다. <list/> 요소에서는 조금 더 특별히, List 컬렉션 타입이 가진 '순서'라는 맥락이 유지된다. 부모의 리스트 값들은 항상 자식 리스트의 값들보다 우선한다. Map, Set, Properties 컬렉션 타입들에서는 순서가 존재하지 않는다. 순서가 없다는 것은 컨테이너가 내부적으로 사용하는 Map, Set, Properties 컬렉션들의 타입과 관련하여 영향을 미칠 수 있다는 것을 의미한다.