에러 백과

inject()는 주입 컨텍스트에서 호출해야 합니다

허용된 주입 컨텍스트 밖에서 inject 함수를 사용하려고 하면 이 오류가 발생합니다. 주입 컨텍스트는 클래스를 생성하고 초기화하는 동안 사용할 수 있습니다. runInInjectionContext와 함께 사용하는 함수에서도 사용할 수 있습니다.

실제로 inject()는 생성자, 생성자 매개변수, 필드 초기화 코드에서 호출할 수 있습니다.

@Service()
export class Car {
  radio: Radio | undefined;

  // 정상: 필드 초기화 코드
  spareTyre = inject(Tyre);

  constructor() {
    // 정상: 생성자 본문
    this.radio = inject(Radio);
  }
}

프로바이더의 팩토리에서도 inject를 호출할 수 있습니다.

providers: [
  {
    provide: Car,
    useFactory: () => {
      // 정상: 클래스 팩토리
      const engine = inject(Engine);
      return new Car(engine);
    },
  },
];

클래스 생성 과정이나 runInInjectionContext 밖에서 inject 함수를 호출하면 오류가 발생합니다. 특히 클래스 인스턴스가 생성된 이후에는 라이프사이클 훅을 포함한 메서드에서 inject()를 호출할 수 없습니다.

@Component({ ... })
export class Car {
  ngOnInit() {
    // 오류: 컴포넌트 인스턴스가 이미 생성되어 호출 시점이 너무 늦습니다.
    const engine = inject(Engine);
    engine.start();
  }
}

오류 디버깅

오류의 스택 트레이스를 거슬러 올라가며 허용되지 않은 inject() 호출의 위치를 찾으세요.

오류를 해결하려면 inject 호출을 허용된 위치로 옮기세요. 보통 클래스 생성자나 필드 초기화 코드로 옮기면 됩니다.

NOTE: 테스트 컨텍스트에서 실행하는 경우 TestBed.runInInjectionContext를 사용하면 inject()를 정상적으로 호출할 수 있습니다.

TestBed.runInInjectionContext(() => {
  // ...
});