Contents

앵귤러의 의존성 주입

의존성 주입 개요

https://angular.kr/guide/dependency-injection

앵귤러 프레임워크에서는 스프링에서처럼 의존성 주입의 개념을 지원한다. 앵귤러 프레임워크가 제공하는 컴포넌트, 디렉티브, 파이프, 데코레이터를 사용해서 원하는 곳과 연결 가능하다.

인젝터

의존성 객체가 요청되면

  • 인젝터가 인스턴스 저장소를 탐색
  • 이 객체의 인스턴스가 현재 존재하는지 확인
  • 인스턴스가 없다면
    • 새 인스턴스 생성
    • 생성한 인스턴스를 인스턴스 저장소에 보관
  • 인스턴스가 있다면
    • 이미 생성되어 있는 인스턴스를 사용

앵귤러는 어플리케이션 부트스트랩 시 root 인젝터 (앱 전역이 스코프)를 생성한다. 이후 필요할 때마다 하위 계층에 인젝터를 생성한다.

일반적으로 인젝터를 개발자가 직접 생성하지는 않는다. (프레임워크 레벨에서 관리)

의존성 등록

의존성 주입의 대상이 되는 클래스에 @Injectable 데코레이터 추가해야 함.

의존성 주입의 방법에는 크게 3가지

  1. 컴포넌트 계층에서 의존성 주입
    1. @Component 데코레이터의 providers 필드 사용
    2. 해당 컴포넌트 템플릿에 존재하는 모든 컴포넌트와 디렉티브에서 의존성 주입된 인스턴스에 접근 가능
  2. NgModule 계층에서 의존성 주입
    1. @NgModule 데코레이터의 providers 필드 사용
    2. 해당 NgModule안에 있는 모든 컴포넌트, 디렉티브, 파이프에서 의존성 주입된 인스턴스에 접근 가능
    3. 의존성 객체를 NgModule에 등록하면 해당 NgModule안에 있는 컴포넌트는 모두 동일한 인스턴스 사용
  3. 어플리케이션 최상위 계층에서 의존성 주입
    1. @Injectable 데코레이터의 providedIn: 'root'라고 지정
    2. 이 경우 앵귤러는 의존성 객체의 인스턴스를 한 번만 생성하고 해당 객체를 요청할 때마다 모두 동일한 인스턴스 사용
    3. 이렇게 주입하는 경우 이 의존성 객체가 실제 사용되지 않았을 때 최적화 작업 수행 (트리 셰이킹)

의존성 객체 주입하기

가장 많이 사용하는 방법은 클래스 생성자에서 의존성 객체를 요청하는 것이다. 앵귤러는 컴포넌트, 디렉티브, 파이프 클래스의 인스턴스 생성 시

  • 생성자에 등록된 객체의 타입을 보고
  • 어떤 의존성 객체가 필요한지 결정

프레임워크가 생성자의 등록된 파라미터들을 보고 어떤 의존성 객체가 필요한지 결정한다.(스프링에서처럼 생성자를 통해 의존성을 주입하는 것이 일반적)

이 때 서비스 인스턴스가 존재하지 않으면

  • 인젝터가 등록된 프로바이더로 인스턴스 생성
  • 해당 인스턴스를 인젝터에 추가

필요한 서비스 인스턴스가 모두 준비되면 앵귤러가 컴포넌트 생성자 실행 -> 서비스 인스턴스를 인자로 주입한다.