Repository 로 예를 들어 보겠습니다.
InterfaceRepository 인터페이스가 save() 라는 기능을 가지고 있습니다.
public interface InterfaceRepository<T> {
    T save();
}
이를 구현한 MemoryBookRepository 클래스와 JdbcBookRepository 클래스를 생성합니다.
public class MemoryBookRepository implements InterfaceRepository<Book> {
    @Override
    public Book save() {
        return null;
    }
}
public class JdbcBookRepository implements InterfaceRepository<Book> {
    @Override
    public Book save() {
        return null;
    }
}
🥲 정적 유틸리티
BookService 라는 클래스를 생성합니다.
public class BookService {
    private static final InterfaceRepository<Book> repository = 
                                    new MemoryBookRepository();
    private BookService(){}
    public void create() {
        repository.save();
    }
}
BookService 클래스를 static utility 클래스 처럼 만들었고 MemoryBookRepository 의 정적 repository 라는 인스턴스를 가지고 있습니다.
우리가 데이터베이스랑 연결을 해서 테스트를 해보자고 할 때 클라이언트에서 인스턴스를 변경해야하는데 저 코드는 변경이 가능할까요??
이 Service 클래스를 유틸리티로 만든 것도 부적절합니다...ㅎㅎ
이렇듯 변경이 불가능하며 테스트 도 어려워지게 됩니다.
🥲 싱글톤
public class BookService {
    private static InterfaceRepository<Book> repository= new MemoryBookRepository();
    private BookService(){}
    private static final BookService SERVICE = new BookService();
    public void create() {
        repository.save();
    }
}
싱글톤으로도 구현해도 Repository 의 변경 에 유연하지 않고 테스트 도 어려워지게 됩니다.
이러한 문제점들을 우리는 의존성 주입으로 구현을 해봅시다.
😝 의존성 주입
public class BookService{
    private final InterfaceRepository<Book> repository;
    public BookService(InterfaceRepository<Book> repository) {
        this.repository = repository;
    }
    public void create() {
        repository.save();
    }
}
변경에 유연하며 테스트하기도 쉽습니다.
'Book > Effective Java' 카테고리의 다른 글
| [Book] ITEM 9) try-finally 대신 try-with-resource 를 사용하라 (0) | 2022.03.19 | 
|---|---|
| [Book] ITEM 8) finalizer 와 cleaner는 피하라 (0) | 2022.03.07 | 
| [Book] ITEM 7) 더이상 쓰지 않는 객체 레퍼런스는 없애자 (0) | 2022.03.04 | 
| [Book] ITEM 6) 불필요한 객체는 만들지 말자 (0) | 2022.03.03 | 
| [Book] ITEM 4) private 생성자로 noninstantiability를 강제할 것 (0) | 2022.03.01 | 
| [Book] ITEM 3) private 생성자 또는 enum 타입을 사용해서 싱글톤으로 만들것 (0) | 2022.03.01 | 
| [Book] ITEM 2) 생성자의 매개변수가 많다면 빌더를 고려하라 (0) | 2022.02.26 | 
| [Book] ITEM 1) 생성자 대신 정적 (static) 팩토리 메서드를 고려해 볼 것 (0) | 2022.02.26 |