의존관계 주입과 검색

개발자·2022년 4월 17일
0

Spring

목록 보기
16/18
post-thumbnail

의존관계란?

두 개의 클래스 또는 모듈이 의존관계에 있다고 말할 때는 항상 방향성이 부여되어야 한다. 여기서 의존한다는 것(의존관계에 있다는 것)은 의존대상이 변하면 의존하는 클래스에 영향을 미친다는 뜻이다.

의존관계 주입

의존관계 주입은 구체적인 의존 오브젝트(실제 사용 대상인 오브젝트)와 그것을 사용할 주체, 보통 클라이언트라고 부르는 오브젝트를 런타임 시에 연결해주는 작업을 말한다.

의존관계 주입은 다음과 같은 조건을 만족해야 한다.

  • 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 그러기 위해서는 인터페이스에만 의존하고 있어야 한다.
  • 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제 3의 존재가 결정한다.
  • 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 주입해줌으로써 만들어진다.

런타임 시점의 의존관계를 결정하는 제 3의 존재는 두 오브젝트 사이의 의존관계 주입을 주도하며 동시에 IoC 방식으로 오브젝트의 생성과 초기화, 제공 등의 작업을 수행하는 컨테이너이다. 즉, 의존관계 주입을 담당하는 컨테이너라고 볼 수 있으며 이를 DI 컨테이너라고 부른다.

의존관계 검색

스프링이 제공하는 IoC 방법에는 의존관계 주입 뿐만 아니라 의존관계 검색이라는 것이 있다. 의존관계 검색은 코드에서는 구체적인 클래스에 의존하지 않고, 런타임 시에 의존관계를 결정한다는 점에서 의존관계 주입과 비슷하지만, 의존관계를 맺는 방법이 외부로부터의 주입이 아니라 스스로 검색을 이용한다는 점에서 다르다. 의존관계 검색은 필요한 의존 오브젝트를 능동적으로 찾는다. 런타임 시 의존관계를 맺을 오브젝트를 결정하는 것과 오브젝트의 생성은 외부 컨테이너에게 IoC로 맡기지만, 이를 가져올 때는 생성자나 메소드를 통한 주입 대신 스스로 컨테이너에게 요청하는 방법을 사용한다.

public UserDao() {
	DaoFactory daoFactory = new DaoFactory();
    this.connectionMaker = daoFactory.connectionMaker();
}

위 소스코드에서 UserDao는 자신이 어떤 ConnectionMaker 오브젝트를 사용할지 미리 알지 못한다. 여전히 ConnectionMaker 인터페이스에 의존하고 있으며 런타임 시에 DaoFactory가 돌려주는 오브젝트와 의존관계를 맺는다. 하지만 의존관계 주입과 다르게 IoC 컨테이너인 DaoFactory에게 스스로 적용 방법을 요청하고 있는 것이다. Application context는 미리 정해놓은 이름을 전달하고 그 이름에 해당하는 오브젝트를 찾게되므로 일종의 검색으로 볼 수 있다. 또한 그 대상이 런타임 의존관계를 가질 오브젝트이므로 의존관계 검색이라고 하는 것이다. 또한, 스프링의 IoC 컨테이너인 애플리케이션 컨텍스트는 getBean() 이라는 메소드를 제공하는데 이 메소드는 의존관계 검색에 사용된다. getBean() 메소드를 사용해 의존관계 검색 방식으로 오브젝트를 가져오게 만드는 것이다.

둘 사이에 중요한 차이점 중 하나는 의존관계 검색에서 검색하는 오브젝트는 자신이 스프링 빈일 필요가 없는 반면에 의존관계 주입에서는 두 클래스 모두 스프링 컨테이너가 만든 빈 오브젝트여야 한다는 것이다.

profile
log.info("공부 기록 블로9")

0개의 댓글