DI란 무엇인가?
DI(Dependency Injection)은 의존성 관계 주입이라 한다.
그러면 Dependency 의존관계는?
토비의 스프링에서는 '의존대상 B가 변하면 그것이 A에 영향을 미친다' 즉
B의 기능이 추가 또는 변경되거나 형식이 바뀐다면 그것이 A에 영향을 미친다는 의미인다.
의존관계를 인터페이스로 추상화하면 더 다양한 의존관계를 맺을 수 있으며
실제 구현 클래스와의 관계가 느슨해지고 결합도가 낮아진다
의존성 주입이 필요한 이유
public class Store{
private Pencil pencil;
public Store() {
this.pencil = new Pencil();
}
만약 연필과 연필을 판매하는 store 클래스가 있다 가정하자
위의 코드는 두 가지의 문제점을 가지고 있다.
- 두 클래스는 강하게 결합되어 있다.
- 객체들 간의 관계가 아닌 클래스 간의 관계가 맺어진다.
1. 두 클래스가 강하게 결합되어 있다.
두 클래스는 강하게 결합되어 있어 만약 연필이 아닌 지우개와 같은 다른 상품을 판매한다면 Store클래스의 생성자를 변경하는 작업이 필요하다.
이러한 부분은 코드의 유연성을 떨어트리며 이러한 해결점으로 상속이 있지만 상속은 제약이 많으며 확장성이 떨어지므로 피하는 것이 좋다.
2. 객체들 간의 관계가 아니라 클래스 간의 관계가 맺어진다.
Store와 Pencil은 클래스간의 관계가 맺어져 있다는 것이 문제이다.
올바른 객체지향적 설계라면 객체들간의 관계가 맺어져야한다.
객체들 간의 관계가 맺어지게 되면 다른 객체의 구체 클래스를 전혀 알지 못하더라도
(해당 클래스가 인터페이스를 구현하였다면) 인터페이스의 타입으로 사용할 수 있다.
위의 두 문제점이 발생하는 이유는 Store에서 어떤 제품을 판매할지에 대한 관심이 분리되지않았기 때문이다.
이러한 문제점을 해결하기 위해 Spring에서는 DI(Dependency Injection)을 사용하였다.
의존성 주입을 통해 해결
위의 문제를 해결 하기 위해 다형성이 필요하다. 모든 제품을 하나로 표현하기 위한 Product라는 인터페이스를 도입한다.
public interface product {
}
public class Pencil implements product {
}
그후 강하게 결합되어 있는 부분을 제거한다.
제거하기 위한 방법은 외부에서 상품을 주입(Injection)받아야한다.
public class Store {
private Product product;
public Store(Product product) {
this.product = product;
}
}
이러한 이유로 Spring이라는 Di컨테이너가 필요하다
Store에서 Product 객체를 주입하기 위해 애플리케이션 실행 시점에 필요한 객체(빈)을 생성하며,
의존성이 있는 두 객체를 연결하기 위한 한 객체를 다른 객체로 주입 시켜야한다.
이러한 부분은 스프링 프레임워크가 완벽하게 지원해준다.
스프링은 특정 위치부터 클래스 탐색, 객체생성, 객체관계설정까지 하며 이러한 특징으로 스프링은 DI 컨테이너라고도 한다.
이러한 개념은 제어의역전(Inversion Of Control, IOC) 라고 하기도 한다.
의존성 주입 정리
Spring은 의존성 주입을 도와주는 DI 컨테이너로써, 강하게 결합된 클래스들을 분리하고
애플리케이션 실행 시점에 객체간의 관계를 결졍함으로써 결합도를 낮추고 유연성을 확보한다.
한 객체가 다른 객체를 주입 받으려면 반드시 DI컨테이너에 의해 관리 되어야 한다.
- 두 객체간의 관계라는 관심사의 분리
- 두 객체간의 결합도를 낮춤
- 객체의 유연성을 높임
- 테스트 작성을 용이하게 한다.
의존관계 주입할 객체를 계속해서 생성 및 소멸한다면 성능에 부담이 될 수 밖에없어
스프링은 기본적으로 싱글톤(Singleton)으로 관리한다.
출처:
https://mangkyu.tistory.com/150
[Spring] 의존성 주입(Dependency Injection, DI)이란? 및 Spring이 의존성 주입을 지원하는 이유
1. 의존성 주입(Dependency Injection)의 개념과 필요성 [ 의존성 주입(Dependency Injection) 이란? ] Spring 프레임워크는 3가지 핵심 프로그래밍 모델을 지원하고 있는데, 그 중 하나가 의존성 주입(Dependency Inj
mangkyu.tistory.com
'Spring' 카테고리의 다른 글
| [Java] Stream이란? (0) | 2023.05.14 |
|---|---|
| [SpringBoot] 싱글톤(Singleton) 이란? (0) | 2023.05.12 |
| [SpringSecurity] AccessDeniedHandler (0) | 2023.05.09 |
| [SpringBoot] @Slf4j 와 @Log4j2 (0) | 2023.05.08 |
| [SpringBoot] @Transactional에 대해 (0) | 2023.05.07 |