Front

[tsyringe] @inject

챛채 2024. 10. 10. 14:33

tsyringe는 TypeScript용 의존성 주입(DI) 라이브러리이다.

이 라이브러리를 사용하면 클래스를 좀 더 모듈화하고 코드의 테스트 가능성을 높일 수 있다.

@inject는 tsyringe에서 제공하는 데코레이터 중 하나로 의존성을 주입할 때 사용된다. 이 데코레이터는 클래스의 생성자에 특정 의존성을 주입할 수 있도록 도와준다. 주로 의존성을 수동으로 연결하는 대신 자동으로 해당 의존성을 연결해 준다.

@inject의 주요 기능:

  1. 특정 토큰 또는 클래스 주입: @inject를 사용하면, 생성자나 클래스에 필요한 의존성을 주입할 때 주입할 객체를 직접 지정할 수 있다. 이때 주입할 의존성은 클래스 자체나 다른 키(Token)로 지정할 수 있다.

[기본 사용 예시]

import { injectable, inject } from 'tsyringe';

@injectable()
class ServiceA {
  doSomething() {
    console.log('Service A');
  }
}

@injectable()
class Client {
  constructor(@inject(ServiceA) private serviceA: ServiceA) {}

  useService() {
    this.serviceA.doSomething();
  }
}

// 의존성 주입을 통해 클라이언트를 생성하고 사용할 수 있다.
const client = container.resolve(Client);
client.useService(); // 'Service A' 출력

위의 예시에서 Client 클래스는 ServiceA를 의존성으로 주입받는다. @inject(ServiceA) 데코레이터는 ServiceA 인스턴스를 자동으로 주입해 준다.

2. 토큰 기반 의존성 주입

때로는 클래스가 아닌 **토큰(Token)**을 기반으로 의존성을 주입할 수도 있다. 이는 인터페이스나 여러 구현체가 있을 때 유용하다.

const SERVICE_TOKEN = "SERVICE_TOKEN";

@injectable()
class ServiceB {
  doSomething() {
    console.log('Service B');
  }
}

container.register(SERVICE_TOKEN, { useClass: ServiceB });

@injectable()
class ClientB {
  constructor(@inject(SERVICE_TOKEN) private service: ServiceB) {}

  useService() {
    this.service.doSomething();
  }
}

const clientB = container.resolve(ClientB);
clientB.useService(); // 'Service B' 출력

여기서는 SERVICE_TOKEN이라는 문자열 토큰을 기반으로 ServiceB가 의존성으로 주입되었다.

@inject의 주요 특징:

  • 주입 대상 지정: 어떤 의존성을 주입할지 명확하게 지정할 수 있습니다. 클래스나 인터페이스, 또는 커스텀 토큰을 통해 주입 가능하다.
  • 자동 의존성 주입: tsyringe는 필요한 의존성을 자동으로 찾아 주입해 준다. 이를 통해 수동으로 의존성을 관리하는 번거로움을 줄일 수 있다.

@inject는 주입할 의존성을 명확하게 지정하고, 의존성 관리의 복잡성을 줄여준다. 이를 통해 코드를 더 쉽게 확장 가능하고 테스트하기 쉽게 만들어준다.