HIT해
의존성 주입이란? 본문
728x90
의존성 주입(Dependency Injection, DI)이란?
의존성 주입은 객체지향 프로그래밍에서 자주 사용되는 소프트웨어 디자인 패턴 중 하나로, 객체가 필요로 하는 의존성을 외부에서 주입받는 방법을 의미한다. 이를 통해 코드의 결합도를 낮추고, 테스트와 유지보수가 용이해지는 장점이 있다.
의존성 주입의 개념
- 의존성(Dependency): 객체가 정상적으로 동작하기 위해 필요한 외부 객체나 자원을 의미한다. 예를 들어, 클래스 A가 클래스 B의 기능을 사용해야 한다면, 클래스 A는 클래스 B에 의존하고 있다고 할 수 있다.
- 주입(Injection): 의존성을 외부에서 제공하는 행위다. 객체가 필요한 의존성을 직접 생성하지 않고, 외부에서 주입받음으로써 코드의 유연성을 높일 수 있다.
의존성 주입의 장점
- 결합도 감소: 클래스가 직접 의존성을 생성하지 않기 때문에, 클래스 간의 결합도가 낮아진다. 이는 코드의 재사용성과 확장성을 높이는 데 기여한다.
- 테스트 용이성: 의존성을 외부에서 주입받기 때문에, 테스트 시에 필요한 가짜 객체(Mock 객체)를 쉽게 주입할 수 있다. 이를 통해 테스트가 용이해지고, 테스트 커버리지를 높일 수 있다.
- 유연성 증가: 의존성을 쉽게 교체할 수 있어, 코드의 유연성이 증가한다. 예를 들어, 데이터베이스 연결 객체를 쉽게 교체할 수 있어 다양한 환경에서 동일한 코드가 동작하도록 할 수 있다.
의존성 주입의 방법
- 생성자 주입(Constructor Injection): 객체의 생성자에서 의존성을 주입받는 방법이다. 가장 일반적인 의존성 주입 방법으로, 객체의 불변성을 보장할 수 있다.
class MyService {
final ApiClient apiClient;
MyService(this.apiClient);
}
- 세터 주입(Setter Injection): 객체의 세터 메서드를 통해 의존성을 주입받는 방법이다. 주입받는 의존성을 변경할 수 있는 유연성을 제공한다.
class MyService {
ApiClient? apiClient;
void setApiClient(ApiClient apiClient) {
this.apiClient = apiClient;
}
}
- 인터페이스 주입(Interface Injection): 인터페이스를 통해 의존성을 주입받는 방법이다. 의존성을 주입하는 객체가 주입받는 객체에게 의존성을 설정할 수 있는 메서드를 제공한다.
abstract class ApiClientSetter {
void setApiClient(ApiClient apiClient);
}
class MyService implements ApiClientSetter {
ApiClient? apiClient;
@override
void setApiClient(ApiClient apiClient) {
this.apiClient = apiClient;
}
}
결론
의존성 주입은 객체지향 프로그래밍에서 중요한 디자인 패턴으로, 코드의 결합도를 낮추고 유연성을 높여준다.
이를 통해 테스트 용이성과 유지보수성을 향상시킬 수 있다.
Flutter에서 Provider나 Riverpod와 같은 상태 관리 라이브러리는 이러한 의존성 주입 패턴을 쉽게 구현할 수 있도록 도와준다.