[Spring Framework ②] Inversion of Control

개발 노트 2008. 7. 10. 16:41 posted by 무병장수권력자


Inversion of Control in Spring Framework

작성자 : 김문규
최초 작성일 : 2008. 7.10

IoC는 Spring Framework의 장점을 꼽으라면 가장 먼저 언급되는 개념입니다. 한국어로 변역하면 '제어의 역행'! 한국어가 더 어려워 보입니다. 비슷한 말로 Dependency Injection(DI)라는 말도 있습니다. 한국말로는 의존성 삽입! 아하~ 조금 이해가 되시나요?

간단하게 이해하기 쉽게 같이 알아보지요.

1. 개념
 객체 간의 의존관계를 객체 내부에 선언 또는 정의하지 않고, 외부의 조립기를 이용하여 의존 관계를 설명한다는 것

2. 예제
객체간의 연관성을 선언하는 3가지 방법을 보고, 문제점이 어떻게 IoC(DI)를 이용해서 해결되는 지 알아보지요.

1) 직접 선언하는 방법

public class WriteArticleServiceImpl {
    private ArticleDao articleDao = new MysqlArticleDao();
    ...
}

 - 쉽습니다.
 - 하지만, 이를 테스트하기 위해서는 MySqlArticleDao가 정상적으로 동작해야 합니다. 어렵습니다.
 - 또한, OracleArticleDao를 사용하기로 바뀌었다면 코드를 고쳐야 하지요~ 물론 컴파일도 다시요. 귀찮습니다.

2) Factory 패턴, JNDI를 이용하는 방법

public class WriteArticleServiceImpl {
    private ArticleDao articleDao = ArticleDaoFactory.create();
    ...
}

 - 조금 나아졌나요? 최소한 Oracle로 바뀌어도 코드 수정은 안해도 되겠네요~ ^^
 - 근데 테스트 측면에서는 전혀! 나아진게 없어 보입니다. 올바르게 동작하는 Factory와 JNDI에 등록된 객체가 필요합니다.

3) 외부 조립자를 이용하는 방법

public class WriteArticleServiceImpl {
    private ArticleDao articleDao;
    public WriteArticleServiceImpl(ArticleDao articleDao) {
        this.articleDao = articleDao;
    }
    ...
}

외부 설정 파일 (applicationContext.xml)
<bean name="writeArticleService" class="com.sec.service.WriteArticleServiceImpl">
    <constructor-arg><ref-bean="articleDao"></constructor-arg>
</bean>

<bean name="articleDao" class="com.sec.dao.OracleArticleDao" />

 - 외부 설정(applicationContext.xml)에서 객체간의 의존성을 설명하고 있다는 감이 오시지요? 바로 이겁니다. 외부에서 객체 의존성을 정의하고 있는 것이지요. 책에서는 조립한다고 설명하더군요. (Nice!)
 - 여기서는 생성자를 이용한 방법을 사용하지만 setter를 이용하는 방법도 있습니다. 요건 나중에 차차..
 - 이제 위에서 말한 2가지 문제점이 다 해결되어 보이지요? 아하~ 굳입니다. ^^

3. 참조
1) 웹 개발자를 위한 스프링 2.5 프로그래밍
2)
http://martinfowler.com/articles/injection.html
 - 다음은 IoC 설명의 정석으로 불려지는 Martin Fowler의 글입니다. 시간이 되시면 읽어보세요. 위의 설명이 좀 더 잘 이해되실 겁니다.