본문 바로가기

STUDY/이펙티브자바

2-5) 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

클래스와 의존성

 

일반적으로 클래스는 기능을 수행하기위해 내부적으로 다른 클래스를 사용한다. 이렇게 한 클래스가 다른 클래스를 필요로 하는 것을 의존성이 있다고 한다. 프로그램의 규모가 커질수록 이러한 의존성은 더욱 복잡해진다. 맞춤법 검사 클래스인 SpellChecker가 있다고 하면 내부적으로 맞춤법 검사를 위한 사전 클래스인 Dictionary 클래스를 가지고 있을것이다. 이 때 SpellChecker 클래스는 Dictionary 클래스에 의존성이 있다고 한다.

 

class SpellChecker {
    private Dictionary dic;
    ...
}

 

 


의존성 주입

 

// 유연하지 않고 테스트하기 어렵다
class SpellChecker {
    private Dictionary dic = new MyDictionary();
    ...
}

// 유연하지 않고 테스트하기 어렵다
class SpellChecker {
    private Dictionary dic;
    
    public SpellChecker() {
        this.dic = new MyDictionary();
    }
    ...
}

의존성 객체가 필요할 때 클래스 내부에서 객체를 생성하여 사용하는 것은 좋은 방법이 아니다. 필요한 객체가 변경될 때 마다 해당 클래스의 코드를 수정해주어야 하기 때문에 유연성이 떨어진다. 그리고 테스트를 위해 목업 객체를 사용하기도 어려워진다. 따라서 클래스의 객체 생성 시점에 외부에서 의존성 객체를 전달받는 것이 옳다.

 

// 유연하고 테스트하기 좋다
class SpellChecker {
    private Dictionary dic;
    
    public SpellChecker(Dictionary dic) {
        this.dic = dic;
    }
    ...
}

생성자를 통해 외부에서 의존성 객체를 전달 받으면 필요한 Dictionary 구현 객체가 변경되어도 SpellChecker의 코드 수정이 없다. 또 테스트할때는 목업용 Dictionary 객체를 전달받으면 되기 때문에 간편하다.

728x90