의존성 주입(Dependency Injection, DI)은 객체지향 프로그래밍에서 객체 간의 의존 관계를 외부에서 주입해주는 디자인 패턴이다. NestJS에서는 의존성 주입을 통해 컴포넌트 간의 의존성을 효율적으로 관리하며, 이로 인해 코드의 결합도가 낮아지고 유지보수와 테스트가 용이해진다.
클래스 생성자는 클래스의 인스턴스가 생성될 때 호출되는 특수한 메서드이다. 생성자는 주로 객체를 초기화하는 데 사용되며, 클래스 내부의 상태를 설정하거나 외부에서 주입받은 의존성을 클래스 내부에서 사용할 수 있도록 해준다.
NestJS에서는 "@Injectable" 데코레이터를 사용하여 의존성을 주입할 클래스를 표시한다. 이 데코레이터는 NestJS에게 해당 클래스가 의존성 주입이 가능하다는 것을 알려준다.
의존성을 주입받으려는 클래스의 생성자에는 주입받을 서비스나 컴포넌트를 파라미터로 설정하면 된다.
그러면 NestJS는 이 생성자를 호출할 때 필요한 의존성을 자동으로 주입해준다.
UserService, UserRepository가 있을 때 의존성을 주입하지 않고 직접 생성했다면,
예제 코드는 아래와 같을 것이다.
이 방식에는 문제점이 있다.
반면에 의존성을 주입하여 객체의 생성과 관리 책임을 NestJS 프레임워크에게 맡겼다면,
애플리케이션이 시작될 때, NestJS는 모든 "@Injectable" 데코레이터가 붙은 클래스를 스캔하고, 각 클래스의 의존성을 분석하여 필요한 인스턴스를 자동으로 생성하고 관리해준다. 이렇게 함으로써 서비스 클래스는 의존성을 직접 생성하지 않고, NestJS가 이 모든 과정을 관리해준다. 결과적으로, 의존성 주입을 사용하면 코드의 결합도가 낮아지고, 유지보수와 테스트가 용이해진다.
제어의 역전은 애플리케이션의 흐름과 제어를 객체가 아닌 외부 프레임워크가 관리하도록 하는 디자인 패턴이다. 의존성 주입은 제어의 역전을 구현하는 대표적인 방법이다.