NestJS에서 의존성 주입(Dependency Injection)을 구현하는 방법은?(feat. 제어의 역전)

i-c-a-n-d-o·2024년 8월 6일
0

NestJS에서 의존성 주입(Dependency Injection)을 구현하는 방법

의존성 주입(Dependency Injection, DI)은 객체지향 프로그래밍에서 객체 간의 의존 관계를 외부에서 주입해주는 디자인 패턴이다. NestJS에서는 의존성 주입을 통해 컴포넌트 간의 의존성을 효율적으로 관리하며, 이로 인해 코드의 결합도가 낮아지고 유지보수와 테스트가 용이해진다.

클래스 생성자란?

클래스 생성자는 클래스의 인스턴스가 생성될 때 호출되는 특수한 메서드이다. 생성자는 주로 객체를 초기화하는 데 사용되며, 클래스 내부의 상태를 설정하거나 외부에서 주입받은 의존성을 클래스 내부에서 사용할 수 있도록 해준다.

NestJS에서 의존성 주입 구현하기

NestJS에서는 "@Injectable" 데코레이터를 사용하여 의존성을 주입할 클래스를 표시한다. 이 데코레이터는 NestJS에게 해당 클래스가 의존성 주입이 가능하다는 것을 알려준다.

의존성을 주입받으려는 클래스의 생성자에는 주입받을 서비스나 컴포넌트를 파라미터로 설정하면 된다.
그러면 NestJS는 이 생성자를 호출할 때 필요한 의존성을 자동으로 주입해준다.

직접 인스턴스를 생성하는 경우

UserService, UserRepository가 있을 때 의존성을 주입하지 않고 직접 생성했다면,
예제 코드는 아래와 같을 것이다.


이 방식에는 문제점이 있다.

  1. 의존성 관리의 어려움: 만약 UserRepository가 다른 서비스나 외부 모듈에 의존하고 있다면, UserService도 해당 의존성을 직접 생성해야한다. 이렇게 의존성이 변경되면 UserService의 생성코드도 함께 수정해야한다.
  2. 테스트의 어려움: UserRepository를 Mock 객체도 대체하기 어렵다.

의존성 주입을 통한 해결

반면에 의존성을 주입하여 객체의 생성과 관리 책임을 NestJS 프레임워크에게 맡겼다면,

  1. 의존성 관리의 용이함: UserService는 UserRepository의 구체적인 구현에 의존하지 않는다. 의존성 관리와 객체 생성은 NestJS가 자동으로 처리해준다.
  2. 유연한 코드 유지 보수: UserRepository의 구현이 변경되더라도 UserService의 코드는 수정할 필요가 없다.
  3. 테스트 용이성: 테스트 환경에서 Mock 객체를 사용하여 의존성을 대체할 수 있다.

애플리케이션이 시작될 때, NestJS는 모든 "@Injectable" 데코레이터가 붙은 클래스를 스캔하고, 각 클래스의 의존성을 분석하여 필요한 인스턴스를 자동으로 생성하고 관리해준다. 이렇게 함으로써 서비스 클래스는 의존성을 직접 생성하지 않고, NestJS가 이 모든 과정을 관리해준다. 결과적으로, 의존성 주입을 사용하면 코드의 결합도가 낮아지고, 유지보수와 테스트가 용이해진다.


제어의 역전(Inversion of Control, IoC)

제어의 역전은 애플리케이션의 흐름과 제어를 객체가 아닌 외부 프레임워크가 관리하도록 하는 디자인 패턴이다. 의존성 주입은 제어의 역전을 구현하는 대표적인 방법이다.

profile
나는 백엔드 개발자다!

0개의 댓글