본문 바로가기

Spring/Dependency Injection

[Spring Framework] DI(Dependency Injection)

728x90
반응형

'뉴렉처' 님의 채널(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이 알아서 서비스해주는 것이죠.

 

 

728x90
반응형