김영한님의 스프링 핵심 원리 - 기본편 강의
24강 IoC, DI, 그리고 컨테이너를 듣고 작성했습니다.

제어의 역전 IoC (Inversion of Control)

프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것이다.
ex.지금까지 실습한 예시 중 프로그램에 대한 제어 흐름 권한을 AppConfig가 가지고 있었다.

프레임 워크 vs 라이브러리

프레임워크: 내가 작성한 코드를 제어하고, 대신 실행하면 프레임워크 (JUnit)
라이브러리: 내가 작성한 코드가 직접 제어의 흐름을 담당한다면 그것은 프레임워크가 아니라 라이브러리
ex. 자바 객체를 xml or json으로 바꿈. 라이브러리 불러다가 직접 호출.

의존관계 주입 DI (Dependency Injection)

정적인 클래스 의존관계

  • import 코드만 보고 의존관계 쉽게 파악할 수 있다.
  • 애플리케이션을 실행하지 않고도 분석할 수 있다.
  • inteliij 내에서 Diagram 으로 확인 가능하다.
  • 클래스 의존관계만으로도 실제 어떤 객체가 주입되는지 알 수 없다.
 private final MemberRepository memberRepository;

    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;  # 뭐가 주입되는지 알 수 없음
    }
}

실행 시점에 결정되는 동적인 객체 의존관계

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


의존 관계 주입을 사용하면

  • 클라이언트 코드를 변경하지 않고, 클라이언트가 호출하는 대상의 타입 인스턴스를 변경 가능
  • 정적인 클래스 의존관계를 변경하지 않고, 동적인 객체 인스턴스 타입 변경 가능 (메모리 저장소 / 외부 저장소)

IoC 컨테이너, DI 컨테이너

  • AppCofig처럼 객체를 생성하고 관리하면서 의존관계를 연결해 주는 것
  • 최근에는 주로 DI컨테이너라고 한다.
  • 어샘블러, 오브젝트 팩토리라고도 함 (애플리케이션에 대한 전체 조립한다고 해서)