IoC 와 DI 에 대해서 정리하려 합니다. IoC 와 DI 가 구체적으로 무엇인지 설명하기 전에 둘 사이의 관계를 짚고 넘어가면 좋을 것 같습니다.
IoC 는 어떠한 개념이고 DI는 이러한 개념을 구현하기 위한 디자인 패턴이라고 이해하면 됩니다.
IoC(Inversion of Control)
말 그대로 '제어의 역전'입니다. 보통 라이브러리와 프레임워크의 차이를 이야기할 때 '제어권이 누구한테 있느냐?'하는 이야기를 많이합니다. 일반적으로 우리가 개발을 할 때는 제어의 주도권은 당연히 개발자에게 있습니다.
개발자가 원하는 시점에 객체를 생성하고, 메서드를 호출하는 식으로 말이죠.
class A {
private B b;
public A() {
this.b = new B();
}
}
class B {
}
이런 코드가 있다고 생각해봅시다. class A 에서 직접 B 객체를 생성해서 사용하는 방식을 선택하면 어느 시점에 B 객체를 생성해서 A.b 에 넣어줄 지는 개발자의 마음입니다.
그런데 코드를 좀 바꿔 볼까요?
class A {
private B b;
public A(B b) {
this.b = b;
}
}
class B {
}
이제는 B 객체를 A 에서 생성하고 있지 않고 어딘지 모를 외부로부터 받아서 사용하고 있습니다. 즉, 제어의 주도권이 B 객체를 생성하는 누군가에게 넘어간 것입니다.
스프링 프레임워크를 사용해보신 분들은 알겠지만 빈으로 설정되면 우리가 따로 객체를 생성한 적이 없어도 알아서 스프링 프레임워크가 객체를 만들어서 필요한 곳에 넣어 동작하게 해줍니다. 즉 제어의 주도권이 우리한테서 스프링 프레임워크로 넘어간 것이죠.
이것이 바로 IoC 제어의 역전이라는 개념입니다.
DI(Dependency Injection)
의존성 주입이라고 불리는 이 패턴은 IoC 라는 개념을 구현하기 위한 패턴이라고 했습니다.
먼저 '의존성'이란 위 코드처럼 A 클래스 객체를 만드는 데에 B 클래스 객체가 필요하다면 A 는 B 에 의존적이다 라고 할 수 있습니다.
그럼 다시 두 코드를 살펴보겠습니다.
class A {
private B b;
public A() {
this.b = new B();
}
}
class B {
}
이 코드는 A 클래스 객체를 만들기 위해서는 B 객체도 만들어야 하므로 A 가 B 에 의존적이라고 할 수 있습니다. 그리고 객체를 만드는 행위는 A 클래스 내부에서 일어나고 있으므로 의존성이 내부에서 발생한 것이라고도 볼 수 있습니다.
class A {
private B b;
public A(B b) {
this.b = b;
}
}
class B {
}
반면 이 코드는 여전히 A 클래스 객체를 만들기 위해 B 객체도 필요하므로 A 가 B 에 의존적이지만 B 객체를 외부로부터 받아오고 있기 때문에 이를 의존성이 외부로부터 주입됐다 하여 '의존성 주입'이라고 합니다.
여기서 눈치가 빠르신 분들은 제어의 역전이 일어난 코드랑 의존성 주입이 일어난 코드랑 같네? 라는 생각을 하실 수 있습니다.
이는 처음에 설명했듯 IoC 라는 것은 하나의 개념이고 DI 는 그 개념을 구현하기 위한 하나의 패턴이기 때문입니다. 실제로 DI는 IoC 를 구현하기 위한 하나의 방법일 뿐 DI를 이용하지 않아도 IoC 를 구현하는 다른 방법들은 존재합니다.
IoC 의 장점
IoC 의 장점은 크게 5가지가 있습니다.
1. 객체 간 결합도를 낮춘다
2. 유연한 코드를 작성할 수 있다
3. 가독성을 증진시킨다
4. 코드의 중복을 방지할 수 있다
5. 유지 보수에 용이하다
여기서 '객체 간 결합도를 낮춘다'는 의미는 어떤 의미일까요?
A 가 B 에 의존적이라고 할 때
B 코드를 수정하면 A 코드도 수정해야 하는 상황 vs B 코드를 수정해도 A 에는 영향이 없는 상황
둘 중에 어떤 것이 더 결합도가 높다고 생각하시나요?
맞습니다. 전자가 객체간 결합도가 더 높은 상황입니다.
실제로 예제로 들었던 코드에서 IoC 이전의 코드에서는 B의 생성자가 변하면 A 에서도 똑같이 바꿔줘야 하지만 IoC 가 적용된 코드에서는 B의 생성자가 바뀌든 말든 A 에는 아무런 영향이 없는 것을 볼 수 있습니다.
'항해99' 카테고리의 다른 글
[WIL] 항해 3주차 (0) | 2023.04.23 |
---|---|
[TIL] DAY 17 (0) | 2023.04.20 |
[TIL] DAY 15 (1) | 2023.04.18 |
[WIL] 항해 2주차 (0) | 2023.04.17 |
[TIL] DAY 13 (0) | 2023.04.16 |