의존성 주입(Dependency Injection)은 객체 지향 프로그래밍에서 중요한 개념 중 하나로, 객체 간의 의존성을 느슨하게 만들어주는 디자인 패턴이다.
의존성 주입은, 객체 간의 결합도를 낮추고 유연성과 재사용성을 높이기 위해 사용된다. 객체 간의 결합도가 높다는 것은, 한 객체가 다른 객체에 강하게 의존한다는 것을 의미 한다. 이러한 경우, 한 객체의 변경이 다른 객체에도 영향을 미치기 떄문에 유지보수가 어려워진다. 이를 해결하기 위해 의존성 주입을 사용.
아래 사진을 보면 A 클래스 안에 생성자 메서드에서 B클래스를 직접 생성하여 사용한다. 하지만 이러면 A가 B를 사용하지 않고 C를 사용하고 싶을 때 A클래스 내부에서 직접 변경해줘야 한다. 하지만 이러면 유지보수가 어려워진다.
이걸 의존성 주입으로 바꾸어 보면 아래 그림처럼 나타내 줄 수 있다. 이러면 좋은 점이 A 클래스는 생성자가 어떤 클래스를 받던지 상관을 안하게 되고 받은 클래스로 등록된 doSomethingElse()함수만 호출할 수 있으면 상관 없게 된다. 이러면 유지 보수도 편리해진다. 하지만 여기서 한가지 아쉬운 점은 여전히 A클래스 생정자 메서드 내부에서 클래스를 생성해 주고 있다. 여기서 IOC 제어의 역전이 필요한 시점이다.
제어의 역전(Inversion of Control)이란?
객체 간의 의존성을 외부에서 관리하여 객체의 생성 및 생명주기를 외부에서 제어하는 것을 의미한다. 일번적으로 객체를 생성하고 사용하는 책임은 객체 자체가 가지지만, 제어의 역전을 사용하면 이 책임을 외부에서 가져가게 된다. 이를 통해 유연성과 확장성이 높아지며, 객체 지향 프로그래밍에서 원칙적으로 중요한 개념 중 하나인 단일 책임 원칙을 지킬 수 있다.
제어의 역전은 일반적으로 의존성 주입을 통해 구현됩니다. 객체 간의 의존성을 외부에서 관리하기 때문에, 객체의 생성 및 생명주기를 외부에서 제어할 수 있습니다. 이를 통해 유지보수성이 높아지며, 객체 간의 결합도가 낮아져 코드의 재사용성과 유연성이 높아진다.
제어의 역전은 객체 지향 프로그래밍에서 중요한 개념 중 하나이며, 대표적인 예로는 스프링 프레임워크가 있습니다. 스프링 프레임워크는 객체 생성 및 의존성 주입을 외부에서 관리하며, 제어의 역전을 통해 유지보수성이 높은 소프트웨어 개발을 지원합니다.
이제 그림으로 봐보쟈
더이상 A 클래스 내부에서 생성하는 것이 아닌, 외부에서 생성된 클래스나 객체를 받아서 등록만 시켜주면 되도록 바뀌었다. 그러면 A클래스는 더이상 받은 클래스를 생성을 안해줘도 되게 되었으며. 좀 더 자신의 해야할 일에만 집중하도록 되었다.