반응형
✔️ 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를 이해 했다면 그 것들을 담고 있는 컨테이너라고 생각 하시면 됩니다.
그럼 여기서는AppConfig
가 DI컨테이너 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 |