📖책의 내용을 요약하니 자세한 부가설명이 궁금하시면 보시는걸 추천드립니다. 📖
로버트 C 마틴(Robert C. Martin)은 소프트웨어를 두 개의 영역으로 구분해서 설명한다.
- 고수준 정책 및 저수준 구현을 포함한 애플리케이션 영역
- 어플리케이션이 동작하도록 각 객체들을 연결해 주는 메인 영역
1. 어플리케이션 영역과 메인 영역
SOLID 설계 원칙으로 프로그램을 개발하다보면 클라이언트는 고수준 모듈을 의존하지만 실제로 사용할 때 콘크리트 클래스의 객체가 필요하다.
class Worker {
public void run() {
JobQueue jobQueue = ...;
Transcoder transcoder = ...;
...
}
}
실제 객체를 구할 방법으로 Locatoer라는 객체를 사용하기로 결정했다.
class Worker {
public void run() {
JobQueue jobQueue = Locator.getInstance().getJobQueue();
Transcoder transcoder = Locator.getInstance().getTranscoder();
...
}
}
여기서 의문점이 생긴다. 누가 Locator를 초기화 해주고 Worker를 생성할까?
메인(main) 영역이 등장한다. 메인 영역은 다음과 같은 일을 한다.
- 어플리케이션 영역에서 사용될 객체를 생성한다.
- 각 객체 간의 의존 관계를 설정한다.
- 어플리케이션을 실행한다.
public class Main {
public static void main(String[] args) {
// 상위 수준 모듈에서 사용될 하위 수준 모듈 객체 생성
JobQueue jobQueue = new FileJobQueue();
// 상위 수준 모듈이 하위 수준 모듈을 사용할 수 있도록 Locator 초기화
Locator locator = new Locator(jobQueue);
Locator.init(locator);
...
}
}
메인 영역의 역할을 보면 알 수 있듯이 모든 의존은 메인 영역에서 어플리케이션 영역으로 향한다. 반대의 경우 어플리케이션 영역에서 메인 영역으로이 의존은 존재하지 않는다.
따라서 어플리케이션에서 사용될 객체를 교체하기 위해 메인 영역의 코드를 수정해도 영향을 끼치진 않는다.
그리고 어플리케이션에서 사용될 객체를 제공하는 책임을 갖는 객체를 서비스 로케이터(Service Locator)라고 부른다.
단, 객체를 직접 찾는 서비스 로케이터는 몇 가지 단점이 존재하여 외부에서 사용할 객체를 주입해 주는 DI(Dependency Injection) 방식이 일반적이다.
2. DI(Dependency Injection)을 이용한 의존 객체 사용
DI는 필요한 객체를 외부에서 넣어주는 방식으로 사용할 객체를 전달받을 방법을 제공하면 DI 준비는 끝난다.
* 스프링 프레임워크가 DI 프레임워크다
2.1 생성자 방식과 설정 메서드 방식
생성자 방식은 생성자를 통해서 의존 객체를 전달 받는다.
class Worker {
private JobQueue jobQueue;
public Worker(JobQueue jobQueue) {
this.jobQueue = jobQueue;
}
...
}
생성자 방식은 객체를 생성하는 시점에 모든 의존 객체를 준비할 수 있다. 객체가 정상적으로 동작함을 보장받을 수 있다.
설정 메서드 방식은 메서드를 통해 의존 객체를 받는다.
class Worker {
private JobQueue jobQueue;
public void setJobQueue(JobQueue jobQueue) {
this.jobQueue = jobQueue;
}
...
}
설정 메서드 방식은 생성 후 의존 객체를 주입받는다. 실수할 경우 의존 객체를 주입하지 않고 사용하여 NullPointerException이 발생할 수 있다.
2.2 DI와 테스트
DI는 의존 객체를 Mock객체로 쉽게 대체할 수 있도록 함으로써 단위 테스트를 돕는다.
3. 서비스 로케이터를 이용한 의존 객체 사용
(* 단점만 진행하겠다)
3.2 서비스 로케이터의 단점
서비스 로케이터의 가장 큰 단점은 의존 객체마다 제공 메서드를 만들어야 하며 이는 콘크리트 클래스에 직접 의존하는 것과 동일한 효과를 발생시킨다.
즉, 서비스 로케이터는 변경의 유연함을 떨어뜨리는 문제를 갖게 된다.
'서적 > 객체지향과 디자인패턴' 카테고리의 다른 글
객체지향과 디자인패턴 마무리 후기 (0) | 2021.06.04 |
---|---|
챕터5, 설계 원칙 : SOLID (0) | 2021.06.03 |
챕터4, 재사용 : 상속보단 조립 (0) | 2021.06.03 |
챕터3, 다형성과 추상 타입 (0) | 2021.06.03 |
챕터2, 객체지향 (0) | 2021.06.02 |