본문 바로가기

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

2.1. 설정 메타데이터

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

 

 

그림 1. 스프링 IoC 컨테이너

다이어그램이 보여주듯이 스프링 IoC 컨테이너는 설정 메타데이터를 사용한다. 여러분이 애플리케이션 개발자로서 어떻게 객체들을 인스턴스화할지, 설정을 할지, 조립을 할지 스프링 컨테이너에게 지시하는 내용들을 이 설정 메타데이터가 표현한다. 

 

전통적으로 설정 메타데이터는 간단하고 이해하기 쉬운 XML 형식으로 지원되었다. 이 챕터에서는 XML 형식을 사용해 스프링 IoC 컨테이너의 주요 개념과 기능들을 설명할 것이다.

 

※ XML 기반의 메타데이터는 설정 메타데이터를 구성하는 유일한 형식이 아니다. 스프링 IoC 컨테이너는 설정 메타데이터가 실제로 쓰여지는 방식과는 완전히 분리되어 있다. 요즘에는 많은 개발자들은 자바 기반의 설정을 선택하고 있다.

 

스프링 컨테이너에 대해 다른 형식의 메타데이터를 사용하는 것을 더 자세히 알고 싶다면 다음 문서를 참고하라.

  • 어노테이션 기반의 설정 : 스프링2.5부터 어노테이션 기반의 설정 메타데이터를 지원한다.
  • 자바 기반의 설정 : 스프링3.0부터는, '스프링 자바 설정 프로젝트'에 의해 제공된 많은 기능들이 core 스프링 프레임워크로 포함되었다. 따라서 XML 파일이 아닌 자바를 통해 애플리케이션 클래스들의 외부에서 bean들을 정의할 수 있게 되었다. 이러한 새 기능들을 이용하려면 @Configuration, @Bean, @Import, @DependsOn 어노테이션을 참고하라.

스프링 설정은 컨테니어가 관리해야하는 최소한 하나 이상의 bean 정의로 구성된다. XML 기반의 설정 메타데이터는 상위 계층인 <beans/> 요소의 안에서 <bean/>이라는 요소를 통해 이러한 bean들을 설정한다. 자바 설정에서는 보통  @Configuration 클래스 안에서 @Bean 어노테이션이 붙은 메소드를 사용한다.

 

이런 bean의 정의들은 애플리케이션을 구성하는 실제 객체들과 일치한다. 전형적으로, 여러분은 서비스 계층의 객체를 정의하고, 데이터 접근 객체들(DAOs)를 정의하며, Struts의 Action 인스턴스와 같은 표현 객체를 정의한다. 또한 하이버네이트의 SessionFactories와 같은 인프라 객체들을 정의하고, JMS의 Queues 등등을 정의한다. 하지만 컨테이너 안에서 그 누구도 도메인 객체를 설정하고 있지 않는다. 왜냐하면 보통 DAO들과 비즈니스 로직들이 도메인 객체를 생성하고 로딩할 책임을 갖기 때문이다. 하지만 'AspectJ에 의한 스프링 통합'을 사용하여, IoC 컨테이너의 제어 바깥에서 만들어진 객체들을 설정할 수 있다. '스프링에서 AspectJ를 사용하여 도메인 객체의 의존성 주입하기'를 참고하라.

 

다음 예시는 XML 기반의 설정 메타데이터의 기본적인 구조를 보여준다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean id="..." class="...">  
        <!-- 이 bean을 위한 협력자들과 설정이 위치함 -->
    </bean>


    <bean id="..." class="...">
        <!-- 이 bean을 위한 협력자들과 설정이 위치함 -->
    </bean>


    <!-- 다른 bean 정의들이 위치함 -->

</beans>
  • 'id' 속성은 개별 bean의 정의를 식별하는 문자열이다.
  • 'class' 속성은 bean의 종류를 정의하고 완전한 클래스이름을 사용한다.

 

'id' 속성의 값은 협력하는 객체들을 참조하는 것이다. 위 XML 예시에서는 협력하는 객체들을 참조하는 XML이 보이지 않는다. 더 많은 정보를 얻으려면 'Dependencies' 문서를 참고하라.