📌 DI란?
의존성 주입(Dependency Injection)은 외부에서 두 객체사이의 관계를 맺어준다는 의미이다. 이게 무엇이냐?
// 필드
private Phone phone;
// 생성자
public Person() {
this.phone = new SamsungPhone();
}
위의 코드를 보면 Person클래스는 Phone타입의 필드를 가지고 있다.
이때 Person의 생성자에서 직접 new를 이용해 SamsungPhone()이라는 객체를 생성하고, 필드에 연결해주고 있다.
하지만 이렇게 하지 말고 아래처럼 외부에서(파라미터로) 전달받아 객체를 연결해 주는 것을 의존성 주입이라고 한다.
// 필드
private Phone phone;
// 생성자
public Person(Phone phone) {
this.phone = phone;
}
위의 방식대로 외부에서 객체를 전달받으면 머가 좋으냐?
아래를 보면 전체 프로그래밍을 동작하도록 하는 main() 부분에서 원하는 객체를 적절하게 선택해서 전달해 줄 수 있다.
예를 들어 전달하는 객체는 Phone타입의 new SamsungPhone();이 될 수 도있고, new ApplePhone()이 될 수 도 있다. 아무튼 Phone타입의 다양한 객체를 취향에 맞게(?) 생성해서 전달해줄 수 있다.
public static void main(String[] args) {
// 원하는 Phone 객체를 생성!
Phone samsungPhone = new SamsungPhone(); // new ApplePhone(); new LgPhone(); ...
// Person이라는 객체에 전달해준다!
Person person() = new Person(samsungPhone);
}
📌 IoC란?
제어의 역전(Inversion of Control)은 말 그대로 제어를 하는 사람이 바뀌었다!라는 의미이다.
위의 의존성 주입의 예시에서 확인할 수 있는데, 기존에 Person객체 내부에서 Phone타입의 객체를 직접 생성했었다. 즉, 객체끼리 서로를 제어하고 있었다.
그러나 의존성 주입을 통해 외부에서 전달받게 됨으로써 이제 객체들 사이에 서로 제어를 하고 있지 않다. 외부에서 두 객체의 관계를 맺도록 제어를 하고 있는 것이다.
이렇게 제어를 하는 주체가 바뀌었다는 의미를 제어가 역전되었다고 하여 IoC(Inversion of Control)라고 부른다.
결국 DI와 IoC의 관계를 살펴보면 DI를 함으로써 IoC가 일어난 다는 것을 알 수 있다.
즉, DI는 IoC를 행하는 수단이다 라고 표현할 수 있다.
'Spring' 카테고리의 다른 글
[Spring] HTTP method (0) | 2023.11.06 |
---|---|
[Spring] 스프링 빈과 의존성 주입 해보기 (0) | 2023.11.03 |
[Spring] Controller 구현하기 (0) | 2023.11.02 |
[Spring] Controller, Service, Repository 3계층의 역할 (0) | 2023.10.31 |
[네트워크] API와 REST API (0) | 2023.10.27 |