본문 바로가기
관리자

Programming-[Backend]/Spring

[스프링 기초] 7. IoC, DI, 컨테이너

728x90
반응형

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


이전 글에서 사용영역과 구성 영역을 구분함으로써 객체 지향 설계 원칙을 지킬 수 있었다. 구성 정보를 설정하는 AppConfig 클래스를 만들어서 객체를 생성하고, 할당하였다.

이전글 : 6. 사용영역과 구성영역 나누기로 SRP, OCP, DIP 원칙 실현하기

IoC는 용어의 이름에서 알 수 있듯, 구성 정보를 내가(실행 코드가 있는 객체가) 직접 설정하는 것이 아니라, 외부(라이브러리, 프레임워크 등)에서 이런 과정을 대신해주는 것을 의미한다.
-> AppConfig.class 파일에서 구성 정보를 설정해주는 것도 IoC라고 할 수 있다.


2. DI(Dependency Injection)


DI는 직역하면 '의존 관계 주입' 이지만, 좀 더 구체적으로 이해하자면
" 애플리케이션 실행 시점에 필요한 객체들의 인스턴스를 생성하고 클라이언트에 전달하여 서버와 클라이언트를 연결하는 것"
이라고 정의된다. 여기서 2가지, "실행 시점에 생성" 및 "정적-동적 객체 인스턴스 의존 관계" 개념을 이해해야 한다.

2-1. 실행 시점에 생성되는 인스턴스


자바 언어는 다른 객체(클래스)를 전달하는 방식으로 대상 객체와 똑같은 객체인 인스턴스를 생성한다. 그리고 다른 클래스에 이 인스턴스의 참조값을 전달한다. 한 객체가 다른 객체의 참조값을 갖고 있음으로써 객체들끼리 연결이 되는 것이다. DI, 즉 의존관계 주입은 다른 객체의 참조값만 들고 있다가, 애플리케이션이 실제 실행될 때 인스턴스 값을 넘기는 방식이다.


2-2. 정적-동적 객체 인스턴스 의존 관계


Service 코드에서 인터페이스(CreatureRepository, CaringPolicy)들을 참조했다. 이런 부분들은 해당 객체가 참조하는 구현체가 무엇인지는 알지 못하지만, 적어도 어떤 의존 관계를 갖고 있는지 보여준다. 이런 추상화에 의존하는 관계는 아래 다이어그램과 같이 이미 정해진 객체들을 참조하기 때문에 정적 객체 인스턴스 의존 관계라고 한다.

Service 코드에서 CreatureRepository, CaringPolicy 추상화에 의존하는 의존 관계가 표현되어 있다.


 의존 관계 다이어그램. 사용영역에 표현된 interface 들은 정적 관계로 의존 관계를 갖고 있다.



그러나, 실제 구현체는 AppConfig 라는 외부 객체에 의해 실행 전에 결정되도록 되어있다. 실행 전까지 어떤 구현체가 할당될지 모른다. 이러한 관계를 동적 객체 인스턴스 의존 관계 라고 한다. 요약하자면 어떤 인터페이스를 참조할 것인지는 정적으로 명시하되, 실제 어떤 구현체를 담을지는 동적으로 할당한다는 것이다.

이렇게 클라이언트 코드를 변경하지 않고, 클라이언트가 호출하는 대상 구현체를 설정하여 서버와의 의존 관계를 갖는 것을 의존 관계 주입, DI 라고 한다. 의존 관계 주입을 이용하여 동적 객체 인스턴스를 클라이언트 코드 변경없이 바꿔줄 수 있다.

쉽게 말해서 인터페이스를 참조하도록 되있으니까, 설정 정보에서 인터페이스에 해당하는 구현체를 동적으로 바꿔줄 수 있다는 이야기이다.


3. 컨테이너



결국, 앞 글에서 살펴본 구성 정보를 관리하는 객체, AppConfig.class 같은 것을 DI 컨테이너 또는 IoC 컨테이너 라고 한다. Service 코드의 생성자에 구현체를 넣어주는 객체, 즉 의존 관계를 주입하는 클래스를 컨테이너라고 한다. 다른 말로는 구현체를 조립 또는 생성해준다고 해서 어셈블러 또는 오브젝트 팩토리 라고도 부른다.

이제 기본 원리를 이해했으면 Spring을 사용하는 방식으로 넘어가자.


참조

1. 인프런_스프링 핵심 원리 기본편_김영한 님 강의
www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

728x90
반응형