본문 바로가기
Spring/용어정리

의존관계 검색 (DL Dependency Lookup)

by 신지형 2022. 2. 18.

스프링이 제공하는 또 다른 IoC 방법

 

런타임 시에 의존관계를 결정한다는 점에서 의존관계 주입과 비슷하지만,

의존관계를 맺는 방법이 외부로부터의 주입이 아니라 스스로 검색을 이용하기 때문에,

의존관계 검색 (Dependency Lookup) 이라고 불리는 것도 있다.

 

의존관계 검색은 자신이 필요로 하는 의존 오브젝트를 능동적으로 찾는다.

물론 자신이 어떤 클래스 오브젝트를 이용할지 결정하지는 않는다.

 

의존관계 검색은

  • 런타임 시 의존관계를 맺을 오브젝트를 결정
  • 오브젝트의 생성 작업은 외부 컨테이너에게 IoC로 맡기지만, 이를 가져올 때는
    메소드나 생성자를 통한 주입 대신 스스로 컨테이너에게 요청하는 방법을 사용한다.
public class SampleService {

  private TodoService TodoService;
  private TodoTask todoTask;
  
  public SampleService() {
    this.TodoService = applicationContext.getBean(TodoService.class);
    this.TodoTask = applicationContext.getBean(TodoTask.class);
  }

}

의존관계 주입쪽이 훨씬 단순하고 깔끔하다.

의존관계 검색 방법은 코드 안에 오브젝트 팩토리 클래스나, 스프링 API가 나타난다.

애플리케이션 컴포넌트가 컨테이너와 같이 성격이 다른 오브젝트에 의존하게 되는 것이므로

그다지 바람직하지 않다.

 

스프링은 IoC와 DI 컨테이너를 적용했다고 하더라도 애플리케이션의 기동 시점에서 적어도 한 번은 

의존관계 검색 방식을 사용해 오브젝트를 가져와야 한다.

정적 메소드인 main() 에서는 DI를 이용해 오브젝트를 주입받을 방법이 없기 때문이다.

 

 

[ DI 받는다 ]

  • 외부로부터의 주입
  • 단지 외부에서 파라미터로 오브젝트를 넘겨줬다고 해서( 즉 주입), DI가 아니다.
  • 주입받는 메소드 파라미터가 이미 특정 클래스 타입으로 고정되어 있다면 DI가 일어날 수 없다.
  • DI에서 말하는 주입은 동적으로 구현 클래스를 결정해서 제공받을 수 있도록
    인터페이스 타입의 파라미터를 통해 이뤄져야 한다.

 

[ 메소드를 이용한 의존관계 주입 ]

  1. 수정자 메소드
    수정자 메소드는 접두사가 "set"으로 시작하는 메소드를 의미
    한 번에 한 개의 파라미터만 가질 수 있다.
    @Bean
    public ConnectionFactory connectionFactory(FactoryProperties pros) {
        return new SampleConnectionFactory(props).build();
    }
  2. 생성자 메소드
    한 번에 여러 개의 파라미터를 받을 수 있다.
    파라미터의 개수가 많아지고 비슷한 타입이 여러개면 실수하기 쉽다.
    public class SampleService {
    
      private SampleTask sampleTask;
      private TodoTask todoTask;
      
      public SampleService(SampleTask sampleTask, TodoTask todoTask) {
          this.sampleTask = sampleTask;
          this.todoTask = todoTask;
      }
    
    }

댓글