[Spring] IoC/DI

IoC(제어의 역전)


Ioc란?

  • 프로그램의 제어 흐름 구조가 뒤바끼는 것
  • IoC에서는 오브젝트가 자신이 사용할 오브젝트를 스스로 선택하지도, 생성하지도 않는다
  • 또한 자신도 어떻게 만들어지고 어디서 사용되는지를 알 수 없다
  • 모든 제어 권한을 자신이 아닌 다른 대상(컨테이너)에게 위임하기 때문이다

스프링의 IoC

IoC의 기본 개념은 어플리케이션을 구성하는 핵심 오브젝트를 코드가 아닌 컨테이너가 관리하는 것이다. 그렇기 때문에 의존관계 주입, 초기화, DI, DL, 제거까지 모든 오브젝트의 생명 주기를 컨테이너가 관리한다.

Bean

  • 제어권을 가지고 직접 만들고 관계를 부여하는 오브젝트
  • 기본적으로 스프링에서는 싱글톤으로 관리된다

Bean Factory

  • 빈의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트
  • 빈을 생성하고 관계를 설정하는 IoC의 기본 기능에 초점을 둔다

Application Context

  • 빈 팩토리와 같은 의미를 지닌다
  • 애플리케이션 전반에 걸쳐 모든 구성요소의 제어 작업을 담당하는 IoC 엔진이라는 의미가 더 강하다
  • 싱글톤으로 빈 오브젝트를 생성하고 관리한다


DI(의존관계 주입)


DI란?

  • 런타임 시점의 의존관계를 컨테이너나 팩토리 같은 제3의 존재(Application Context)가 결정한다
  • 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않아야 하기 때문에 인터페이스에만 의존하여야 한다
  • 인터페이스를 사이에 두고 클래스 레벨에서는 의존관계가 고정되지 않게 하고 런타임에 의존할 오브젝트와의 관계를 맺어준다
  • 의존관계를 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공해줌으로 써 만들어진다
  • 의존관계 주입에서는 자신이 스프링의 빈이여야 한다
  • 컨테이너가 오브젝트를 주입해 주려면 자신에 대한 생성과 초기화 권한을 가지고 있어야 하기 때문이다
  • 인터페이스를 통해 결합도가 낮은 코드를 만드는 장점이 있다(OOP 5원칙 - DIP)
Author: Song Hayoung
Link: https://songhayoung.github.io/2020/06/14/Spring/IoC-DI/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.