의존성 주입(DI)은 의존성 생성 및 관리를 종속되는 객체와 분리하기 때문에 객체의 결합을 줄여줍니다. 즉, 객체는 의존성이 어떻게 생성되거나 관리되는지 알 필요가 없으므로 의존성은 줄어들고 더 모듈화되고 유지 관리가 쉬워집니다.
이를 더 잘 이해하기 위해 예를 들어 보겠습니다. 자동차를 만들고 있다고 상상해 보세요. 자동차에는 엔진, 변속기, 바퀴와 같은 여러 구성 요소가 있습니다. 각 구성 요소에는 엔진용 연료, 변속기용 오일, 타이어용 공기 등 고유한 의존성 집합이 있습니다.
이제 자동차의 엔진을 교체하고 싶다고 가정해 보겠습니다. 긴밀하게 연결된 시스템에서는 엔진에 종속된 모든 구성 요소를 새 엔진에 맞게 수정해야 할 수 있습니다. 예를 들어, 새 엔진의 출력에 맞게 변속기를 변경하거나 새 엔진의 무게를 감당할 수 있도록 휠을 변경해야 할 수 있습니다.
하지만 의존성 인젝션을 사용하면 엔진에서 구성 요소를 분리하여 서로 독립적으로 만들 수 있습니다. 즉, 다른 구성 요소에 영향을 주지 않고 엔진을 변경할 수 있습니다. 예를 들어 엔진을 각 컴포넌트에 하드코딩하는 대신 엔진을 각 컴포넌트에 의존성으로 주입할 수 있습니다. 이렇게 하면 엔진을 변경할 때 엔진에 종속된 모든 컴포넌트가 아니라 엔진 자체만 수정하면 됩니다.
실제로 의존성 주입은 아웃소싱의 개념과 유사합니다. 회사에서 특정 작업을 전문 서비스 제공업체에 아웃소싱하는 것과 마찬가지로, 객체는 의존성의 생성 및 관리를 다른 컴포넌트나 프레임워크에 아웃소싱할 수 있습니다. 이렇게 하면 객체는 의존성이 어떻게 생성되거나 관리되는지 알 필요가 없으며 자체 기능에만 집중할 수 있습니다.
전반적으로 의존성 주입은 의존성을 줄이고 의존성 생성 및 관리를 종속된 객체에서 분리하여 객체의 결합을 줄여줍니다.
의존성을 주입하는 경우 vs 주입하지 않는 경우
물론 자동차 예제를 사용하여 의존성 주입과 의존성 주입을 하지 않는 것의 결합을 비교할 수 있습니다.
의존성 주입이 없는 경우:
긴밀하게 결합된 시스템에서는 각 자동차 컴포넌트가 자체 의존성을 생성하고 관리할 책임이 있습니다. 예를 들어 엔진 구성 요소는 연료, 오일, 공기 의존성을 생성하고 관리할 책임이 있습니다. 이렇게 하면 각 구성 요소가 서로 의존하는 긴밀하게 연결된 시스템이 만들어지며, 한 구성 요소의 변경이 다른 구성 요소에 영향을 미칠 수 있습니다.
엔진을 다른 종류의 연료가 필요한 새 엔진으로 교체하고 싶다고 가정해 보겠습니다. 이 시나리오에서는 새로운 연료 유형을 처리하기 위해 엔진 구성 요소를 수정해야 하며, 새 엔진을 수용하기 위해 연료, 오일 및 공기 구성 요소도 수정해야 할 수 있습니다. 이렇게 하면 구성 요소 간에 많은 결합이 발생하고 다른 구성 요소에 영향을 주지 않고 변경하기가 어렵습니다.
의존성 주입을 사용하면:
반면 의존성 주입을 사용하면 컴포넌트를 서로 분리하여 시스템에서 커플링의 양을 줄일 수 있습니다. 각 컴포넌트는 의존성을 선언하지만 의존성을 생성하거나 관리할 책임은 없습니다.
대신 별도의 컴포넌트 또는 프레임워크가 의존성을 생성 및 관리하고 필요에 따라 각 컴포넌트에 의존성을 주입합니다. 예를 들어 연료 분사 시스템은 연료, 오일, 공기 의존성을 관리하고 엔진 컴포넌트가 초기화될 때 이를 엔진 컴포넌트에 주입할 수 있습니다.
엔진을 다른 종류의 연료가 필요한 새 엔진으로 교체하려는 경우 엔진 구성 요소와 연료 분사 시스템만 수정하면 됩니다. 이렇게 하면 구성 요소 간의 결합이 줄어들고 다른 구성 요소에 영향을 주지 않고 쉽게 변경할 수 있습니다.
'iOS' 카테고리의 다른 글
[iOS] MVVM 패턴이란? (2) | 2022.10.12 |
---|---|
[iOS] MVC 패턴이란? (0) | 2022.10.09 |
iOS App States (0) | 2022.04.29 |