Appearance
Providers
Provider는 비즈니스 로직을 캡슐화하는 서비스 클래스다. DI 컨테이너에 등록되어 다른 provider나 controller에서 주입받아 사용한다.
@Injectable()
@Injectable() 데코레이터로 DI 컨테이너에 등록 가능한 서비스를 표시한다.
ts
import { Injectable } from '@repo/electron-ipc';
@Injectable()
class UserService {
findById(id: string) {
// ...
}
}@Injectable()이 없는 클래스를 provider로 등록하면 무시된다.
inject()
inject()는 클래스 필드 이니셜라이저에서 의존성을 주입하는 함수다. Angular 14+의 inject() 패턴을 따른다.
ts
@Injectable()
class AuthService {
private readonly userService = inject(UserService);
private readonly tokenService = inject(TokenService);
authenticate(token: string) {
const decoded = this.tokenService.verify(token);
return this.userService.findById(decoded.userId);
}
}동작 원리
Container가 인스턴스를 생성할 때 전역activeContainer를 자신으로 설정한다- 클래스 생성자가 실행되면서 필드 이니셜라이저의
inject()호출이activeContainer에서 의존성을 resolve한다 - 중첩
inject()도 지원된다 — A가 B를 주입하고, B가 C를 주입하는 경우
WARNING
inject()는 반드시 Container의 인스턴스 생성 컨텍스트 안에서 호출해야 한다. 컨텍스트 밖에서 호출하면 에러가 발생한다.
Container
Container는 싱글톤 레지스트리다. 모든 provider를 등록 순서대로 관리하며, lifecycle 메서드를 순서대로 호출한다.
ts
import { Container } from '@repo/electron-ipc';
const container = new Container({
onError: (name, error) => console.error(`[${name}]`, error),
});
container.register(UserService);
container.register(AuthService);
container.resolveAll();TIP
일반적으로 Container를 직접 사용할 필요 없다. createApp()이 내부적으로 Container를 생성하고 모듈의 provider를 등록한다.
주요 메서드
| 메서드 | 설명 |
|---|---|
register(token) | @Injectable 표시된 클래스를 등록 |
resolve(token) | 싱글톤으로 인스턴스 반환 (첫 호출 시 생성) |
createInstance(cls) | 레지스트리에 등록하지 않는 일회성 인스턴스 생성 |
resolveAll() | 등록된 모든 provider를 등록 순서대로 eagerly resolve |
initAll() | onInit() 구현체를 순서대로 호출 |
createMainWindow() | onMainWindowCreate() 구현체(정확히 1개)를 호출하여 BrowserWindow 반환 |
attachWindowAll(window) | onWindowAttach() 구현체를 순서대로 호출 |
disposeAll() | onDispose() 구현체를 순서대로 호출 |
다음 단계
- Controllers — @Controller(contract)로 IPC 핸들러를 정의하는 방법
- Lifecycle Events — provider의 lifecycle 인터페이스