본문 바로가기
Java/Spring

[Spring] IoC (제어 역전, Inversion Of Control) / DI (의존성 주입, Dependency Injection)

by WaterPunch 2021. 5. 20.

1. 제어 역전 (IoC: Inversion Of Control)

- 인스턴스를 제어하는 제어권이 역전된다는 것

  (메서드나 객체의 호출 작업을 개발자가 결정하는 것이 아니라 외부에서 결정되는 것을 의미한다)

  (컴포넌트를 구성하는 인스턴스 생성과 의존관계 연결처리를 스프링 IoC 컨테이너에 위임한다)

 

- 컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어 필요에 따라 스프링에서 사용자의 코드를 호출한다

- 애플리케이션의 느슨한 결합을 도모한다

 

-> 어떤 객체가 사용할 객체(의존관계인 객체)를 직접 선언하여 사용하는 것이 아니라,

    어떤 방법을 사용하여(ex. 생성자) 주입받아 사용하는 것

    블럭 끼워넣기 개발이라고도 함

 

 

2. 의존성 주입 (DI: Dependency Injection)

- 제어 역전이 발생할 때, 스프링 내부에 있는 객체가 해당클래스를 사용할 때 필요한 관계를 관리하는 동작 또는 기법

- 의존성이란 객체가 혼자서는 처리할 수 없음을 뜻함

   ⓐ 따라서 객체를 직접 생성해서 구현

         ex ) jsp model에서의 DAO 객체 생성

  ⓑ 관계를 약화시키면서 간접 구현, 즉 호출해야한다

- 즉, 의존성 주입(DI)란 객체를 직접 생성/제어하는 것이 아니라, 제어의 역행을 사용해서 특정 객체를

  필요한 객체의 외부에 가져다 연결하는 것을 뜻함

- 객체가 필요한 어떤 객체를 생성자 혹은 setter를 통해 주입하는 것을 말한다.

 

- 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다

  (클래스 사이의 의존 관계를 빈(Bean) 설정 정보를 바탕으로 컨테이너가 자동적으로 연결)

- IoC의 소프트웨어 디자인 패턴 중 하나

 

개발자들은 제어를 담당할 필요 없이 빈 설정 파일에 의존관계가 필요하다는 정보만 추가해주면 된다

 

IoC / DI 를 사용하면 객체를 생성할 때에,

해당 객체가 참조하고 있는 다른 객체에 대한 종속성을

애플리케이션 코드 외부(Container)에 설정하게 함으로써

결합도는 낮추면서 유연성과 확장성은 향상시킬 수 있다

 

2-1 DI의 세가지 유형

  1) 생성자를 이용한 의존성 삽입

      - 필요한 의존성을 모두 포함하는 클래스의 생성자를 만들고, 그 생성자를 통해 의존성을 주입

 

  2) setter() 메서드를 이용한 의존성 삽입

      - 의존성을 입력받는 setter 메서드를 만들고 이를 통해 의존성을 주입

 

  3) 초기화 인터페이스를 이용한 의존성 삽입 (스프링은 지원하지 않는 DI 방식)

      - 의존성을 주입하는 함수를 포함한 인터페이스를 작성하고 이 인터페이스를 구현하도록 함으로써

        실행시에 이를 통하여 의존성을 주입 

 

2-2 DI Container의 종류

  1) Spring Container

      - 스프링 IoC 컨테이너가 관리하는 객체를 빈(Bean)이라고 부름

      - 스프링에서는 Bean들을 관리한다는 의미로 BeanFactory라고 부름

  2) PicoContainer

  3) Guice

 

2-3 IoC / DI 의 장점

 - 인스턴스(Bean)의 스코프를 제어할 수 있다 (Singleton이 기본이다)

 - 인스턴스의 생명주기를 제어할 수 있다

 - AOP 방식으로 공통 기능을 제공할 수 있다

 - 의존하는 컴포넌트 간의 결합도를 낮춰서 테스트하기 쉽게 만든다

 - 단위 테스트를 용이하게 만든다

 

 

3. Spring IoC Container (BeanFactory / ApplicationContext)

- 스프링에서 IoC를 담당하는 컨테이너를 BeanFactory / ApplicationContext 라고 부르기도 한다

- BeanFactory : 객체의 생성과 객체 사이의 런타임 관계를 설정하는 단순 DI 

                    스프링 IoC 컨테이너 최상위에 있는 인터페이스

- ApplicationContext : DI를 위한 BeanFactory에 엔터프라이즈 애플리케이션을 개발하는 데 필요한

                             여러가지 기능을 추가한 것

 

 

반응형

댓글