2013년 4월 8일 월요일

[Spring] DI(Dependency Injection)

DI는 스프링 컨테이너가 지원하는 핵심 개념 중 하나이다. 객체 간의 의존 관계를 객체 자신이 아닌 외부의 조립기가 수행해 준다는 개념이다.

예를 들면 A라는 클래스에서 B라는 클래스의 객체가 필요한 경우 보통은 A클래스 안에서 B라는 객체를 new키워드로 생성하거나 singleton방식으로 객체를 얻는 방식을 많이 사용한다.

하지만 문제점은 이들 A와 B의 결합도가 높아진다는 것이다. 이로 인해 의존하는 클래스 B가 변경되는 경우 A의 코드를 변경해야 하는 문제가 있다. 이처럼 하나의 변경으로 인해 의존하는 다른 부분들의 수정이 불가피한 경우가 많을 수록 서로의 의존도, 즉 결합도가 높다는 것이다.

new키워드의 문제점이 의존 클래스가 변경되면 코드를 변경하는 것이고 또한 단위 테스트를 하기 위해서는 실행에 필요한 올바른 객체가 존재해야한다. (단위 테스트는 코드의 품질을 향상시키고 개발 속도를 증가시키는데 필요하다.)
singleton방식에서는 의존 클래스의 변경에 의한 문제점은 해결할 수 있지만 new키워드와 같이 올바르게 동작하는 객체가 있어야만 단위 테스트가 가능하다는 문제가 존재한다.

이러한 문제점들을 해결하기 위해 DI개념을 사용하는 것이다.

객체간의 의존관계를 객체가 아니라 외부의 조립기가 수행하는 것을 의미한다. 이 의존관계는 클래스의 변경으로 인한 수정이 필요하지 않고 구현 클래스에 대한 차이를 모르는 채 서로 다른 구현으로 대체가 가능하다는 점에서 모든 문제를 해결할 수 있다.

스프링 DI
스프링은 설정 파일과 어노테이션을 이용하여 객체 간의 의존 관계를 설정하는 기능을 제공하여 객체 조립기를 사용할 수 있다.

예) 스프링 설정 파일(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-2.5.xsd">

<bean id="dao" class="kosta.MySQLDao"></bean>

<bean id="service" class="kosta.WriteServiceImple">
<constructor-arg ref="dao"/>
</bean>
</beans>

스프링 설정 파일은 Application에서 사용할 Spring 자원들을 설정하는 파일이며 XML기반이다.

위에 코드는 bean태그를 이용하여 객체를 설정해주고 있다. 특히 constructor-arg 태그를 이용하여 생성자에 이미 설정해둔 dao객체를 전달해 줌으로써 의존 관계를 설정하고 있다.

<bean>태그 기본속성
name - 호출할 이름 설정
id - 호출할 이름 설정
class - 생성될 객체의 클래스
factory-method : singleton패턴으로 작성된 객체의 factory메소드 호출 시

이렇게 설정파일을 작성한 뒤 스프링을 이용하여 설정 파일을 로딩하고 객체를 얻는다.

예) 스프링 설정 파일을 로드하고 BeanFactory를 생성한 뒤, 필요한 객체를 가져오는 코드-------

public class Main {
public static void main(String[] args){
Resource resource = new ClassPathResource("applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(resource);
Service service = (Service)factory.getBean("service");
service.insert();
}
}
factory.getBean("id")로 설정 파일에서 이미 설정해둔 빈 객체들을 가져올 수 있다. 이러한 방법을 통해 느슨한 의존 관계를 설정하게 되고 이는 코드의 변경이나 테스트의 어려움을 줄이는데 유용한 개념이다.

댓글 없음:

댓글 쓰기