-
Notifications
You must be signed in to change notification settings - Fork 0
6. DI와 서비스 로케이터
HyoSang edited this page Jun 3, 2019
·
1 revision
- 고수준 정책 및 저수준 구현을 포함하는 영역
- 어플리케이션이 동작하도록 각 객체들을 연결해 주는 영역
- 어플리케이션 영역에서 사용될 객체를 생성한다.
- 각 객체 간의 의존 관계를 설정한다.
- 어플리케이션을 실행한다.
- 어플리케이션 영역의 객체를 생성하고 설정하고 실행하는 책임을 가진다.
- 생성자 혹은 설정 메소드를 이용해서 사용할 객체를 주입한다.
- DI를 통해서 의존 객체를 관리할 때에는 객체를 생성하고 각 객체들을 의존 관계에 따라 연결해 주는 조립 기능이 필요하다.
- 조립 기능을 따로 분리해서 별도로 관리하는 방법으로 발전시킬 수 있다.
- 생성자를 통해서 의존 객체를 전달 받는 방식
- 객체를 생성하는 시점에 필요한 모든 의존 객체를 준비할 수 있다.
- 객체를 생성하는 시점에서 의존 객체가 정상인지 확인할 수 있다.
- 의존 객체를 먼저 생성할 수 없다면 생성자 방식을 사용할 수 없다.
- 스프링 XML에서는 태그를 이용하는 방식
- setter를 통해서 의존 객체를 전달 받는 방식
- 객체를 생성한 이후에 의존 객체를 설정할 수 있으므로 의존 객체가 나중에 생성된다면 설정 메서드 방식을 사용할 수 있다.
- 스프링 XML에서는 태그를 이용하는 방식
- 프레임워크의 제약으로 인해 DI 패턴을 적용할 수 없는 경우에 사용한다.
- 어플리케이션에서 필요로 하는 객체를 제공하는 책임을 갖는다
- 의존 대상이 되는 객체 별로 제공 메서드를 정의한다.
- 서비스 로케이터를 사용하는 경우에 메인 영역에서 서비스 로케이터가 제공할 객체를 초기화 해준다.
- 서비스 로케이터는 어플리케이션 영역의 객체에서 직접 접근하므로 어플리케이션 영역에 위치한다.
- 서비스 로케이터를 생성할 때 사용할 객체를 전달한다.
- 서비스 로케이터 인스턴스를 지정하고 참조하기 위한 static 메서드를 제공한다.
- 구현은 간편하지만 서비스 로케이터에 객체를 등록하는 인터페이스가 노출되어있으므로 어플리케이션 영역에서 얼마든지 의존객체를 바꿀 수 있는 문제가 있다.
- 객체를 구하는 추상 메서드를 제공하는 상위 타입 구현
- 상위 타입을 상속받은 하위 타입에서 사용할 객체 설정
- 생성자에 인스턴스를 세팅하는 코드가 들어있어 객체만 생성하면 인스턴스가 지정이 된다.
- 위의 두 구현 방법은 하나의 서비스 로케이터에 다양한 인터페이스가 섞여 인터페이스 분리 원칙을 위반한다.
- 서비스 로케이터를 분리하면 코드 중복 문제가 발생한다.
- 제너릭을 이용해서 클래스와 그 클래스에서 사용할 객체를 로케이터에 등록하는 방식으로 구현하면 이러한 문제를 해결할 수 있다.
- 동일 타입의 객체가 다수 필요할 경우 각 객체 별로 제공 메서드를 만들어 주어야 한다.
- DI는 각 객체가 사용할 내부 객체를 각각 주입 시키므로 이러한 문제가 발생하지 않느낟.
- 서비스 로케이터는 또한 인터페이스 분리 원칙을 위배한다.
HTTP 완벽 가이드
Learning HTTP/2
개발자가 반드시 정복해야할 객체지향과 디자인 패턴