DI란 Dependency Injection의 줄임말입니다. 이것은 의존관계 주입이라고 불립니다.
의존 관계의 정의란 무엇일까요?
A가 B에 의존한다는 것은 B가 변하면 A가 영향을 받는다는 것을 의미합니다.
예를 들어 '컴퓨터' 라는 클래스가 있고 이 클래스는 'CPU001' 라는 클래스에 의존하고 있다고 가정해봅시다.
이떄 CPU001이 아닌 다른 종류의 CPU로 바꾸고 싶으면 컴퓨터 클래스 내부에 있는 코드를 수정해야합니다.
만약 컴퓨터 클래스가 CPU001 뿐만 아니라 다양한 다른 클래스에도 의존하고 있으면
의존관계에 있는 클래스를 바꿀 때 마다 컴퓨터 클래스를 수정해야 될 것입니다.
public class Computer {
private CPU001 cpu001;
public Computer() {
this.CPU001 = new CPU001();
}
}
위와 같은 문제를 해결하기 위해서는 다형성이 필요합니다.
CPU001이나 다른 종류의 CPU002와 같은 클래스를 모두 받기 위해서는
CPU라는 인터페이스가 필요합니다.
public interface CPU {
}
public class CPU001 implements CPU {
}
이런식으로 인터페이스 활용하면
생성자에서 의존관계에 있는 클래스 객체를 바로 생성하는 것이 아니라
외부로 부터 어떤 종류의 CPU를 받을 것인지 주입을 받아야 합니다.
public class Computer {
private CPU cpu;
public Computer(CPU cpu) {
this.cpu = cpu;
}
}
여기서 Cpu 어떤 CPU001이나 CPU002와 같은
어떤 종류의 CPU를 주입할지 결정할 때 필요한 것이
DI인젝션입니다.
스프링이 DI컨테이너를 활용하여
어플리케이션 실행 시점에 주입할 CPU종류를 정하고
해당 CPU의 객체를 생성합니다.
그리고 Computer를 생성할 때 해당 CPU 객체를 주입해줍니다.
의존성 주입을 활용함으로써
강하게 결합된 클래스에서 오는 단점들을 극복할 수 있습니다.
만약 CPU001을 주입했는데 다른 CPU002로 바꿔야 한다면
Computer 클래스에 있는 모든 cpu 관련 내용을 수정할 필요 없이
주입할 cpu 종류만 바꿔주면 됩니다.
다시 말해 이는 리팩토링에 유리해지고 확장을 쉽게하게 만들어 줍니다.
'Spring' 카테고리의 다른 글
스프링부트에서의 API예외 처리 방법 (1) | 2022.12.02 |
---|---|
스프링과 스프링부트 무슨 차이가 있을까? (0) | 2022.11.25 |
스프링 시큐리티를 쓰는 이유는? (0) | 2022.11.09 |
스프링 컨테이너와 스프링 빈 (0) | 2022.11.03 |
스프링 mvc 동작 원리에 대하여 (0) | 2022.10.23 |