22sook00 logo
SookDev

일렉트론 Main process 의 메소드

tag
web-app
date
Apr 1, 2023
목차
 
🔥
앞서 일렉트론의 기본 개념인 Main / Renderer 프로세스와 IPC 통신 개념에 대해 익혔다. 이번 파트에서는 Main process 에서 다루고 있는 모듈 기능에 대해 알아보려고 한다. 공식문서에 나와있는 메인 프로세스 모듈은 너무 많으니 주요하게 쓰이는 것 위주로 정리해보려 한다.
notion image
  • app
  • autoUpdater
  • BrowserWindow&View
  • contentTracing
  • dialog
  • globalShortcut
  • inAppPurchase
  • ipcMain
  • Menu
  • MessageChannelMain
  • MessagePortMain
  • nativeImage
  • nativeTheme
  • net
  • netLog
  • Notification
  • parentPort
  • powerMonitor
  • powerSaveBlocker
  • process
  • protocol
  • pushNotifications
  • safeStorage
  • screen
  • session
  • ShareMenu
  • shell
  • systemPreferences
  • TouchBar
  • Tray
  • utilityProcess
  • webContents
  • webFrameMain

app

어플리케이션의 라이프사이클을 컨트롤하는 모듈
리액트의 useEffect 와 같이, 일렉트론도 생명주기를 담당하는 모듈이 app 이다.
app 모듈에서 사용되는 이벤트는 다음과 같은 종류가 있다.

🎇 Event

  • will-finish-launching
    • 앱이 기본시작을 완료했을때 발생
  • ready
    • 일렉트론이 초기화를 완료했을때 한 번 발생
  • window-all-closed
    • 모든 창이 닫혔을 때 발생
  • before-quit
    • 앱 창을 닫기 전에 발생한다. 호출 시 event.preventDefault()로 종료동작을 방지한다.
    • 프로그램 종료 시 모든 창의 이벤트를 멈추고 닫은 후에 창이 닫힌다.
    • 사용자 로그아웃이나 시스템 재시작으로 인한 close 일 경우 before-quit은 발생하지 않는다.
  • will-quit
    • 모든 창이 닫히고 앱이 종료된다. 호출 시 event.preventDefault()로 종료동작을 방지한다
    • 사용자 로그아웃이나 시스템 재시작으로 인한 close 일 경우 before-quit은 발생하지 않는다.
  • quit
    • 앱이 종료될 때 발생한다.
    • 사용자 로그아웃이나 시스템 재시작으로 인한 close 일 경우 before-quit은 발생하지 않는다.
  • open-file
    • 사용자가 앱에서 파일을 오픈할 때 발생.
    • 일반적으로 응용프로그램이 열려있는 상태 혹은 Dock 에서 재사용하려고 할 때 발생된다.
  • open-url
    • 사용자가 앱에서 URL 열때 발생.
  • activate
    • 앱이 활성화 될 때 발생
  • new-window-for-tab
    • 사용자가 기본 macOS 의 새 탭 버튼을 클릭하면 발생한다.
    • 새 탭 버튼은 BrowserWindow의 tabbingIdentifier 으로 사용할 수 있다.
  • browser-window-blur / focus
    • BrowserWindow 가 흐려지고 / 포커스를 받으면 발생한다.
  • certificate-error
    • 인증확인이 실패했을때 발생.
    • url 인증서를 신뢰하려면 event.preventDefault() 로 동작 방지를 하고 콜백을 호출해야한다.
// 모든 창이 닫혔을 때 앱이 종료한다는 의미이다. const { app } = require('electron') app.on('window-all-closed', () => { app.quit() }) // 인증확인이 실패했을 경우 app.on('certificate-error', (event, webContents, url, error, certificate, callback) => { if (url === 'https://github.com') { // Verification logic. event.preventDefault() callback(true) //인증서를 신뢰할 수 있는 것으로 간주할지 여부 } else { callback(false) } })

🎇 Method

  • app.quit()
    • 모든 창을 닫는 메소드. before-quit 이벤트가 먼저 호출되고 모든창이 성공적으로 닫히면 will-quit 이벤트가 발생되면서 앱이 종료된다.
  • app.exit([exitCode])
    • before-quit 이벤트와 will-quit 이벤트가 발생하지 않고 즉각 닫히는 메소드.
    • exitCode 는 optional 한 정수로 default 값은 0이다.
  • app.relaunch([options])
    • options 는 {args:string,execPath:string} 객체로 이루어진 optional 한 값이다.
    • 현재 인스턴스가 종료되면 앱을 재시작한다.
    • app.relaunch({ args: process.argv.slice(1).concat(['--relaunch']) }) app.exit(0)
  • app.focus([options])
    • options 는 steal:boolean 으로 이루어진 optional 한 값이다.
    • 윈도우는 앱의 첫번째 창에 초점을 맞누게 되는데, 포커스메소드를 이용하면 해당 앱을 활성에 초점을 맞추고 활성화 한다.
    • steal 옵션은 가능한 적게 사용해야 한다고 공식문서에 나와있다.
  • app.hide()
    • 모든 앱 창을 숨긴다.
  • app.show()
    • 어떠한 이벤트가 발생했을 때 앱 창을 표시하며 자동으로 초점을 맞추지 않는다.
등등 수많은 이벤트와 메소드가 있어 추가적으로 필요 시 공식문서를 참고하면 된다.

autoUpdater

앱이 자동으로 업데이트 되도록 도와주는 모듈 맥과 윈도우만 지원이 된다.
 

BrowserWindow & BrowserView

브라우저의 창을 만들고 제어하는 모듈 BrowserWindow의 하위개념인 BrowserVIew

BrowserWindow

앱의 모양과 동작 생성, 업데이트 할 수 있으며 다양한 이벤트로 제어할 수 있다.
  • ready-to-show
    • 페이지를 로드하는 동안 렌더러 프로세스가 처음 페이지 렌더링 했을때 이벤트 발생
    • show 메소드와 함께 사용할 경우 렌더러가 false 임에도 “보이는”것으로 간주된다.
    • 해당 이벤트 후 창을 표시하게 되면 유저는 매끄러운 사용성을 경험할 수 있다.
  • backgroundColor
    • 복잡한 앱의 경우 ready-to-show 이벤트또한 늦게 발생하여 앱이 느리게느껴질 수 있다.
    • 백그라운드 컬러를 사용할 경우 창을 즉시 표시할 수 있기 때문에 앱의 배경에 가까운색을 선정하는것이 좋다.
const { BrowserWindow } = require('electron') // ready-to-show const win = new BrowserWindow({ show: false }) win.once('ready-to-show', () => { win.show() }) //backgroundColor const win = new BrowserWindow({ backgroundColor: '#2e2c29' }) win.loadURL('https://github.com')
  • new BrowserWindow([options])
    • options에는다음과 같은 optional 속성을 사용할 수 있다.
      • width / height : 창의 너비/높이 픽셀 단위로 defualt는 800/600 이다.
      • x / y : 각각 y/x가 사용되는 경우에 필수이며 창의 오프셋을 지정한다. 기본값은 창의 중앙이다.
      • minWidth / minHeight / maxWidth / maxHeight : 창의 최소/최대 너비와 높이
      • resizable : 창의 크기 조정여부. 기본값은 true 이다. 리눅스 구현불가
      • movable : 창의 이동 가능여부. 기본값은 true 이다. 리눅스 구현불가
      • alwaysOnTop : 항상 다른 창 위에 있어야 하는지 여부. 기본값은 false
      • fullscreen : 전체화면 표시여부. 기본값은 false
      • skipTaskbar : 작업표시줄에 창 표시 여부. 기본값은 false
      • kiosk : 창이 키오스크 모드인지 아닌지 여부. 기본값은 false
      • title : 기본 창 제목으로 기본값은 ‘Electron’ 이다. <title>에서 로드한 HTML 파일에 태그가 정의되어 있으면 loadURL() 속성은 무시된다.
      • icon : 이미지 혹은 스트링 값의 창 아이콘
      • frame: 프레임 없는 창 여부. 기본값은 true
      • webPreferences : 웹페이지의 기능설정
        • devTools : DevTools 활성화 여부 ex - BrowserWindow.webContents.openDevTools()
        • nodeIntegration : 노드 통합이 활성화 되었는지 여부
        • nodeIntegrationInWorker : 웹에서 노드 통합이 활성화 되었는지 여부 (멀티스레드)
//background.ts const mainWindow = createWindow("main", { width: 1000, height: 600, }); //create_window.ts const browserOptions: BrowserWindowConstructorOptions = { ...state, ...options, webPreferences: { nodeIntegration: true, contextIsolation: false, ...options.webPreferences, }, }; win = new BrowserWindow(browserOptions);

Dialog

파일 열기 및 저장, 경고를 위한 대화상자 표시
  • dialog.showOpenDialog
  • dialog.showOpenDialogSync
const { dialog } = require('electron') console.log(dialog.showOpenDialog({ properties: ['openFile', 'multiSelections'] }))
 

IpcMain

메인 프로세스에서 렌더러 프로세스로 비동기식으로 통신하는 모듈
  • ipcMain.on(channel , listener)
    • channel 로 새 메시지가 도착하면 listener 로 호출된다.
  • ipcMain.removeListener(channel , listener)
    • 리스너 배열에서 지정된 리스너를 제거한다.
  • ipcMain.handle(channel , listener)
    • ipc 에 대한 핸들러 추가.
ipcMain.handle('my-invokable-ipc', async (event, ...args) => { const result = await somePromise(...args) return result }) //renderer async () => { const result = await ipcRenderer.invoke('my-invokable-ipc', arg1, arg2) // ... }

결론

🌟
오류가 너무많다..
 

참조

Next.js page router 와 app router 차이
Next.js page router 와 app router 차이
Next.js page router 와 app router 차이