1. 오브젝트와 의존관계 - 의존관계 주입 (DI)

이유석·2022년 3월 29일
0

Book - Toby's Spring

목록 보기
7/20
post-thumbnail

1.7 의존관계 주입 (DI)

1.7.1 제어의 역전(IoC)과 의존관계 주입

IoC는 객체지향적인 설계나, 디자인 패턴, 컨테이너에서 동작하는 서버 기술을 사용하는 소프트웨어에서 자주 사용된다.

IoC라는 용어는 매우 느슨하게 정의돼서 폭넓게 사용되어지고 있는 용어이다.
때문에 스프링을 IoC 컨테이너라고만 해서는 스프링이 제공하는 기능의 특징을 명확하게 설명하지 못한다.

  • 스프링 ?= 서버에서 동작하는 서비스 컨테이너
  • 스프링 ?= IoC개념이 적용된 템플릿 메소드 패턴을 이용해 만들어진 프레임워크
  • 스프링 ?= 또다른 IoC특징을 지닌 기술

Dependecy Injection (의존관계 주입)

  • 스프링이 제공하는 IoC 방식의 핵심을 짚어주기 위해 사용하는 용어

1.7.2 런타임 의존관계 설정

의존관계

  • 의존관계를 말할때는 항상 방향성을 부여해줘야 한다.
  • A는 B에 의존한다. : B의 기능이 추가되거나 변경될면 그 영향이 A로 전달된다.
    (B는 A에 의존하지 않는다.)

UserDao의 의존관계

  • UserDao가 ConnectionMaker 인터페이스에만 의존하고 있는 형태다.
  • 이렇게 인터페이스에 대해서만 의존관계를 만들어두면, 인터페이스 구현 클래스와의 관계는 느슨해지면서 변화에 영향을 덜 받는 상태가 된다.
  • 결합도가 낮다고 설명할 수 있다.
  • 인터페이스를 통해 의존관계를 제한해주면 그만큼 변경에서 자유로워진다.
  • UML에서 말하는 의존관계란 이렇게 설계 모델의 관점에서 이야기하는 것이다.
  • 런타임 시에 오브젝트 사이에서 만들어지는 의존관계도 있다.

    런타임 의존관계 또는 오브젝트 의존관계 : 설계시점의 의존관계가 실체화된 것

의존 오브젝트 : 런타임 시에 의존관계를 맺는 대상, 즉 실제 사용대상인 오브젝트
의존관계 주입 : 구체적인 의존 오브젝트와 그것을 사용할 클라이언트를 런타임 시에 연결해 주는 작업

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

의존관계 주입의 핵심은 설계 시점에는 알지 못했던 두 오브젝트의 관곌르 맺도록 도와주는 제3의 존재가 있다는 것이다.
제3의 존재는 관계 설정의 책임을 갖는다.

  • 애플리케이션 컨텍스트
  • 빈 팩토리
  • IoC 컨테이너

자바에서의 주입의 개념을 가장 쉽게 사용할 수 있는 것이 파라미터 전달이 가능한 메소드인 생성자이다.

  • DI 컨테이너는 자신이 결정한 의존관계를 맺어줄 클래스의 오브젝트를 만들고 이 생성자의 파라미터로 오브젝트의 레퍼런스를 전달해준다.
public class UserDao {
	private ConnectionMaker connectionMaker;
    
    public UserDao(ConnectionMaker connectionMaker) {
    	this.connectionMaker = connectionMaker;
    }
}
...

DI는 자신이 사용할 오브젝트에 대한 선택과 생성 제어권을 외부로 넘기고 자신은 수동적으로 주입받은 오브젝트를 사용한다는 점에서 IoC의 개념에 잘 들어맞는다.

1.7.3 Dependency Lookup (의존관계 검색)과 주입

정의

  • 의존관계를 맺는 방법이 외부로부터의 주입이 아닌 스스로 검색을 이용하여 주입한다.
  • 코드에서는 구체적인 클래스에 의존하지 않고, 런타임 시에 의존관계를 결정한다는 점에서 의존관계 주입과 비슷하다.

특징

  • 자신이 필요한 의존 오브젝트를 능동적으로 찾는다.
  • 자신이 어떤 클래스의 오브젝트를 이용할지 결정하지는 않는다.
  • 애플리케이션 컨텍스트가 제공하는 getBean( ) 메소드가 의존관계 검색에 사용된다.
public UserDao() {
	AnnotationConfigApplicationContext context = 
    	new AnnotationConfigApplicationContext(DaoFactory.class);
    
    this.connectionMaker = context.getBean("connectionMaker", ConnectionMaker.class);

의존관계 주입 VS 의존관계 검색

  • 의존관계 주입의 코드가 더 단순하고 깔끔하여 사용하기에 더 좋다.
  • 애플리케이션의 기동 시점에서 적어도 한 번은 의존관계 검색 방식을 사용해 오브젝트를 가져와야 한.
    (다행히 이런 서블릿은 스프링이 미리 만들어서 제공하기 때문에 직접 구현할 필요는 없다.)
  • 의존관계 검색 방식에서는 검색하는 오브젝트는 자신이 스프링의 빈일 필요가 없다.
  • 의존관계 주입을 원하는 오브젝트는 먼저 자기 자신이 컨테이너가 관리하는 빈이 돼어야 한다.

1.7.4 부터의 내용은 넘어가도록 하겠다.

profile
https://github.com/yuseogi0218

0개의 댓글