kkkkkkkkkkkk
kkkkk
kkkkkkkkkkkk
전체 방문자
오늘
어제
  • 분류 전체보기
    • CS & OS
    • Algorithms
    • Laguage
    • Book
      • 객체지향의 사실과 오해
      • Effective Java
      • Spring boot 와 AWS로 혼자 구현하는 ..
      • 도메인 주도 계발 시작하기
    • DB
    • Spring
    • Spring Boot
    • JPA
    • Git
    • Clean Code
    • HTTP

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 책임
  • 설계 원칙
  • 객체지향 프로그래밍
  • 역할
  • 응집도
  • 결합도

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
kkkkkkkkkkkk

kkkkk

Book/Effective Java

[Book] ITEM 5) 리소스를 엮을 때는 의존성 주입을 선호하라

2022. 3. 3. 11:43

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
    'Book/Effective Java' 카테고리의 다른 글
    • [Book] ITEM 7) 더이상 쓰지 않는 객체 레퍼런스는 없애자
    • [Book] ITEM 6) 불필요한 객체는 만들지 말자
    • [Book] ITEM 4) private 생성자로 noninstantiability를 강제할 것
    • [Book] ITEM 3) private 생성자 또는 enum 타입을 사용해서 싱글톤으로 만들것
    kkkkkkkkkkkk
    kkkkkkkkkkkk

    티스토리툴바