#4. 의존관계 주입(DI)

Subin Ahn·2023년 5월 5일

토비의스프링

목록 보기
4/4
post-thumbnail
스프링 제어의 역전(IoC)의 동작 원리인 의존관계 주입(Dependency Injection)에 대해 공부한 내용을 정리해보겠다.

의존관계 주입(Dependency Injection)?

어떠한 오브젝트 레퍼런스를 외부로부터 제공(주입)받고, 이를 통해 다른 오브젝트와 다이내믹(dynamic)하게 의존관계가 만들어지는 것이 핵심!

👉 의존한다는 것?
A가 B에 의존하고 있을 때, 의존대상인 B가 바뀌면 그것이 A에 영향을 미치는 것! (반면에 B는 A의 변화에 영향을 받지 않음)

런타임 의존관계

의존관계 주입은 구체적인 의존 오브젝트와 그것을 사용할 주체, 보통 클라이언트라고 부르는 오브젝트를 런타임 시에 연결해주는 작업!

👉의존 오브젝트?
오브젝트가 만들어지고 나서, 런타임 시에 의존관계를 맺는 대상, 즉 실제 사용 대상인 오브젝트

👉 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제 3의 존재가 결정한다!

👉 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입)해줌으로써 만들어진다.


IoC/DI 컨테이너

두 오브젝트 사이의 런타임 의존관계를 설정해주는 의존관계 주입 작업을 주도하는 존재. 동시에 IoC 방식으로 오브젝트의 생성과 초기화, 제공 등의 작업을 수행하는 컨테이너

👉 자바에서 오브젝트에 무엇인가를 넣어준다는 개념은 메소드를 실행하면서 파라미터로 오브젝트의 레퍼런스를 전달해주는 방법뿐이다. 보통은 생성자 파라미터를 통해 전달 받아서 인스턴스 변수에 저장함!

👉 DI는 자신이 사용할 오브젝트에 대한 선택과 생성 제어권을 외부로 넘기고 자신은 수동적으로 주입받은 오브젝트를 사용한다는 점에서 IoC의 개념에 잘 들어 맞는다.

👉 DI를 원하는 오브젝트는 먼저 자기 자신이 컨테이너가 관리하는 빈이 되어야 한다.


마무리

스프링은 DI를 편하게 사용할 수있도록 도와주는 도구이면서, 그 자체로 DI를 적극 활용한 프레임워크이기도 하다. 스프링을 공부하는 건 DI를 어떻게 활용해야 할지를 공부하는 것!

객체지향 설계의 장점을 잘 보여주는 DI

👉 관심사의 분리를 통해 높은 응집도를 나타내는 것이 DI

👉 코드에는 런타임 클래스에 대한 의존관계가 나타나지 않고 인터페이스를 통해 결합도가 낮은 코드를 만들기 때문에, 다른 책임을 가진 사용 의존관계에 있는 대상이 바뀌거나 변경되더라도 자신은 영향을 받지 않으며, 변경을 통한 다양한 확장 방법에는 자유로움!


📝 참고문헌 : 토비의 스프링 3.1

profile
신뢰를 주는 개발자

0개의 댓글