스프링 프레임워크에 항상 붙어다니는 말인 DI 와 IoC의 차이를 잘 모르겠어서 공부하는 기록.
IoC란?
IoC (Inversion-of-Control) 은 제어 관계의 역전을 의미한다.
구현, 반응 등을 제어하고, 제어를 외부 핸들러/컨트롤러로 반전하거나/또는 리다이렉트하는 것이다.
예를 들어 애플리케이션이 라이브러리 (또는 툴킷으로도 알려진)에서 제공하는 구현을 호출하는 대신, 라이브러리나/또는 프레임워크가 애플리케이션에서 제공하는 구현을 호출한다.
쉬운 예로, 프레임 워크 없는 코드로 이루어진 경우에는, 객체의 생명 주기 (생성, 유지, 호출, 소멸)을 모두 클라이언트 구현 객체 측에서 관리되었다.
그러나 IoC의 경우, 객체의 동작은 구현하지만 그를 관리-제어하는 것은 프레임워크가 하는 일이다. 즉 라이브러리/프레임워크가 애플리케이션이 제공하는 구현을 호출하는 것이다.
IoC 패턴은 프로그램의 진행과 구현을 분리시키며, 객체 간 의존성이 낮아진다.
DI 란?
DI (Dependency-Injection)
DI는 IoC와 다른 개념으로도 여겨지지만, Martin Fouler 의 경우 모든 DI 구현은 기본적으로 IoC에 포함된다고 한다.
DI 패턴은 IoC보다 더 구체적이다. DI 패턴에서는 구현이 생성자, 세터, 서비스 조회를 통해 개체에 전달되고 개체가 올바르게 동작하기 위해 의존한다.
그럼 의존성이 낮아지는 패턴인데 왜 의존관계 주입 패턴이라 부르는가?
DI의 의존성은 다소 감이 잘 안오는 개념이기도 한데, DI는 오브젝트의 레퍼런스를 외부로부터 받은 뒤 타 오브젝트와 다이나믹하게 의존관계가 만들어진다고 한다.
런타임 이전에는 사용할 오브젝트가 어떤 클래스로 만들어졌는지 알 수 없고, 런타임 시에 의존관계를 맺는다. (의존 오브젝트)
참고로, DI가 IoC의 구체적인 개념이라 하더라도, DI 패턴을 IoC 패턴이라고 부르는 것은 자제하는 것이 좋다고 마틴 파울러와 토비의 스프링에서 모두 말하고 있다.
참고 문헌
Inversion of Control vs Dependency Injection
According to the paper written by Martin Fowler, inversion of control is the principle where the control flow of a program is inverted: instead of the programmer controlling the flow of a program, ...
stackoverflow.com
[Spring DI/IoC] IoC? DI? 그게 뭔데?
스프링을 공부하다 보면 꼭 나오는 이야기가 있다. 스프링은 IoC 컨테이너로 빈을 관리한다. 스프링은 DI를 사용한다 .DI 방법에는 생성자 주입, setter 주입, 필드 주입 등이 있다.... 아니 근데 대체
velog.io
토비의 스프링 3.1 (저자 이일민)
'Project' 카테고리의 다른 글
아임포트(포트원)로 PG 결제 테스트 도입하기 1) 기본 설정 (0) | 2023.08.16 |
---|---|
프로젝트 일기 1) 협업용 ERD 선택하기 (0) | 2023.07.24 |