Spring IoC, DI 가 무엇인지
본문 바로가기
Spring

Spring IoC, DI 가 무엇인지

by IYK2h 2022. 4. 19.
728x90

IoC(Inversion of Control) : 제어가 반대로 간다는 개념

IoC는 Spring 에서만 사용되는 개념이 아니며, 프로그래밍 패턴이기 때문에 범용적으로 쓰이며 작게는 객체간에 디자인 패턴으로 크게는 컨테이너, 프레임워크 역활에 적합한 구조이기 때문에 상황에 맞게 사용되는 프로그래밍 모델이다.

"IoC : 제어의 역전" 이라는 의미는 말 그대로 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미한다.

즉, IoC는 객체 생명 관리, 흐름 제어를 제 3자에게 위임하는 프로그래밍 모델이다.

일반적으로 자바 프로그램은 main() 메소드에서 시작해서 개발자가 미리 정한 순서를 따라 객체가 생성되곡 실행된다. 그런데 서블릿은 배포하고 나서 개발자가 직접 제어할 수 있는 방법은 없다. 즉, 자바는 컴파일 타임, 서블릿은 런타임에서 객체 생성/할당 하는 차이가 있다. IoC는 이를 컴파일 타임이 아니라 런타임에서 객체 생성/할당하게 해준다.

이점

역활과 책임에 분리 -> 객체지향 프로그래밍화 객체지향 프로그래밍이란, 각 객체마다 자기의 역활과 책임을 온전히 다하며 서로 협력하며 변경에 유연한 프로그래밍을 할 수 있는 프로그래밍 기법이다. 즉, 각 객체마다 올바른 캡슐화를 통해 높은 응집도와 낮은 결합도를 이루어나가는 것이 핵심이다.

객체지향 프로그래밍 관점으로 제어의 역전으로 인해 다른 객체, 다른 컨테이너에게 제어에 대한 역활과 책임을 위임하고 지금 내가 하고자 하는 역활에 집중이 커진다. 즉, 변경에 유연한 코드 구조를 가져가기 위해서이다.(캡슐화)

즉, 객체를 관리와 구현 하고자 하는 비지니스 로직을 분리함으로써 서로에 역활에 집중하고 병경에 유연한 코드를 작성 할 수 있는 구조이기 때문이다.

DI(Dependency Injection) 의존성 주입: 외부에서 의존 객체를 생성하여 전달하는 것

IoC가 매우 느슨하게 정의돼서 폭넓게 사용되는 용어라는 점이다. 때문에 스프링을 IoC 컨테이너라고만 해서는 스프링이 제공히는 기능의 특정을 명확하게 설명하지 못한다.

IoC 방식의 핵심을 짚어주는 의존관계 주입 DependencyIniection이라는, 좀 더 의도가 명확히 드러나는 이름을 사용하 기 시작

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

Reference : 토비스프링

"쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

DI는 IoC 프로그래밍 모델을 구현하는 방식중에 하나이다. IoC를 구체적으로 DI 방식을 통해 의존성 역전 제어를 하는 것

의존성(Dependency)

서로 다른 객체간에 레퍼런스 참조가 되어 있다. A 가 B에 의존관계에 있을 때, B객체에 변경사항이 생겼을 때, A 객체가 영향을 받는 구조

주입(Injection)

외부로부터 객체의 레퍼런스(주소) 값을 전달 받게 되어 객체가 참조 되어지는 방식

의존성 주입(Dependency Injection)

의존적인 객체를 직접 생성하거나 제어하는 것이 아니라, 특정 객체에 필요한 객체를 외부에서 결정해서 연결시키는 것을 의미

즉, 클래스 기능을 추상적으로 묶어둔 인터페이스를 가져다 쓰면 되는것이다. 나머지는 스프링에서 객체를 주입해주기 때문

의존성 주입으로 인해 모듈간 결합도가 낮아지며 유연성이 높아진다

DI 의존관계 주입에 3가지 조건

  • 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 그러기 위해서는 인터페이스에만 의존하고 있어야 한다.
  • 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다.
  • 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입)해줌으로써 만들어진다.

핵심

DI는 클래스타입이 고정되어 있지 않고 인터페이스 타입의 파라미터를 통해 다이나믹하게 구현 클래스를 결정해서 제공 받을수 있는 것

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

컴파일 타임이 아니라, 런타임에 의존성을 주입하는 것 imort를 이용한 컴파일 타임 주입, 일반적인 dependency 관계인데, 반면 DI의 @autowired 등의 설정을 사용해 런타임에 필요한 객체를 생성/할당 할 수 있는것

IoC vs DI 차이

IoC는 객체의 흐름, 생명 주기 관리 등 독립적인 제삼자에게 역활과 책임을 위임하는 방식에 프로그래밍 모델로서 디자인패턴에서도 찾아볼 수 있고 다른 컨테이너를 가진 프레임워크들에서도 찾아볼 수 있다.

DI는 인터페이스를 통해 다이나믹하게 객체를 주입하여 유연한 프로그래밍을 가능하게 하는 패턴으로 좀 더 구체적인 의미이다.

728x90

'Spring' 카테고리의 다른 글

Java Bean? Spring Bean?  (0) 2022.04.29
Spring DI 종류  (0) 2022.04.22
Spring-JPA-hibernate.naming  (0) 2022.03.22
Filtet vs Interceptor  (0) 2022.03.18
Spring Security  (0) 2021.09.10

댓글