본문 바로가기
BackEnd/Spring

[Spring] Dependency Injection(DI)

by summer_light 2021. 8. 26.

Dependency Injection (DI) 종속성 주입

종속성 주입이라는 표현이 어려워 유튜브 강의를 찾아보다가 뉴렉쳐 채널에서 강의를 보게 되었다.

'~의 dependency(종속성) OO' 같이 표현하지만, 이 Dependency 라는 용어는 '부품'이라는 용어로 대체해 읽어보면 좀 더 직관적으로 이해할 수 있다.

 

 

 

1. Composition has a 관계 (일체형)

A의 생성자 안에서 B 객체를 직접 생성하여 B를 갖는 방법

Class A
{
	private B b;
    
    public A() {
    	b = new B();   //B는 A의 부품. B를 dependency 라고 함(의존성)
    }
}
A a = new A();

 

 

 

2. Association has a 관계 (조립형)

생성자 안에서 B 객체를 직접 생성하지 않고, 외부에서 생성한 B를 받아 가져오는 방법

결합력 낮아져 부품을 쉽게 갈아낄 수 있다.  (느슨한 결합력)

그러므로 자주 업데이트해야하는 기업 입장에서는 선호하는 방법이다. 

class A
{
	private  B b;
    
    public A() {
    	//b = new B(); 직접생성 X
    }
    
    //외부에서 B 생성 받아 가짐
    public void setB(B b) {
    	this.b = b;
    }
}

 

2.1 조립형의 두 가지 DI 방법

1) Setter Injection

세터 함수를 통해 주입받는 방법

B b = new B();
A a = new A();

a.setB(b);

 

2) Construction Injection

생성자를 통해 주입받는 방법

B b = new B();
A a = new A(b);

 

 

EX01. Dependency Injection 사용해보기

1) Setter Injection

public class Program {

	public staic void main(String[] args) {
    
    	Exam exam = new NewlecExam();
        ExamConsole console = new GridExamConsole();
        console.setExam(exam);
        console.print();
    
    }

}

2) Construction Injection

public class Program {

	public staic void main(String[] args) {
    
    	Exam exam = new NewlecExam();
        //두 개의 DI 
        //ExamConsole console = new InlineExamConsole(exam); //1번: Inline 이용
        ExamConsole console = new GridExamConsole(exam); //2번: Grid 이용 
        console.print();
    
    }

}

위 상태대로라면, 코드를 바꿔야만 Inline으로 출력할지, Grid로 출력할지를 결정할 수 있다.

 

Spring을 사용하면 코드를 수정하지 않고도 필요에 따라 1번의 Inline 혹은 2번의 Grid를 사용할 수 있다.

이 때문에 Spring이 DI를 쉽게 할 수 있도록 도와준다는 것이다. 

 

 

 

 

댓글