본문 바로가기

Spring

DI(의존성 주입) 기본 개념

 스프링의 핵심 기술 중 하나인 DIDependecy Injection  즉, '의존성을 주입시켜준다.' 라는 의미이다.

주입한다는 말은 어떠한 객체를 사용할 때에 new()로 직접 새로운 클래스를 생성하여 사용하는 것과 달리

외부에서 생성된 객체 setter( )나 생성자를 통해 사용한다는 것 이다.  

스프링은 이러한 기능을 다른 객체들이 사용하고, 다른 서비스를 위해 사용할 수 있는 클래스를 컨테이너 형태로 제공하며, ioc컨테이너빈(Bean)을 만들고 의존성을 엮어주며(wiring) 빈들을 제공해준다.

 

 

 

 

 

1. xml파일을 통해 설정하기  -  setter()  / constructor

 

 

MessageBeanImpl.java

public class MessageBeanImpl implements MessageBean{
	private String name;
	private String greeting;
	
	// constructor injection	
	public MessageBeanImpl(String name) {
		this.name = name;
	}
	
	// setter injection
	public void setGreeting(String greeting) {
		this.greeting = greeting;
	}


	public void sayHello() {
		String message = greeting + name + "!";
		System.out.println(message);
	}

}

 

MessageBean.java

public interface MessageBean {
	public void sayHello();
}

String 변수 name을 가지는 생성자와 greeting을 가지는 setter()를 선언하고, 간단한 출력값을 보기위한 MessageBean 인터페이스의 메서드를 오버라이딩 해줬습니다. 

 

 

 

beans.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
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
	
    <bean id="messageBean" class="a03.MessageBeanImpl">
    		
    	<!-- setter injection -->
    	<property name="greeting">
    		<value>Hello, </value>
    	</property>
        
        <!-- constructor injection -->
    	<constructor-arg>
    		<value>Spring</value>
    	</constructor-arg>
    	 
     </bean>
 <beans>

beans.xml파일에서 패키지 a03에 있는MessageBean 클래스를 messageBean이라는 아이디로 지정하여 bean(객체)를 생성해줬습니다. <property>부분에서 setter()에 해당하는 messageBean 필드의 이름을 greeting으로, 값을 Hello, 로 지정했고 다음으로 생성자에 해당하는 필드 값을 Spring으로 지정한 모습입니다.

 

 

 

 

HelloApp.java

public class HelloApp {

	public static void main(String[] args) {
		// 3.0 구버전 - BeanFactory => 4.0 신버전 - ApplicationContext
		BeanFactory factory = new XmlBeanFactory(new FileSystemResource("src/a03/beans.xml"));
		
		MessageBean bean = (MessageBean)factory.getBean("messageBean");
		bean.sayHello();
	}
	
}

 

BeanFactory를 사용하여 위에서 만들어놓은 설정파일(beans.xml)을 얻어오고, 설정파일에서getBean()을 통해 id가 messageBean인 Bean을 가져옵니다. 즉, 직접 객체를 생성하는 것이 아닌 외부에서 주입이 되는 것입니다.

 

 

최종적으로 sayHello()를 호출한 결과입니다.

 

 

 

 

2. Java파일을 통해 설정하기

 

설정파일과 메인을 제외한 파일은 그대로 두고 테스트를 진행합니다.

 

 

ConfigHello.java

@Configuration
public class ConfigHello {
	
	@Bean
	public MessageBeanImpl messageBean(){
		
		// 생성자
		MessageBeanImpl messageBeanImpl = 
				new MessageBeanImpl("Spring");
		
		// setter()
		messageBeanImpl.setGreeting("Hello, ");
		
		return messageBeanImpl; 
	}
	
}

자바파일에서는 어노테이션을 통해 xml 설정파일과 같은 역할을 할 수 있습니다.

 

@Configuration- 이 클래스는 스프링 설정에 사용되는 클래스이다." 라고 명시합니다.

@Bean - 객체를 생성해줍니다.

 

위에서 설명했던 beans.xml과 비교하면 이해가 쉽습니다.

 

 

 

 

HelloApp2.java

public class HelloApp2 {

	public static void main(String[] args) {

		AnnotationConfigApplicationContext ctx = 
				new AnnotationConfigApplicationContext(ConfigHello.class);
		

		MessageBeanImpl messageBean = ctx.getBean("messageBean",MessageBeanImpl.class);
		messageBean.sayHello();
	}
	
}

위의 BeanFactory(혹은 ApplicationContext - GenericXmlApplicationContext ) 클래스가 아닌 AnnotationConfigApplicationContext 클래스를 이용하여 context를 불러옵니다. (내부적으로 xml로 변환됨)

 

HelloApp2.java를 실행해보면

xml파일로 설정했을때와 같은 결과를 볼 수 있습니다.

 

 

728x90
반응형