'뉴렉처' 님의 채널(www.youtube.com/user/newlec1)을 바탕으로 제작한 블로그 글입니다:)
이번 시간에는 '종속성 주입'이라고 불리는 Dependency Injection, 이하 DI에 대해서 알아봅시다.
Spring에서 갖고 있는 가장 기본적인 능력 중 하나가 객체를 생성하고, 조립하는 것인데
여기서 등장하는 것이 바로 DI와 IoC 컨테이너인데요,
이번에는 그중에서 DI에 대해서 자세하게 배워보도록 하겠습니다.
아래의 코드는 A가 B를 일체형으로 갖고 있는 코드입니다. (Composition has a 관계)
class A
{
private B b;
public A() {
b = new B();
}
}
위의 코드를 보면 A()라는 함수 안에서 B class의 객체를 직접 생성하고 있는 걸 볼 수 있습니다.
즉, A가 B라는 부품의 일체형으로 자신의 부품으로 갖고 있다는 것입니다.
이때, B라는 부품을 우리는 Dependency 라고 합니다.
하지만 이렇게 직접 객체를 생성하지 않고 외부에서 객체를 생성하도록 할 수도 있습니다.
그것이 바로 아래와 같이 B라는 부품을 조립형으로 갖는 방법입니다. (Association has a 관계)
class A
{
private B b;
public A() {
...
}
public void setB(B b){
this.b = b;
}
}
첫 번째 코드와의 차이점이 눈에 띄시나요?
A()에서 직접 B의 객체를 생성하지 않고 setB라는 함수를 따로 두어 이 곳에서 객체를 생성하고 있습니다.
이렇게 조립형으로 사용하게 되면, 결합력이 더 낮아진다는 장점이 있고 쉽게 부품을 교체할 수 있다는 장점을 갖게 됩니다.
업데이트나 수정이 더 쉬워지기 때문에 조립형 방식을 개발에 있어서 더 선호한다고 합니다.
그러면 위의 두 방식에 있어서 프로그램을 만들 때에 어떻게 다를지 확인해봅시다.
만약 A라는 객체가 B라는 종속성을 사용한다고 가정하면,
첫 번째 방식에서는 ...
A a = new A();
두번째 방식에서는 ...
B b = new B();
A a = new A();
a.setB(b);
만약 첫번째 방식을 사용하게 된다면, 코드만 보았을 때 A가 어떤 부품을 사용하고 있는지 알아보기 힘듭니다.
그러나 두번째 방식을 사용하게 되면 우리가 B라는 부품을 다른 부품으로 대체하기가 쉬워집니다.
또, 어떤 부품을 사용했는지도 한 번에 알아볼 수 있습니다.
이렇게 두번째 코드처럼 부품의 객체(Dependency)를 A에 꽂아주는 작업을 Dependency Injection이라고 합니다.
Injection의 방법은 크게 두 가지로 나뉩니다!
아래 코드와 같이 setB를 이용하여 부품을 조립해주는 Setter Injection 방식과 ...
B b = new B();
A a = new A();
a.setB(b);
아래 코드와 같이 생성자를 통해 객체를 넘겨주는 Construction Injection 방식입니다.
B b = new b();
A a = new A(b);
이러한 Injection 방식은 부품을 변경하기 쉬워 업데이트와 수정이 편하다는 장점이 있지만, 이 부품을 일일이 꽂아줘야 한다는 불편함이 있습니다.
하지만 이러한 부품들을 조립해주는 서비스가 있다면 정말 편하겠죠!
이때 조립, 즉 Dependency Injection을 알아서 서비스해주는 것이 바로 Spring의 역할입니다.
어떤 부품을 결합하고 조립하기를 원하는지 설정만 해주면 Spring이 알아서 서비스해주는 것이죠.
'Spring > Dependency Injection' 카테고리의 다른 글
[Spring Framework] Spring Bean Configuration (DI 지시서) 작성법 (1) (0) | 2021.01.02 |
---|---|
[Spring Framework] 이클립스에서 Spring 사용하기 (0) | 2020.12.26 |
[Spring Framework] 직접 Dependency Injection 해보기 (0) | 2020.12.26 |
[Spring Framework] IoC 컨테이너 (0) | 2020.12.26 |
[Spring Framework] 느슨한 결합력과 인터페이스 (0) | 2020.12.19 |