의존성주입(Dependency Injection, DI)란?
객체를 직접 생성하는 것이 아닌 외부에서 객체를 주입시켜 사용하는 방식이며
IoC(Inversion Of Controll)라고 하는 소프트웨어 디자인 패턴 중 하나다.
이대의 IOC는 인스턴스를제어하는 주도권이 역전된다는 의미로 사용되는데, 컴포넌트를 구성하는 인스턴스의 생성과
의존 관계의 연결 처리를 해당 소스코드가 아닌 DI Container에서 대신 해주기 때문에 제어가 역전되었다고 본다.
Spring의 공식문서에서는 Spring Framework를 DI Container가 아니라 IOC Container 라고 기재하고 있다.
개발을 하다보면 코드에 의존성이 생기기 마련이다.
class Programmer {
private Coffee coffee;
public Programmer() {
this.coffee = coffee();
}
public startProgramming() {
this.coffee.drink();
....
}
}
이와 같이 Programmer 클래스에서 startProgramming 함수가 호출되기 위해서는 Coffee클래스를 필요로 한다.
이것을 programmer 클래스는 Coffee 클래스의 의존성을 갖는다 라고 한다.
이와 같이 코드를 설계하였을 때는 코드의 재활용성이 떨어지고, Coffee클래스가 수정되었을 때 Programmer 클래스도
함께 수정해줘야 하는 문제가 발생한다.
즉, 결합도(coupling)가 높아지게 된다.
DI로 프로그램을 설계했을때 다음과 같은 이점을 얻을 수 있다.
● Unit Test가 용이해진다.
● 코드의 재활용성을 높여준다.
● 객체간의 의존성(종속성)을 줄이거나 없앨 수 있다.
● 객체간의 결합도를 낮추면서 유연한 코드를 작성할 수 있다.
Spring 외에도 DI컨테이너를 제공하는 프레임워크는 많이 있다. 잘 알려진 것은 다음과 같고
기본적인 기능은 대체로 비슷하다.
● CDI(Contexts & Dependency Injection)
● Google Guide
● Dagger
만약 DI를 사용하지 않고 Coffee클래스를 상속받는 Americano 클래스를 사용한다고 하면 직접 수정해줘야 하는
문제가 발생한다.
class Coffee {
...
}
class Americano extends Coffee {
...
}
class Programmer {
private Coffee coffee;
public Programmer() {
this.coffee = new Americano();
}
}
이렇게 커피는 아메리카노가 되도록 모든 클래스를 수정해줘야 한다.
만약 이렇게 하나의 클래스가 아니라 100개 혹은 그 이상이라면? 다 찾기도 힘들뿐더러 놓치는 부분도 생기게 된다.
이렇게 되면 너무 비효율적이다.
class Programmer {
private Coffee coffee;
public Programmer(Coffee coffee) {
this.coffee = coffee;
}
public startProgramming() {
this.coffee.drink();
}
}
그래서 의존성 주입으로 위와같이 작성할 수 있다.
이렇게 필요한(의존하는) 클래스를 직접 생성하는 것이 아닌 주입해줌으로써 객체간의 결합도를 줄이고 좀 더
유연한 코드를 작성할 수 있게 된다.
어떤 클래스가 필요로하는 컴포넌트를 외부에서 생성한 후 내부에서 사용가능하게 만들어 주는 과정을
의존성 주입(DI)한다 또는 인젝션(Injection)한다고 말한다.
그리고 이러한 의존성 주입을 자동으로 처리하는 기반을 DI Container라고 한다.
레퍼런스
● velog.io/@wlsdud2194/what-is-di
● dayzen1258.tistory.com/entry/%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85%EC%9D%B4%EB%9E%80-DI
● 스프링 철저 입문
'Spring' 카테고리의 다른 글
IOC(Inversion Of Control) (0) | 2021.02.21 |
---|---|
AOP(Aspect Oriented Programming) (0) | 2021.02.20 |
Spring MVC (Front Controller Pattern) (0) | 2021.02.17 |
Spring MVC (0) | 2021.02.16 |
Spring과 SpringBoot 의 차이 (0) | 2021.02.15 |