Published 2021. 9. 26. 22:14
반응형

✔️ IoC와 DI 무엇일까?

🔍 IoC(Inversion of Control)

  • 제어의 역전
    코드를 사용하는 클라이언트가 직접 제어를 하지 않고 오직 인터페이스에만 의존하여
    사용하는 방식을 의미 합니다.
    구현체가 변경이 되어도, 클라이언트 코드는 변경하지 않아도 되며,
    구현체를 변경할 때 제어를 담당하는 객체에서 구현체만 갈아 끼워주면 되기 때문에
    유지보수에 아주 용이합니다.

아래 코드는 Repository 인터페이스를 사용하는 코드입니다.
하지만 클라이언트(service)는 Repository가 어떤 구현체인지 전혀 알지 못하며,
구현체가 변경 되더라도 전혀 지장이 없습니다.
즉, 제어권이 없는 것이죠.

public class Service {

    private final AppConfig appConfig = new AppConfig();
    private final Repository repository = appConfig.repository();

    public void run() {
        repository.save();
    }
}

Repository에 대해 설명하겠습니다.
클라이언트에서 인터페이스에 의존하게 하기 위해 인터페이스, 구현체 구조를
가진 것 뿐입니다.

public interface Repository {

    void save();
}
public class RepositoryOne implements Repository {

    @Override
    public void save() {
        System.out.println("RepositoryOne.save");
    }
}
public class RepositoryTwo implements Repository {

    @Override
    public void save() {
        System.out.println("RepositoryTwo.save");
    }
}

중요한건 AppConfig입니다.
IoC를 담당하는 객체입니다.
여기서 제어를 담당하기 때문에 클라이언트는 변경없이 구현을 변경할 수 있습니다.
IoC는 이런 간단한 개념에서 시작됩니다.
물론 스프링은 내부적으로 더욱 복잡하겠지만, IoC는 스프링의 기술이 아닌
단지 구조일 뿐 입니다. 즉, 스프링이 아니어도 이렇게 순수 자바로도 구현이 가능 합니다.
아마 이제 프로그래밍을 시작하시는 분들은 IoC DI는 스프링만 되는거 아니야? 라고
생각하시는 분들이 많을 겁니다. 저도 그랬거든요 ㅎ.ㅎ

public class AppConfig {

    public Repository repository() {
//        return new RepositoryOne();
        return new RepositoryTwo();
    }
}

🔍 DI(Dpendency Incjection)

  • 의존성 주입
    IoC에서 Service와 Repository는 의존관계였죠?
    Service가 Repository에 의존하구요. 여기서 Repository의 구현체를
    주입해주는 AppConfig가 하는 일을 DI라고 합니다.
    그저 의존 관계인 Repository의 구현체를 주입 해주는 것만을 의미 합니다.
    즉, 런타임에 외부에서 구현객체를 생성하고 클라이언테에게 전달해서 의존관계를
    주입하는 것을 의미합니다.
  • 그렇다면 런타임에 주입된다는 것은 무슨 의미일까요?
    스프링으로 예를 들어보겠습니다.
    의존관계 주입은 스프링이 로드될 때 발생합니다.
    컴파일 시점에는 의존관계가 어떻게 맺어질지에 대해 정의하고,
    런타임 시점에 실제 의존관계가 주입이 되는 것입니다.
    컴파일 시점에는 스프링이 로드되지 않고, 런타임 시점에 로드되고,
    이때 주입을 하게 되는 것입니다.

장점

  • 클라이언트 코드 변경없이 구현체를 변경할 수 있다.
  • 위를 조금 더 상세하게 설명하자면,
    정적 클래스 의존관계 변경없이(클라이언트 코드) 동적인 객체 인스턴스의
    의존관계를 쉽게 변경할 수 있다.

🔍 IoC 컨테이너, DI컨테이너

  • 둘 모두 동일한 의미로 사용 됩니다. 크게 고민할 필요가 없는 내용입니다.
    IoC와 DI를 이해 했다면 그 것들을 담고 있는 컨테이너라고 생각 하시면 됩니다.
    그럼 여기서는 AppConfigDI컨테이너 or IoC 컨테이너겠죠?
    요즘은 DI컨테이너라고 많이 한다고 하네요.
    스프링으로 예를 들자면 BeanFactory, ApplicationContext가 DI 컨테이너입니다.
반응형

'기타 IT' 카테고리의 다른 글

Gmail Smtp 534-5.7.14와534-5.7.9에러  (0) 2021.09.30
싱글톤에서의 상태값  (0) 2021.09.26
라이브러리와 프레임워크 차이  (0) 2021.09.26
객체지향 프로그래밍이 뭔가요?  (0) 2021.05.15
좋은 코드가 뭐에요??  (0) 2021.05.15
복사했습니다!