Spring(2) - IOC, DI 컨테이너

김유담·2024년 6월 1일

spring

목록 보기
2/11
post-thumbnail

김영한 강사님스프링 핵심 원리의 강의 내용과 자료를 이용했음을 밝힙니다.

👨‍💻 IOC (Inversion Of Control)(제어의 역전)

일반적으로 어떤 객체를 구현을 하면 그 객체가 스스로 생성하고 실행하고 흐름을 가져갔다.

그런데! AppConfig가 추가된 코드를 보면 AppConfig가 어떤 객체들을 넘겨주냐에 따라서 우리가 만든 클라이언트 구현 객체들이 실행되냐, 실행되지 않느냐, 연결하냐 연결하지 않느냐 가 결정된다.

즉 AppConfig가 프로그램에 대한 제어흐름을 가지게 된다.

이렇게 직접 클라이언트 객체가 프로그램의 흐름을 제어하는 것이 아니라 AppConfig와 같이 외부에서 관리를 하는 것은 관리의 역전 즉 IOC(Inversion of Control)이라고 한다.

👨‍💻 왜 AppConfig를 외부라고 말하지?

이런 의문이 생길 수가 있다.
"아니 AppConfig도 프로그램의 일부인데 외부 취급하는 거지?"

정확히는 클라이언트 영역의 밖이라고 해서 외부(구성영역)이라고 하는 것이다.


그래서 위에서 말하는 구현 객체들도 사실상 워딩을 정확하게 한다면 클라이언트 객체라고 할 수 있다.

👨‍💻 흐름에 따른 프레임워크, 라이브러리 구분

  • 프레임워크가 흐름제어한다? -> 프레임워크 ex)JUnit
  • 내가 작성한 코드, 클라이언트가 직점 흐름 제어 -> 라이브러리

👨‍💻 DI (Dependency Injection)(의존관계 주입)

dependency injection 앞 블로그에서 말했던 내용이다.
Spring(1)을 보면 어느정도 감이 잡힐 것이다.

이를 조금 더 다듬어서 정리해보자면

"Dependency" : 의존
즉 의존관계에 대해서 알아보아야 한다.

Java에서 의존관계하면 떠오르는 것이 있을 것이다.

그렇다 인터페이스와 그 인터페이스에 의존하는 클래스

그런데 이 의존관계도 2가지로 나눠지는데

  • 정적인 클래스 의존관계
  • 동적인 클래스 의존관계

이 2가지이다.

👨‍💻 정적인 클래스 의존관계 vs 동적인 객체 의존관계

정적인 클래스 의존관계란 일종의 클래스 다이어그램에 보이는 의존관계이다.

이런 식으로 우리가 익숙한 그 그림에서 보이는 의존관계이다.

자 근데 여기서 우리가 확인 할 수 없는 것이 있다.

실제 프로그램이 실행될 때, 저장소가 메모리 저장소를 사용할 지, DB 저장소를 사용할지 혹은 할인 정책을 정액할인 정책을 사용할 지, 정률 할인 정책을 사용할 지 확인 할 수가 없다..

이렇게 실제 프로그램(앱)이 실행될 때, 결정되는 의존관계를 동적인 객체 의존관계라고 한다.

👨‍💻 DI -> 동적인 클래스 의존 관계

자 다시 DI로 돌아와서

프로그램 실행 시점에 외부에서 실현 구현 객체를 생성하고 클라이언트에 전달해서 클라이언트와 서버의 실제 의존관계가 연결되는 것이 DI 즉 의존관계 주입인 것이다.

프로그램 실행 시점: 동적인 객체 의존관계
외부: 구성영역 -> AppConfig

을 의미함을 알 수 있다.

그렇기에 의존관계 주입을 사용하면 정적인 클래스 의존관계를 건들이지 않고 동적인 객체 의존관계를 쉽게 변경할 수 있다.

👨‍💻 IOC, DI 컨테이너

이렇게 IOC, DI가 뭔지 알았는데 그러면 IOC, DI 컨테이너는 무엇일까?

AppConfig를 우리는 IOC, DI 컨테이너라고 한다.

즉 흐름제어를 하며(IOC), 동적인 객체 의존관계를 연결해주는(DI) 객체를 의미하는 것이다.

profile
잘하진 못할지언정 꾸준히 하는 개발자:)

0개의 댓글