■ 스프링 #3. 의존관계 주입 (DI) - 1
● 의존관계 주입(DI) ?
의존관계 주입(DI)은 오브젝트 레퍼런스를 외부로부터 주입받고, 이를 통해 다른 오브젝트와 동적으로 의존관계가 맺어집니다.
오브젝트는 다른 오브젝트에 직접 주입할 수 있는게 아니라, 레퍼런스가 전달될뿐입니다.
즉, 오브젝트 외부에서 의존하는 오브젝트를 주입시키는 것이 DI입니다.
● 의존관계
먼저, 의존관계란 개념부터 좀 더 자세히 정리하겠습니다.
의존관계는 항상 방향성이 있습니다.
예를 들어, A가 B에 의존하고 있을 때는 A->B라고 표시할 수 있습니다.
의존한다는 것은 그 대상에 영향을 받는다고 이해하면 될 것 같습니다. 즉 위의 예시에서
본다면 B가 변화할 때 A에 영향을 미친다고 보면 되겠네요.
또한, 인터페이스를 통해 의존관계를 갖을 때 '느슨한 의존관계'를 가진다고 합니다.
이 관계에서는 A가 실제 어떠한 클래스에 의존하는지는 알 수 없습니다. 인터페이스를 통해 의존관계를 제한하였기에 그만큼 영향을 덜 받고, 의존관계에서 자유롭습니다.
이러한 관계 말고 '오브젝트 의존관계'라는 말도 있습니다.
이는 프로그램이 시작되고 실제 런타임 시에 의존관계를 맺는 관계입니다.
그리고 이 런타임 시에 의존관계를 맺는대상, 즉 실제 사용대상인 오브젝트를 '의존 오브젝트'라 합니다.
즉 의존관계 주입은 구체적인 의존 오브젝트와 그것을 사용할 주체를 런타임 시에 연결해주는 작업이라고 할 수 있겠습니다.
● 메소드를 이용한 의존관계 주입
위의 내용은 인터페이스에 의한 의존관계에 대해서 정리한 내용입니다.
이번에는 실제 메소드를 사용하여 의존관계를 주입해주는 방법에 대해 정리하겠습니다.
여기서는 수정자(setter) 메소드를 이용한 주입 방법을 알아보겠습니다.
- 수정자 메소드를 이용한 주입의 특징
항상 set으로 시작하는 메소드. 파라미터로 전달된 값을 내부 인스턴스 변수에 저장
입력 값에 대한 검증이나 그 밖의 작업을 수행할 수 있다.
수정자 메소드를 이용한 DI를 코드와 함께 살펴보겠습니다.
먼저 DAO입니다.
setConnectionMaker라는 메소드를 추가하여 ConnectionMaker타입의 오브젝트를 받도록
코드를 구현하였습니다.
public class MyDao { private ConnectionMaker; public void setConnectionMaker(ConnectionMaker connectionMaker) { this.connectionMaker = connectionMaker; } } |
그리고 이를 실제 적용하는 DaoFactory입니다.
@Bean public MyDao myDao() { MyDao myDao = new MyDao(); myDao.setConnectionMaker(connectionMaker()); return myDao; } |
기존 코드에서는 이미 설계 시점에서 어떤 ConnectionMaker를 사용할지 알고 있었죠.
하지만 DI에서는 ConnectionMaker 인터페이스와 느슨한 관계를 맺고 있습니다.
여기서는 setConnectionMaker()라는 메소드를 통해 실제 의존관계를 맺고있습니다.
@Bean으로 설정되어 있는 myDao()가 MyDao와 ConnectionMaker 오브젝트 사이의 의존관계를 설정해주는 제3의 존재, 즉 DI컨테이너라고 볼 수 있습니다.
이처럼 주입이라는 것은 외부에서 내부로 무엇인가를 넘겨줘야합니다.
자바(스프링)에서는 이를 오브젝트의 레퍼런스로 전달하고 있으며, 이 예제에서는 메소드를 실행하면서 파라미터로 오브젝트의 레퍼런스를 전달해줍니다.
의존관계 주입(DI) 개념과 메소드를 활용하여 DI하는 방법을 정리해보았습니다.
다음 포스팅에서는 어노테이션을 이용한 DI 방법에 대해 정리하겠습니다. 감사합니다.
'Spring' 카테고리의 다른 글
[스프링 #6] Custom Annotation (0) | 2018.05.30 |
---|---|
[스프링 #5] DispatcherServlet (0) | 2018.05.05 |
[스프링 #4] 의존관계 주입 (DI) - 2 (0) | 2018.02.24 |
[스프링 #2] 제어의 역전(IoC) (0) | 2017.12.30 |
[스프링 #1] 스프링 개념 및 DAO (0) | 2017.12.27 |