Spring - IoC & DI
1. 의존성
-
파라미터나 리턴값 또는 지역변수 등으로 다른 객체를 참조하는 것
-
예를들면, MemberService 는 MemberRepository 를 참조한다.
2. IoC (Inversion of Control)
-
IoC는 제어의 역전이다.
-
우리가 Service에 대한 Interface를 만들 때, 해당 Interface가 어떤 구현체를 의존하는지 Controller에서 알지 못하게 하고, DI 컨테이너나 AppConfig와 같은 외부에서 조립하고 알 수 있게 제어권을 넘긴다. 이러한 것을 IoC라고 한다.
3. DI (Dependency InjectionDependency Injection)
-
DI는 의존관계 주입을 말하는데 예를들어 Controller에서 Service를 의존할 때,
private final Service service;
- 라고만 선언한다.
-
실제 저 Service에 어떤 구현체가 연결될 지 모른다는 것이다.
-
하지만 RunTime에 외부(Spring의 DI 컨테이너나 AppConfig)에서 구현 객체를 생성하고 클라이언트에 전달해서 서버의 실제 의존관계가 연결되는 것을 DI라고 한다.
4. 결론
-
IoC와 DI는 이처럼 미묘한 차이가 있는데, 어디에 Focus를 맞추느냐에 따라 다르다고 생각하면 된다.
-
어떤 구현체를 의존하게 되는지는 외부에서 결정되는데, 외부에서 결정되는 것에 Focus를 맞추면 IoC이고, 런타임에서 해당 의존관계가 외부로부터 정해져서 서버의 실제 연결되는 것에 Focus를 맞추면 DI라고 한다.
-
우리가 Junit 처럼, Test를 할 때 제어권을 아예 Junit에게 넘기는데 그걸 IoC라고도 한다.
-
하지만 저게 DI는 될 수 없다. 의존관계를 주입해주는건 아니기 때문이다.
-