Appearance
AppConfig
createApp()에 전달하는 설정 객체의 필드별 상세 설명.
ts
interface AppConfig {
modules: Constructor[]
createWindow: () => BrowserWindow
guards?: IpcGuard[]
exceptionHandlers?: IpcExceptionHandler[]
logger?: AppLogger
onError?: (name: string, error: unknown) => void
}필수 필드
modules
ts
modules: Constructor[]@Module() 데코레이터가 적용된 모듈 클래스 배열. 배열 순서가 provider 등록 순서를 결정한다.
모듈 A의 provider가 모듈 B의 provider를 inject()하려면 모듈 B가 먼저 나열되어야 한다:
ts
modules: [
CoreModule, // 먼저 등록
FeatureModule, // CoreModule의 provider를 inject 가능
]createWindow
ts
createWindow: () => BrowserWindowBrowserWindow를 생성하여 반환하는 콜백. lifecycle 중 onInit() 이후, onWindowAttach() 이전에 호출된다.
ts
createWindow: () =>
new BrowserWindow({
width: 1200,
height: 800,
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
contextIsolation: true,
nodeIntegration: false,
},
})프레임워크는 이 함수가 반환한 윈도우에 대해:
onWindowAttach()로 provider에 참조를 전달한다- IPC 핸들러 등록 시
IpcContext.window로 사용한다 closed이벤트를 감지하여 핸들러 해제와onDispose()를 호출한다
선택 필드
guards
ts
guards?: IpcGuard[]기본값: []
IPC 요청을 검증하는 Guard 인스턴스 배열. 배열 순서대로 canActivate()를 실행하며, 하나라도 false를 반환하면 요청을 거부한다.
ts
guards: [new SenderGuard(), new RateLimitGuard()]exceptionHandlers
ts
exceptionHandlers?: IpcExceptionHandler[]기본값: []
Guard 실패 또는 핸들러 에러를 처리하는 ExceptionHandler 인스턴스 배열. Guard가 실패하거나 핸들러에서 에러가 발생하면 첫 번째 handler의 catch()가 호출된다.
handler가 없으면 에러가 그대로 렌더러로 전파된다.
ts
exceptionHandlers: [new ErrorHandler()]logger
ts
logger?: AppLogger기본값: undefined (로깅 없음)
부트스트랩 과정의 로그를 출력하는 로거. info() 메서드만 요구한다.
ts
interface AppLogger {
info(message: string): void
}ts
logger: {
info: (msg) => console.log(`[ipc] ${msg}`),
}로깅 내용:
- 모듈별 provider/controller 등록
- IPC 채널 핸들러 등록
- Lifecycle 단계 진행
onError
ts
onError?: (name: string, error: unknown) => void기본값: undefined
Lifecycle 메서드(onInit, onWindowAttach, onDispose) 실행 중 에러가 발생했을 때 호출되는 콜백. 에러가 발생해도 나머지 provider의 lifecycle은 계속 실행된다.
ts
onError: (name, error) => {
logger.error(`Lifecycle error in ${name}:`, error);
}name은 에러가 발생한 provider 클래스의 이름이다.