제어의 역전

제어의 역전이란?

제어의 역전(Inversion of Control, 이하 IoC)란 의존성외부에서 주입 입니다.

지난 내용

이전글에서는 SOLID 원칙 중 DIP: 의존성 역전 원칙을 알아보았습니다.
의존성 주입은 클라이언트가 모든 요소를 제어해야한다는 단점이 생겼는데 이번 글에서는 제어의 역전이란 개념을 공부하며 어떻게 개선을 할 수 있을지 알아보겠습니다.

라이브러리와 프레임워크 차이

사실 이 개념을 우린 아주 친숙하게 사용하고 있는데 바로 프레임워크입니다.

라이브러리프레임워크
우리가 흐름을 제어하고 직접 라이브러리를 사용함프레임워크가 흐름을 제어하고 우리의 코드를 외부에서 사용함

라이브러리부터 예시를 통해 보겠습니다

val mainIntent = Intent(this, MainActivity::class.java)
startActivity(mainIntent)

Intent 객체를 직접 생성하고, this 를 이용하여 의존성을 직접 주입해주고 있습니다.
또한 startActivity 함수를 불러와 흐름을 제어하고 있습니다.

다음은 프레임워크를 보겠습니다

class MainActivity : AppCompatActivity() {
	override fun onCreate(savedInstanceState: Bundle?) {
		super.onCreate(savedInstanceState)
	}
}

안드로이드 프로젝트를 처음 시작할 때 MainActivity 코드입니다.
우린 클래스를 정의했지만 이 클래스를 생성하고 onCreate 함수를 호출하지 않습니다.
객체의 생성부터 의존성 주입까지 안드로이드 프레임워크가 해주고 있습니다.

이전 코드 흐름의 개선

이전 Car 와 Engine 의 관계를 IoC가 적용된 그림으로 표현해보겠습니다.

객체를 생성, 관리, 소멸 등을 책임져주는 IoC Container 객체에게 Car 객체를 요청하면
IoC Container 는 의존 관계에 따라 의존성 주입을 해주고 Car 객체를 돌려줍니다.

Spring 에서 @Configuration, @Bean 등의 어노테이션을 사용해서 아주 자주 쓰지만
저는 프론트 개발자이기 때문에 안드로이드 JetPack 라이브러리 중 Hilt 를 정리해보며
DI 와 IoC에 더 자세히 공부해보겠습니다.

포스팅에서 문제가 있는 부분은 언제든지 알려주세요!

좋은 웹페이지 즐겨찾기