본문 바로가기

SpringFramework Core - I. IoC 컨테이너/2. 컨테이너 개관

2.2.1. XML 기반의 설정 메타데이터 구성하기

원문: https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-factory-xml-import

 

 

여러 개의 XML 파일을 통해 bean에 대한 정의를 갖는 것이 유용할 수 있다. 종종, 각각의 XML 설정 파일이 아키텍쳐의 논리 계층이나 모듈을 나타낼 때가 있다.

 

이런 XML 조각들을 통해 bean 정의를 로딩해주는 application context 생성자를 사용할 수 있다. 이 생성자는 여러 개의 Resource 위치들을 갖게 된다. 다른 파일로부터 bean의 정의들을 로딩하기 위해서는 <import/> 요소를 사용하면 된다. 다음 예시는 그 방법을 보여준다.

<beans>

    <import resource="services.xml" />

    <import resource="resources/messageSource.xml" />

    <import resource="/resources/themeSource.xml" />



    <bean id="bean1" class="..." />

    <bean id="bean2" class="..." />

</beans>

위의 예시에서 외부의 bean 정의들은 'services.xml', 'messageSource.xml', 'themeSource.xml', 이렇게 세 가지 파일로부터 로딩된다. 모든 위치 경로들은 import를 수행하는 정의 파일에 대해 상대적이다. 따라서 services.xml은 반드시 import를 수행하는 파일과 같은 디렉토리에 위치하거나 같은 클래스패스를 가져야 한다. 반면에 messageSource.xml과 themeSource.xml은 import 수행 파일의 resources 위치 아래에 놓이면 된다. 예시에서 볼 수 있듯이 선행하는 슬래시는 무시된다. 하지만 주어진 경로들이 상대적이기 때문에 아예 슬래시를 사용하지 않는 것이 더 나은 형식이다. 스프링 스키마에 따르면, 최상위의 <beans/> 요소를 포함한 채로 import된 파일의 내용들은 반드시 유효한 XML bean 정의를 가지고 있어야 한다.

 

※ 부모 디렉토리를 가리키는 '../'와 같은 상대 경로는 사용가능하지만 권장되지는 않는다. 그렇게 하면 현재 애플리케이션의 외부에 있는 파일에 의존성이 생긴다. 하지만 특히 'classpath:' URL의 경우에 이런 참조방식은 권장되지 않는다(예를 들어, 'classpath: ../services.xml'). 런타임 resolution 프로세스에서는 가장 가까운 루트 클래스패스를 선택한 후 그 부모 디렉토리를 찾아본다. 이때 클래스패스의 설정이 변경되면 잘못된 디렉토리를 선택할 수 있게 된다.

 

항상 상대경로보다는 완전한 resource 위치를 적는 것이 좋다. 예를 들어, 'file:C:/config/services.xml' 또는 'classpath:/config/services.xml'처럼 말이다. 하지만 애플리케이션의 설정이 특정 절대 경로와 결합된다는 사실을 염두에 두어야 한다. 그 때문에 보통 절대 경로들에 대한 간접적 지시가 선호된다. 예를 들어, 런타임동안 JVM 시스템 프로퍼티를 통해 해석되는 '${...}' placeholder를 통해서 말이다.

 

namespace는 그 자체로도 중요한 지시 기능을 제공한다. 거기에 스프링으로부터 제공되는 XML namesplaces를 선택함으로써 일반적인 bean 정의 이상의 설정 기능들을 사용할 수 있게 된다. 예를 들면, context와 util namespace들이 있다.