의존성 주입이란?

종속성이란 무엇입니까? (의존)

  • 한 객체가 수행할 작업을 다른 객체에 위임하는 순간 발생하는 두 객체 간의 관계입니다.

의존성 주입

  • 외부에서 객체 간의 종속성을 강제하여 생성 및 사용에 대한 책임을 분리합니다.

    • 인스턴스 생성 책임: 외부
    • 인스턴스 사용 담당: 주입할 객체

기존 방식

  • 객체가 사용할 객체의 인스턴스를 직접 생성하여 사용하는 방법

예제 코드

public class AmOrPmCheckerTest {

    public boolean isAm() {
        final Calendar currentDate = Calendar.getInstance();
        final int hour = currentDate.get(Calendar.HOUR_OF_DAY);
        if (hour < 12) {
            return true;
        }
        return false;
    }
}

테스트 코드

class AmOrPmCheckerTest {

    @Test
    void isAmTrue() {
        final AmOrPmChecker amOrPmChecker = new AmOrPmChecker();
        Assertions.assertThat(amOrPmChecker.isAm()).isTrue();
    }

    @Test
    void isAmFalse() {
        final AmOrPmChecker amOrPmChecker = new AmOrPmChecker();
        Assertions.assertThat(amOrPmChecker.isAm()).isFalse();
    }
}

문제

  • 현재 시간에 따른 Calendar 개체는 컴파일 타임에 결정됩니다.

    (두 물체 사이의 강한 결합)
  • 참 테스트와 거짓 테스트는 동시에 불가능합니다.

DI를 통한 해상도

  • Calendar 개체를 메서드 매개 변수로 전달합니다.

  • 외부에서 종속성을 주입하기 때문에 테스트가 가능합니다.

예제 코드

public class AmOrPmChecker {

    public boolean isAm(final Calendar currentDate) {
        final int hour = currentDate.get(Calendar.HOUR_OF_DAY);
        if (hour < 12) {
            return true;
        }
        return false;
    }
}

테스트 코드

class AmOrPmCheckerTest {

    @Test
    void isAmTrue() {
        //given
        final AmOrPmChecker amOrPmChecker = new AmOrPmChecker();
        final Calendar current = Calendar.getInstance();
        current.set(Calendar.HOUR_OF_DAY, 10);
        //when
        //then
        Assertions.assertThat(amOrPmChecker.isAm(current)).isTrue();
    }

    @Test
    void isAmFalse() {
        //given
        final AmOrPmChecker amOrPmChecker = new AmOrPmChecker();
        final Calendar current = Calendar.getInstance();
        current.set(Calendar.HOUR_OF_DAY, 13);
        //when
        //then
        Assertions.assertThat(amOrPmChecker.isAm(current)).isFalse();
    }
}