Skip to content

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: () => BrowserWindow

BrowserWindow를 생성하여 반환하는 콜백. 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 클래스의 이름이다.