Spring IoC, DI, Container

강정우·2023년 10월 29일
0

Spring-boot

목록 보기
4/73
post-thumbnail

Ioc (Inversion of Control)

  • 제어의 역전 즉, IoC는 내가 무언가 코드를 호출하는게 아닌 프레임워크가 내 코드를 대신 호출해 주는 것이다.
    즉, 말 그대로 제어권이 내가 아닌 프레임워크에게로 넘어가면서 나타나는 뜻이다.

  • 예를 들어 기존의 프로그램은 클라이언트 구현 객체가 스스로 필요한 서버 구현 객체를 생성, 연결, 실행까지 했었다.
    즉, 구현 객체가 프로그램의 제어 흐름을 스스로 조종했다.
    다만 이제 객체지향 설계 5원칙을 따르며 개발을 하다보니 AppConfig라는 개념이 불가피해졌고
    이로인해 구현객체는 자신의 로직을 실행하는 역할만 담당하게 되었다. 즉, 프로그램의 제어 흐름은 이제 AppConfig가 가져간다.

  • 위에서 프레임워크에서 제어를 한다고 했지만 조금 더 정확하게 말하면 프로그램 자체(~~Impl)에서 제어를 하는 것이 아닌 제어 흐름을 외부(AppConfig)에서 관리하는 것이 바로 제어의 역전이다.

프레임웤 vs 라이브러리

jUnit
  • 제어의 역전으로 대표적인 예가 jUnit 이라는 프레임웤인데 내가 작성만 한 코드에 대한 실행과 제어권을 jUnit과 test framework이 이걸대신 실행한다.

  • 뭐 본인만의 라이프 사이클이 있어 예를들어 @beforeEach를 먼저 실행하고 다음 각각의 테스트를 실행한다. 라는 것이다. 즉, 호출하는 제어권을 넘기는 것이다.

library
  • 반면, 내가 작성한 코드가 직접 에어의 흐름을 담당한다면 그것은 프레임워크가 아니라 라이브러리이다.

DI (의존관계 주입)

  • 앞서 우리가 객체 지향 5원칙을 지키려 개발을 하다보니 AppConfig가 등장하였고 이로인하여 구성부분을 따로 분리하였다.
    따라서 클라이언트 객체(~~Impl)는 실제로 어떤 구현 객체가 사용될지 모른다.

그래서 우리는 "정적인 클래스 의존 관계와 실행 시점에 결정되는 동적인 객체(인스턴스) 의존 관계"를 분리해서 생각해야안다.

정적인 클래스 의존관계

  • 클래스가 사용하는 import만 보고 의존관계를 판단할 수 있다.
    즉, 정적인 의존관계는 애플리케이션을 실행하지 않아도 분석할 수 있다.

  • mac 단축키 opt + shift + cmd + U

  • 그리고 상단 show dependency를 누르면 위와같이 의존성을 한눈에 확인할 수 있다.

동적인 클래스 의존관계

  • 애플리케이션 실행 시점에 실제 생성된 객체 인스턴스의 참조가 (AppConfig)연결된 의존 관계이다.

  • 애플리케이션 실행 시점에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전달해서 클라이언트와 서버의 실제 의존 관계가 연결 되는 것을 의존관계 주입(DI)이라 한다.

  • DI를 사용하면 클라이언트 코드를 변경하지 않고, 클라이언트가 호출하는 대상의 타입 인스턴스를 변경할 수 있다.

  • DI를 사용하면 정적인 클래스 의존 관계를 변경하지 않고, 동적인 객체 인스턴스 의존관계를 쉽게 변경할 수 있다.

IoC Container, DI Container

  • AppConfig 처럼 객체를 생성하고 관리하면서 의존관계를 연결해 주는 것을 IoC Container 혹은 DI Container이라 한다.

  • 의존관계 주입에 초점을 맞추어 최근에는 주로
    DI Container(assembler, Object Factory)이라 한다.

profile
智(지)! 德(덕)! 體(체)!

0개의 댓글