-
[Spring][Kotlin] 제어의 역전(Ioc)과 의존관계 주입(DI)Spring 2022. 4. 13. 01:08
제어의 역전 IoC (Inversion of Control)
: 구현 객체가 제어 흐름을 스스로 조종하지 않고 외부에서 관리하는 것을 말한다.
앞 포스팅에서의 코드에서
class MemberServiceImpl: MemberService(){ val memberRepository = MemoryMemberRepository() //생략 }위의 코드는 MemberServiceImpl 객체가 스스로 필요한 서버 구현 객체를 생성하고 연결하고 실행한다.
즉 구현 객체가 프로그램의 제어 흐름을 조종한다.
class AppConfig{ fun memberRepository() = MemoryMemberRepository() fun memberService() = MemberServiceImpl(memberRepository()) //생략 }하지만 AppConfig가 등장하고는 제어 흐름의 권한은 AppConfig에게 있다.
객체들은 자신의 로직을 실행할 뿐이다.
이렇게 제어의 흐름이 외부에서 관리되는 것을 IoC 라고 한다.
c.f] 프레임워크 vs 라이브러리
내가 작성한 코드를 제어하고 대신 실행한다면 프레임워크. ex) JUnit
내가 작성한 코드가 직접 제어흐름을 담당한다면 그것은 라이브러리.
여기서 JUnit을 예로 들면 프레임워크는 본인만의 라이프 사이클이 있다.
BeforeEach 먼저 실행하고 Test 실행, AfterEach 실행 이런 흐름.
그 lifecycle 속에서 내 코드는 콜백 형태로 호출되는것이다.
즉 프레임워크 안에서 적절한 타이밍에 내 코드가 호출된다.의존관계 주입 DI (Dependency Injection)
클라이언트는 어떤 구현 객체가 사용될 지 모른 채 인터페이스에 의존한다.
이때 실행 시점(런타임)에 외부에서 실제 구현 객체를 클라이언트에 전달해서 실제 의존관계가 연결되는 것을 의존관계 주입이라고 한다.
[정적인 클래스 의존관계]
: import 코드만 보고도 파악 가능한 의존관계
앱을 실행하지 않고도 분석 가능하다.
하지만 이것만으론 실제 어떤 객체가 주입될 지 알 수 없다.
[동적인 객체 의존관계]
: 애플리케이션 실행 시점에 실제 생성된 객체 인스턴스의 참조가 연결관 의존관계DI(의존관계 주입)을 사용하면 정적인 클래스 의존관계를 변경하지 않고 동적인 객체 인스턴스 의존관계를 쉽게 변경할 수 있다.
이렇게 IoC, DI 해주는 컨테이너를
IoC 컨테이너 = DI 컨테이너 = 어셈블러 = 오브젝트 팩토리
라고 한다.
의존관계 주입에 초점 맞추어 최근에는 주로 DI 컨테이너라고 한다고 한다.
DI 컨테이너 ex) AppConfig, Spring..etc
[출처]
스프링 핵심 원리 - 기본편
스프링 핵심 원리 - 기본편 - 인프런 | 강의
스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...
www.inflearn.com
'Spring' 카테고리의 다른 글
[Spring][Kotlin] 싱글톤 컨테이너 (0) 2022.05.18 [Spring][Kotlin] 스프링 컨테이너 (0) 2022.05.12 [Spring][Kotlin] 순수 자바로 객체지향 설계원칙 지키기 + 스프링으로 전환 (0) 2022.04.12 [Spring][Kotlin] 좋은 객체지향 설계 5가지 원칙 SOLID와 스프링 (0) 2022.04.12 [Spring] 객체지향 특징과 다형성과 스프링 (0) 2022.04.11