IoC는 Inversion of Control 제어의 역전입니다.
DI는 Dependency Injection 의존성 주입입니다.
핵심을 이야기하자면 IoC를 코드로 구현하는 방법 중 하나가 "의존성 주입"입니다.
IoC 는 워커객체로부터 행위 결정권(Control)을 뺏는 것입니다.
워커 객체에게 행위 결정권을 제한한다는 점에서 "커맨드 패턴"과 유사합니다. (커맨드 패턴은 아예 행위 결정권을 주지 않기 때문에 더 엄격한 주도권 관리입니다)
DI란 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴으로, 인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 동적으로 주입하여 유연성을 확보하고 결합도를 낮출 수 있게 해줍니다.
즉 클래스 간의 관계가아니라 객체간의 관계로 의존성 주입하는 것을 의미합니다.
의존성 주입은 말 그대로 의존적인 객체를 직접 생성하거나 제어하는 것이 아니라,
특정 객체에 필요한 객체를 외부에서 결정해서 연결시키는 것을 의미한다.
[ 의존성 주입(Dependency Injection) 정리 ]
한 객체가 어떤 객체(구체 클래스)에 의존할 것인지는 별도의 관심사이다. Spring은 의존성 주입을 도와주는 DI 컨테이너로써, 강하게 결합된 클래스들을 분리하고, 애플리케이션 실행 시점에 객체 간의 관계를 결정해 줌으로써 결합도를 낮추고 유연성을 확보해준다. 이러한 방법은 상속보다 훨씬 유연하다. 단, 한 객체가 다른 객체를 주입받으려면 반드시 DI 컨테이너에 의해 관리되어야 한다는 것이다.
- 두 객체 간의 관계라는 관심사의 분리
- 두 객체 간의 결합도를 낮춤
- 객체의 유연성을 높임
- 테스트 작성을 용이하게 함
WPF 의 경우 VM를 Datacontext로 부여하는 것이 일종의 DI라고 볼 수 있다.
정리
IoC는 제어의 역전으로,
워커 객체(개발자)에 제어권(제어 흐름)을 주는것이 아닌, 외부 객체(외부 컨테이너나 프레임워크)로 제어권을 주는 설계 방식입니다. 객체들 간의 의존성을 감소시켜 느슨한 결합을 하게 만들며, 유지보수의 유용성과 재사용성을 증가시키는 설계 방식입니다. ( 특정 객체가 다른 객체와 독립적으로 동작 가능 )
스프링 프레임 워크가 IoC의 예시라고 볼 수 있습니다. ( 프레임워크는 내가 작성한 코드를 제어하고 대신 실행한다. 콜백함수를 통해 함수 호출 제어권을 넘겨줌 )
DI는 의존성 주입으로 IoC를 구현하는 대표적인 방법으로, 객체가 사용할 의존성을 외부에서 주입받는 방식을 말합니다. 즉 클래스 내부에서 의존적 객체를 직접 생성하거나 제어하는것이 아니라 외부에서 객체를 연결하여 클래스간 결합도를 낮추고 유연성을 확보해주는 방식입니다.
의존성을 주입하는 방법에는 생성자 주입, 세터 주입, 인터페이스 주입, 필드 주입 등 다양한 방법이 있습니다.
WPF 의 경우 VM를 Datacontext로 부여하는 것이 일종의 DI라고 볼 수 있습니다.
IoC 장점
- 객체 간 낮은 결합도
- 유연한 코드 작성 가능
- 가독성 증가
- 코드 중복 방지
- 유지 보수 용이
추가 참고 자료 :
'공부 정리 > 면접 준비' 카테고리의 다른 글
확증적 데이터 분석 vs 탐색적 데이터 분석 (0) | 2025.02.26 |
---|---|
LangGraph 기본 개념 (0) | 2025.02.26 |
[C#] LINQ의 지연 실행에 대해 (0) | 2025.01.06 |
[ 네트워크 ] 3-way handshake, 4-way handshake 과정을 설명해 보세요. (0) | 2023.05.10 |
[ 네트워크 ] DNS서버에 요청하는 과정을 자세하게 설명해 보세요. (1) | 2023.05.10 |