ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Camel][Spring] Spring(스프링) DI 설정 - XML을 이용한 DI 설정
    Spring/개념 정리 2020. 4. 21. 20:18

     스프링을 사용하기 위해서는 기본적인 DI 설정을 이해해야할 필요가 있으며, 스프링의 DI 설정 방법으로는 XML, Java, 그루비 코드 총 3가지의 방법이 있습니다. 이번 포스팅은 그 중 XML을 사용한 DI 설정에 대한 내용입니다. 

     

    1. XML을 사용한 DI 설정

    설정 정보로 사용할 XML 파일을 작성하기 위해서는 <bean> 태그를 사용해야 합니다. <bean> 태그에서 컨테이너가 생성할 객체를 지정해주고 <bean> 태그 내부에서 <property>, <constructor-arg> 태그를 사용해서 객체가 필요로 하는 값을 설정해줄 수 있습니다. 사용방법은 아래와 같습니다. 

    <?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    	<bean id="animal" class="com.springEx.springprojectex.Animal">
        		<property name="camel">
            		<value>Property Value</value>
            	</property>
        	</bean>
        
        	<bean id="animal2" class="com.springEx.springprojectex.Animal">
        		<constructor-arg><value>ParameterValue</value></constructor-arg>
            	<constructor-arg><ref bean="animal"/></constructor-arg>
        	</bean>
        
    </beans>
    

     

    위 XML 파일에서 사용된 <beans> 태그는 XML 설정의 루트 태그입니다. 루트 태그에서는 기본 네임스페이스와 XML 스키마를 지정하게되며, <bean>, <property>, <constructor-arg> 태그는 각각 생성할 객체와 생성자 방식의 DI 설정 그리고 프로퍼티 방식의 DI 설정을 위해 사용됩니다. 

     

    1-1. <bean> 태그

    <bean> 태그는 스프링 컨테이너가 생성할 객체에 대한 정보를 지정할 때 사용되는 태그이며, 주요 속성은 id와 class가 있습니다. 

     

     id 속성 값은 <bean> 태그를 이용해서 생성하는 스프링 빈 객체의 고유한 이름으로 사용합니다. id 속성으로 빈의 이름을 지정하면 다른 <bean> 태그에서 참조할 때 사용할 수 있게 됩니다. 위의 코드에서 첫 번째 <bean>태그에서는 id 값이 animal로 지정되어 있습니다. 그리고 두 번째 <bean>태그에서는 <ref> 태그를 사용해서 id 값이 animal인 빈 객체를 참조하여 설정하고 있습니다. 

     

     class 속성은 스프링 컨테이너가 생성할 객체의 클래스 이름을 값으로 갖습니다. 이때 클래스의 이름은 위의 코드에서 확인할 수 있듯이 패키지 이름을 포함한 완전한 클래스 이름을 지정해주어야 합니다. 

     

     스프링 빈의 이름은 스프링 컨테이너에서 직접 빈 객체를 구할 때에도 사용되며, 사용방법은 아래의 코드를 통해 확인할 수 있습니다.

    public class MainClass {
    
    	public static void main(String[] args) {
    		String config ="classpath:applicationCtx.xml";
    		AbstractApplicationContext ctx = new GenericXmlApplicationContext(config);
    		Animal animal = ctx.getBean("animal", Animal.class);
    		animal.method();
    		
    		ctx.close();	
    	}
    }
    

    XML 설정을 담은 파일은 클래스패스에 위치한 applicationCtx.xml 파일일 것입니다. 위의 코드처럼 id 속성에 지정한 이름을 사용해서 컨테이너로부터 빈 객체를 구할 수 있는 것입니다.

     

     그리고 만약 id 값을 지정해주지 않는다면 스프링은 클래스 이름을 사용해서 임의의 이름을 생성해줍니다. 

     

    1-2. <constructor-arg> 태그 

    <constructor-arg> 태그는 생성자 방식 DI 설정에서 사용되는 태그입니다. 만약 구현한 클래스가 생성자를 사용해 필요한 값을 전달받는 구조라면, 그 객체를 스프링 빈으로 설정하기 위해서 생성자에 전달할 값을 설정해주어야 합니다. 이때 사용하는 태그가 <constructor-arg> 태그이며 사용 방법은 아래와 같습니다.

    public class Animal {
    	
        private String name;
    	
        public Animal(String name){
        	this.name=name;
        }
        
        ...
        
        ...
       
    }
    <bean id="animal2" class="com.springEx.springprojectex.Animal">
        	<constructor-arg><value>Camel</value></constructor-arg>
            <constructor-arg><ref bean="animal"/></constructor-arg>
    </bean>

    위의 경우 Animal 객체를 생성하기 위해서는 생성자에 전달할 파라미터 값을 설정해주어야 합니다. <constructor-arg> 태그는 <bean> 태그 내부에 선언할 수 있으며, 전달해야하는 파라미터의 수 만큼 <constructor-arg> 태그를지정해주어야합니다.

     

    <constructor-arg>태그의 순서대로 파라미터가 전달되게 되며, 스프링은 설정 파일에 지정한 값을 파라미터 타입에 맞게 변환해서 처리합니다. 간단한 예로, 위의 코드에서는 Camel이라는 값을 파라미터로 전달하고 있는데, 이때 스프링은 실제 생성자에서 필요한 String 타입으로 만들어서 제공을 해주는 것입니다. 

     

     그리고 다른 빈 객체를 사용해야하는 경우에는 위의 코드에서 처럼 <value>속성 대신 <ref> 속성을 사용하게 됩니다. 

     

    1-3. <property> 태그 

    프로퍼티 설정 방식을 사용할 경우에는 <property> 태그를 사용합니다. name 속성을 사용해서 프로퍼티명을 지정할 수 있으며, <value> 태그, value 속성, <ref> 태그, ref 속성을 사용해서 프로퍼티 값을 지정할 수 있습니다. 사용방법은 아래와 같습니다. 

    <bean id="animal" class="com.springEx.springprojectex.Animal">
        	<property name="name">
            	<value>Camel</value>
            </property>
    </bean>

    <property> 태그를 사용한다는 것은, set 메소드를 사용해 값을 설정한다는 것입니다. 프로퍼티명과 일치하는 set메소드를 사용해서 값을 설정하게 됩니다. 

    댓글

Camel`s Tistory.