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 |