본문 바로가기
Spring

[Spring] DI(Dependency Injection)란?

by 노력남자 2019. 11. 5.
반응형

DI(Dependency Injection)란?

 

DI는 디자인 패턴 중 하나이며 객체 간의 의존성을 자신이 아닌 외부에서 받아 느슨한 결합을 하여 유연성, 재사용성, 테스트 용이성을 개선시킨다.

 

DI를 왜 써야하는지 아래 코드를 보며 설명하겠습니다.

 

public class SpellChecker {	
   	Dictionary dictionary = new KoreanDictionary();    
}

 

맞춤법 검사기 만드는 프로젝트를 한다고 가정하겠습니다. 맞춤법 검사기는 사전(Dictionary)에 의존하는데 위 클래스는 사전 종류가 KoreanDictionary 로 정해져 있습니다. 이런걸 SpellChecker는 KoreanDictionary에 의존한다고 표현합니다. 그리고 직접 객체를 정해놨기 때문에 강한결합을 갖는다고 할 수 있습니다.

 

만약 한국어가 아닌 영어, 독일어를 맞춤법 검사해야 된다면 어떻게 해야할까요? 직접 SpellChecker 클래스 소스코드를 수정해서 다시 배포를 해야합니다.

 

이런 불편한 문제점을 해결해 주는게 바로 DI입니다.

 

DI 방식은 2가지가 있습니다. (스프링에선 추가로 필드 주입(Field Injection)을 지원합니다.)

 

1. 생성자 주입 (Constructor Injection)

 

public class SpellChecker {
	private Dictionary dictionary;
    
	public SpellChecker(Dictionary dictionary) {
		this.dictionary = dictionary;
	}    
}

 

생성자를 통해 의존성 주입을 받는 방식입니다.

 

2. 세터 주입 (Setter Injection)

 

public class SpellChecker {
	private Dictionary dictionary;
	
	public void setDictionary(Dictionary dictionary) {
		this.dictionary = dictionary;
	}    
}

 

Setter를 이용해 의존성 주입을 받는 방식입니다.

 

SpellChecker 객체를 생성하는 곳에서 spellChecker.setDictionary(dictionary)로 사용합니다.

 

 

DI 장점

 

1. 유연하고 느슨한 결합으로 종속성이 감소하여 변경에 민감하지 않다.

 

2. 테스트가 용이하다.

 

 

마치며

 

DI에 대해 이해가 가셨나요? 그렇다면 다음 포스팅에선 스프링에선 DI를 어떻게 지원하는지 알아보겠습니다.

 

 

참고

 

1. Joshua Bloch, Effective Java 3/E, 인사이트, 2018

반응형

댓글