[Spring] IoC, DI 그리고 컨테이너

kdkdhoho·2022년 2월 20일
0

Spring

목록 보기
8/26

이 글은 인프런 - 스프링 핵심 원리 기본편을 보고 공부한 것을 정리한 글입니다.

제어의 역전, IoC(Inversion of Control),

프로그래머가 직접 객체를 제어하는 것이 아니라, 프레임워크 같은 것이 대신 제어하는 것이다.
따라서 말 그대로 제어권이 역전된다는 것이다.

하지만 AppConfig가 등장하고 구현 객체는 자신의 로직을 실행하는 역할만 담당한다.
프로그램 제어 흐름은 이제 AppConfig가 가져간다. 심지어 구현체까지 AppConfig가 생성한다.

이렇듯 프로그램의 제어 흐름을 프로그래머가 직접 제어하는 것이 아닌, 외부에서 관리하는 것을 제어의 역전이라고 한다.

프레임워크 vs 라이브러리

프레임워크가 내가 작성한 코드를 제어하고, 대신 실행하면 그것은 프레임워크가 맞다.(JUnit)
반면에 내가 작성한 코드가 직접 제어의 흐름을 담당하면, 그것은 프레임워크가 아니라 라이브러리다.


의존관계 주입, DI(Dependency Injection)

의존관계는 '정적인 클래스 의존관계'와 '동적인 객체 의존관계'를 분리해서 생각해야 한다.

정적인 클래스 의존관계는, 클래스가 사용하는 import 코드만을 보고 쉽게 판단할 수 있다.
또 실행하지 않고도 알 수 있다.

동적인 객체 의존관계는, 실행 시점에 실제 생성된 객체 인스턴스의 참조가 연결된 의존관계이다.
즉, 어떤 구현체가 연결되는지에 대한 의존관계라고 생각하면 된다.

어플리케이션 실행시점(런타임)에 실제 구현 객체를 생성하고 클라이언트에 전달해서 클라이언트와 서버의 실제 의존관계가 연결되는 것을 의존관계 주입이라고 한다.
객체 인스턴스를 생성하고, 그 참조값을 전달해서 연결한다.

따라서 의존관계 주입을 사용하면 클라이언트 코드를 변경하지 않고, 클라이언트가 호출하는 대상의 타입 인스턴스를 변경할 수 있다.
그리고 정적인 의존관계를 변경하지 않고, 동적인 의존관계를 변경할 수 있다. => DIP 지킨다 !


IoC 컨테이너, DI 컨테이너

각 컨테이는 IoC를 해주는 컨테이너, DI를 해주는 컨테이너라고 생각하면 된다.

AppConfig처럼 객체를 생성하고 관리하면서 의존관계를 주입하는 것IoC컨테이너, 또는 DI컨테이너라고 한다.
하지만 IoC는 의미의 사용이 범용적이기에 DI 컨테이너라고 부르자.

추가로 어셈블러, 오브젝트 팩토리 등으로 불리기도 한다.

profile
newBlog == https://kdkdhoho.github.io

0개의 댓글