본문 바로가기

dev/Spring

IoC/DI

IoC(Inversion of Control)


1) IoC/DI 를 적용하지 않을 때

   - 작업을 수행하는 쪽에서 Object 생성과 같은 제어 흐름을 결정

      ex) 개발자가 직접 new 를 통해 객체를 생성

      ex) main()에서 생성된 오브젝트가 다른 오브젝트 생성에 영향을 미침

   - 각 오브젝트는 프로그램 흐름 및 사용할 오브젝트 결정에 적극적으로 관여

      ex) Foo라는 오브젝트에서 Boo라는 오브젝트가 필요하면 new Boo로 Boo를 선언한다.


2) IoC/DI 개념을 적용했을 때

   - 프로그램의 제어는 제어 권한을 위임받는 특별한 오브젝트(컨테이너)가 수행

      ex) 컨테이너가 객체를 생성 및 관리

   - Object는 자신이 어떻게 생성/관리되는지 알 수 없음(컨테이너에 의해 생성/관리됨)

   - Object는 자신이 사용할 Object를 구체적으로 결정할 수 없음(컨테이너가 주입해주는 것 써야함)





DI(Dependency Injection)


- 오브젝트 사이의 의존관계를 컨테이너가 자동으로 관리해 주는 것.

- 사용할 객체를 컨테이너에 등록

   -> 어플리케이션 코드에서 해당 객체를 setter함수의 매개변수로 받아와 실행 시에 동적으로 의존관계 설정

   -> 이렇게 할 경우 동적으로 구현 클래스를 정해줄 수 있음

- 즉, 객체가 가진 종속성을 어플리케이션 코드 외부(container)에 설정함으로써 결합도는 낮추고 유연성 높임



DI의 3가지 분류

1) Constructor Injection : type 1 IoC

생성자를 통해 의존 객체를 넘겨주는 방법

// PicoContainer
class MovieLister...  
    public MovieLister(MovieFinder finder) {
        this.finder = finder;       
    }

class ColonMovieFinder...  
    public ColonMovieFinder(String filename) {
        this.filename = filename;
    }

2) Setter Injection : type 2 IoC

세터 메소드를 통해 의존성을 주입하는 방법. Spring에서 사용중인 방법.

// Spring Container
class MovieLister...  
    private MovieFinder finder;
    public void setFinder(MovieFinder finder) {
        this.finder = finder;
    }

class ColonMovieFinder...  
    public void setFilename(String filename) {
        this.filename = filename;
    }

3) Interface Injection : type 3 IoC

의존성 주입 함수를 포함하는 인터페이스를 작성하고, 그 인터페이스를 구현하여 의존성을 주입하는 방법

// Avalon
public interface InjectFinder {  
    void injectFinder(MovieFinder finder);
}

class MovieLister implements InjectFinder...  
    public void injectFinder(MovieFinder finder) {
        this.finder = finder;
    }

public interface InjectFinderFilename {  
    void injectFilename (String filename);
}

class ColonMovieFinder implements MovieFinder, InjectFinderFilename......  
    public void injectFilename(String filename) {
        this.filename = filename;
    }


[참조] 

세 가지 DI 컨테이너로 향하는 저녁 산책(http://www.nextree.co.kr/p11247/)

Spring - IoC & DI (https://isstory83.tistory.com/91)



'dev > Spring' 카테고리의 다른 글

spring mvc 프로젝트 구조  (0) 2019.02.19
Spring Layered Architecture  (0) 2019.02.19
Java web MVC  (0) 2019.02.15
DTO/DAO, ConnectionPool  (0) 2019.02.15
AOP  (0) 2019.02.14