Spring

[스프링 #3] 의존관계 주입 (DI) - 1

zamezzz 2018. 1. 19. 00:25

 스프링 #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