IPC (Inter-Process Communication)

IPC는 운영체제를 공부하면서 처음 마주하는 프로세스에서 나오는 개념입니다. 기본적으로 프로세스는 완전히 독립된 실행객체입니다. 따라서 서로 독립되어 있다는 것은 다른 프로세스의 영향을 받지 않는다는 장점이 있지만 서로간의 통신이 어렵다는 문제가 발생합니다.

여러 운영체제는 이러한 문제를 해결하기 위해서 IPC라는 것을 제공하고, 리눅스에서는 커널 영역에서 프로세스간 통신을 제공합니다. 즉 프로세스는 커널이 제공하는 IPC설비를 사용해서 프로세스간 통신을 할 수 있습니다.

Electron에서의 IPC

일렉트론도 기본적으로 main 프로세스와 renderer프로세스들의 조합으로 이루어져 있기 때문에 서로 소통이 필요합니다. 그렇기 때문에 일렉트론에서도 자신만의 독자적인 IPC모듈을 구성하고 있습니다. 이번 게시글에서는 일렉트론에서 IPC가 어떻게 이루어져 있는지 알아보도록 합시다.

Renderer프로세스에서 main프로세스로

Renderer프로세스에서 main프로세스로 메시지를 보냅니다. 이 경우는 우리의 웹 content에서 main을 부를때 사용합니다.

ipcMain.on()

ipcMain.on() 함수를 사용해서 set-title이라는 메시지를 수신하고, 그때 받아오는 매개변수에 따라 처리를 진행합니다.

ipcMain.on('set-title', (event, title) => {
    const webContents = event.sender
    const win = BrowserWindow.fromWebContents(webContents)
    win.setTitle(title)
  })

해당 예제에서 ipcMain.on은 두가지 매개변수를 받습니다.

  1. message의 이름
  2. Renderer프로세스가 보낸 데이터를 처리하는 callback 함수 (보통 첫번째 매개변수는 event객체, 두번째 부터 data를 의미합니다.)

ipcRenderer.send()

ipcRenderer.send()함수를 사용해서 Renderer프로세스에서 데이터를 보냅니다. 기본적으로는 renderer프로세스는 Node.js나 Electron 객체를 접근할 수 없기 때문에 개발자는 해당 모듈을 사용하려면 main에 신호를 보내서 처리해야합니다.

const { contextBridge, ipcRenderer } = require('electron')

contextBridge.exposeInMainWorld('electronAPI', {
    setTitle: (title) => ipcRenderer.send('set-title', title)
})