의존성 주입
의존성 주입은 소프트웨어 개발에서 객체지향 설계 원칙과 디자인 패턴에 기반을 둔 개념이다.
등장배경
소프트웨어 개발에서 클래스들간의 결합도를 낮추고 유지보수성과 재사용성을 향상시키는 것은 중요한 목표이며, 의존성 주입은 이러한 목표를 달성하기 위해 등장한 디자인 패턴 중 하나이다. 의존성 주입 개념이 등장하기 이전에는 클래스가 직접 의존하는 객체를 클래스 내부에 생성하는 방식으로 의존성을 처리했다. 이는 클래스와 의존하는 객체 사이의 결합도를 높여 코드의 유연성과 테스트 용이성을 저해하는 문제점이 있었다. 이에 의존성 주입 개념이 등장하여, 클래스가 의존하는 객체를 외부로부터 주입받는 방식으로 의존성 문제를 해결하고, 클래스간의 결합도를 낮추게 되었다.
장점
- 유연성 : 의존성 주입을 사용하면 클래스가 의존할 객체를 외부에서 주입받기 때문에 코드의 결합도가 낮아져 코드의 유연성이 증가한다. 즉, 유지보수 난이도의 하락과 개발적 사고 분리 이점의 증가를 누릴 수 있다.
- 테스트 용이성 : 주입할 클래스를 mock 객체로 치환하여 원하는 동작을 테스트할 수 있다. 이를 통해 의존성이 있는 클래스의 독립적인 테스트가 가능해지고, 테스트의 격리성이 증대된다.
- 모듈화와 재사용성 : 의존성 주입을 통해 클래스의 재사용을 촉진할 수 있다. 주입된 의존성은 외부에서 제공되므로 동일한 클래스를 다른 의존성으로 주입하여 새로운 기능을 구현하는 것이 간단해진다.
- 느슨한 결합 : 의존성 클래스를 주입받는 클래스는 자신이 무엇을 주입받는지 정확히 알 필요가 없기때문에 결합도가 느슨해진다.
의존성 주입은 굉장히 강력한 패턴이지만, 단점도 확실히 존재한다.
단점
- 복잡성 : 의존성 주입을 구현하려면 추가적인 코드와 설정이 필요할 수 있다. 이로 인해 초기 설정이 복잡해질 수 있으며, 코드의 가독성을 저해할수도 있다.
- 학습곡선 : 이 개념을 처음 접하는 개발자들에게는 상당히 낯선 방법론일 수 있다. 이를 이해하고 구현하기까지는 어느 정도의 학습량이 반드시 필요하다.
- 오버헤드 : 의존성 주입은 객체를 생성하고 주입하는 과정을 거치므로, 약간의 오버헤드가 발생할 수 있다. (하지만 대부분은 무시할 수 있을 정도의 작은 차이이다.)
간단한 구현
// 주입할 의존성 클래스
class InjectableDependency {
sayHello() {
console.log("hello")
}
}
// 의존성이 필요한 클래스
class MyClass {
constructor(dependency) {
this.dependency = dependency
}
sayHelloWithDependency() {
this.dependency.sayHello()
}
}
// InjectableDependency의 인스턴스를 MyClass가 생성될 때 주입
const myFeature = new MyClass(new InjectableDependency)
// 결과적으로 MyClass는 주입될 인스턴스의 코드를 모르고도 그 기능을 활용할 수 있음
myFeature.sayHelloWithDependency() // "hello"
'Javascript' 카테고리의 다른 글
클래스) 정적 프로퍼티, 메서드 (0) | 2023.03.19 |
---|---|
클래스) getter, setter (0) | 2023.03.19 |
클래스) 클래스 필드와 프라이빗 필드 (0) | 2023.03.19 |
자바스크립트 함수 주석 (기본기능) (0) | 2023.03.10 |
클린코드 연습 (2) - if 가공(+ 드 모르간 법칙), promise 활용, 함수 분리 (1) | 2023.02.05 |