앵귤러의 의존성 주입
Contents
의존성 주입 개요
https://angular.kr/guide/dependency-injection
앵귤러 프레임워크에서는 스프링에서처럼 의존성 주입의 개념을 지원한다. 앵귤러 프레임워크가 제공하는 컴포넌트, 디렉티브, 파이프, 데코레이터를 사용해서 원하는 곳과 연결 가능하다.
인젝터
의존성 객체가 요청되면
- 인젝터가 인스턴스 저장소를 탐색
- 이 객체의 인스턴스가 현재 존재하는지 확인
- 인스턴스가 없다면
- 새 인스턴스 생성
- 생성한 인스턴스를 인스턴스 저장소에 보관
- 인스턴스가 있다면
- 이미 생성되어 있는 인스턴스를 사용
앵귤러는 어플리케이션 부트스트랩 시 root 인젝터 (앱 전역이 스코프)를 생성한다. 이후 필요할 때마다 하위 계층에 인젝터를 생성한다.
일반적으로 인젝터를 개발자가 직접 생성하지는 않는다. (프레임워크 레벨에서 관리)
의존성 등록
의존성 주입의 대상이 되는 클래스에 @Injectable
데코레이터 추가해야 함.
의존성 주입의 방법에는 크게 3가지
- 컴포넌트 계층에서 의존성 주입
@Component
데코레이터의providers
필드 사용- 해당 컴포넌트 템플릿에 존재하는 모든 컴포넌트와 디렉티브에서 의존성 주입된 인스턴스에 접근 가능
NgModule
계층에서 의존성 주입@NgModule
데코레이터의providers
필드 사용- 해당
NgModule
안에 있는 모든 컴포넌트, 디렉티브, 파이프에서 의존성 주입된 인스턴스에 접근 가능 - 의존성 객체를
NgModule
에 등록하면 해당NgModule
안에 있는 컴포넌트는 모두 동일한 인스턴스 사용
- 어플리케이션 최상위 계층에서 의존성 주입
@Injectable
데코레이터의providedIn: 'root'
라고 지정- 이 경우 앵귤러는 의존성 객체의 인스턴스를 한 번만 생성하고 해당 객체를 요청할 때마다 모두 동일한 인스턴스 사용
- 이렇게 주입하는 경우 이 의존성 객체가 실제 사용되지 않았을 때 최적화 작업 수행 (트리 셰이킹)
의존성 객체 주입하기
가장 많이 사용하는 방법은 클래스 생성자에서 의존성 객체를 요청하는 것이다. 앵귤러는 컴포넌트, 디렉티브, 파이프 클래스의 인스턴스 생성 시
- 생성자에 등록된 객체의 타입을 보고
- 어떤 의존성 객체가 필요한지 결정
프레임워크가 생성자의 등록된 파라미터들을 보고 어떤 의존성 객체가 필요한지 결정한다.(스프링에서처럼 생성자를 통해 의존성을 주입하는 것이 일반적)
이 때 서비스 인스턴스가 존재하지 않으면
- 인젝터가 등록된 프로바이더로 인스턴스 생성
- 해당 인스턴스를 인젝터에 추가
필요한 서비스 인스턴스가 모두 준비되면 앵귤러가 컴포넌트 생성자 실행 -> 서비스 인스턴스를 인자로 주입한다.