Electron

์›๋ช… Atom Shell.
Electron 28๋ถ€ํ„ฐ, ESM์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
์ฐธ๊ณ : https://github.com/Elanis/web-to-desktop-framework-comparison
NW.js(์›๋ช… node-webkit)๋Š” Electron์˜ ์ฃผ์š” ๊ฒฝ์Ÿ์ž๋กœ, ๋‘˜ ๋‹ค Chromium+Node.js ์•„ํ‚คํ…์ฒ˜์˜ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋ฐ์Šคํฌํ†ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.
NW.js๋Š” Electron๋ณด๋‹ค 2๋…„ ๋จผ์ € ์ถœ์‹œ๋˜์—ˆ์ง€๋งŒ, Electron์ด ์ด์ œ NW.js๋ณด๋‹ค ํ›จ์”ฌ ์ธ๊ธฐ๊ฐ€ ๋งŽ์œผ๋ฉฐ, ์•ž์œผ๋กœ๋„ ์ด ์ƒํ™ฉ์ด ๋ฐ”๋€” ๊ฐ€๋Šฅ์„ฑ์€ ๋‚ฎ์Šต๋‹ˆ๋‹ค.
  • Electron์€ ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค์™€ ๋ Œ๋”๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.
    ๋ Œ๋”๋Ÿฌ ํ”„๋กœ์„ธ์Šค ๋‚ด๋Š” ๋‘ ๊ฐœ์˜ ์ปจํ…์ŠคํŠธ๋กœ ๋‚˜๋‰˜์–ด ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ Node.js ์ฝ”๋“œ์™€ ๋ธŒ๋ผ์šฐ์ € ์ธก ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
Electron ๋ชจ๋ธ์€ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ–ˆ์ง€๋งŒ, ์ด๋Ÿฌํ•œ ๊ฐ•์ œ์ ์ธ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ ์„ค๊ณ„๊ฐ€ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š”์ง€๋Š” ๋งค์šฐ ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด์ƒํ•  ์ •๋„๋กœ ๋ฒˆ๊ฑฐ๋กœ์šด IPC ์„ค๊ณ„์™€ ๋Š์ž„์—†๋Š” ๋ณด์•ˆ ์—ฐ์ถœ์€ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ๋งค์šฐ ๋‚˜์˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • NW.js๋Š” Chrome ์•ฑ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, Node.js์™€ Chromium ๋ Œ๋”๋Ÿฌ๊ฐ€ ๋™์ผ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ณต์œ ํ•˜๋ฏ€๋กœ ๋ธŒ๋ผ์šฐ์ € ์ธก์—์„œ Node.js ๋ชจ๋“ˆ์„ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ๋ธŒ๋ผ์šฐ์ € ์ธก์—์„œ Node.js ๋„ค์ดํ‹ฐ๋ธŒ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ง์ ‘ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, NW.js์˜ ์„ฑ๋Šฅ์€ IPC์— ์˜์กดํ•˜๋Š” Electron ๋ฐ WASM ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜๋ณด๋‹ค ํ›จ์”ฌ ์šฐ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.
์ปจํ…์ŠคํŠธ ๋ถ„๋ฆฌ ๋ชจ๋“œ์™€ ํ˜ผํ•ฉ ์ปจํ…์ŠคํŠธ ๋ชจ๋“œ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:
  • ์ปจํ…์ŠคํŠธ ๋ถ„๋ฆฌ ๋ชจ๋“œ์—์„œ๋Š” Node ์ปจํ…์ŠคํŠธ์™€ Web ์ปจํ…์ŠคํŠธ ๋‘ ํ™˜๊ฒฝ์œผ๋กœ ๋‚˜๋‰˜๋ฉฐ, Node ์ปจํ…์ŠคํŠธ๋Š” Node.js ๋ชจ๋“ˆ์˜ ์‹คํ–‰ ํ™˜๊ฒฝ์ด๊ณ , Web ์ปจํ…์ŠคํŠธ๋Š” NW.js ์Šคํฌ๋ฆฝํŠธ์˜ ์‹คํ–‰ ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค.
    ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์˜ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ๊ฒฉ๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์ฐธ์กฐ ๋™๋“ฑ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
  • ํ˜ผํ•ฉ ์ปจํ…์ŠคํŠธ ๋ชจ๋“œ์—์„œ๋Š” ํ•˜๋‚˜์˜ ์ปจํ…์ŠคํŠธ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    ์ฐธ์กฐ ๋™๋“ฑ์„ฑ ๋ฌธ์ œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ, ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜ํ•ด ์ปจํ…์ŠคํŠธ๊ฐ€ ์˜ค์—ผ๋  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Electron์˜ ์ง„์ž…์ ์€ ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค์˜ JavaScript ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.
  • NW.js์˜ ์ง„์ž…์ ์€ ์ฃผ๋กœ HTML ํŒŒ์ผ์ด์ง€๋งŒ, JavaScript ์Šคํฌ๋ฆฝํŠธ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
Electron์˜ ๋ฌธ์„œ๋Š” NW.js์˜ ๋ฌธ์„œ๋ณด๋‹ค ํ›จ์”ฌ ์šฐ์ˆ˜ํ•˜๋ฉฐ, ํ›„์ž์˜ ๋ฌธ์„œ๋Š” ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ์—…๋ฐ์ดํŠธ๊ฐ€ ์‹ฌ๊ฐํ•˜๊ฒŒ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.
  • Electron์€ ๋„ค์ดํ‹ฐ๋ธŒ ์†Œ์Šค ์ฝ”๋“œ ๋ณดํ˜ธ ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฏ€๋กœ, bytenode ๋˜๋Š” electron-vite์™€ ๊ฐ™์€ V8 ๋ฐ”์ดํŠธ์ฝ”๋“œ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • NW.js์—๋Š” ๊ณต์‹์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ์ฝ”๋“œ ์ปดํŒŒ์ผ๋Ÿฌ nwjc๊ฐ€ ์žˆ์œผ๋ฉฐ, ์›๋ฆฌ๋Š” bytenode์™€ ๋™์ผํ•˜์ง€๋งŒ ๊ตฌํ˜„์€ ์•ฝ๊ฐ„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค:
    NW.js๋Š” V8์„ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ bytenode์™€ ๊ฐ™์€ ์™ธ๋ถ€ ์†”๋ฃจ์…˜์ด ๊ฐ€์ง€๋Š” ๋งŽ์€ ์ œ์•ฝ ์‚ฌํ•ญ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Electron์€ ๋งŽ์€ ์ƒ์—… ํšŒ์‚ฌ ์‚ฌ์šฉ์ž๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ํ”„๋กœ์ ํŠธ๋Š” VSCode์ž…๋‹ˆ๋‹ค.
  • NW.js๋Š” ์ผ์ฐ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ, ํ˜„์žฌ ์‚ฌ์šฉ์ž ์ˆ˜๊ฐ€ ๋น„๊ต์  ์ ์Šต๋‹ˆ๋‹ค.
    RPG Maker๋กœ ์ œ์ž‘๋œ ๊ฒŒ์ž„์€ NW.js์˜ ํ˜„์žฌ ๊ฐ€์žฅ ํฐ ์‚ฌ์šฉ์ž ์†Œ์Šค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Neutralinojs๋Š” Chromium์„ ํŒจํ‚ค์ง•ํ•˜์ง€ ์•Š๊ณ , ์šด์˜ ์ฒด์ œ์˜ WebView๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
WebView๋Š” ์˜ˆ์ƒ๋Œ€๋กœ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•˜๋ฏ€๋กœ, ํ”„๋กœ๋•์…˜ ์ˆ˜์ค€์˜ ์†”๋ฃจ์…˜์œผ๋กœ ๊ณ ๋ ค๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
Neutralinojs๋Š” ๊ตฌํ˜• Windows ์‹œ์Šคํ…œ์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค: https://github.com/neutralinojs/neutralinojs/issues/486
Tauri๋Š” Rust์™€ ์šด์˜ ์ฒด์ œ์˜ WebView๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, Node.js ๋ชจ๋“ˆ์„ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ Rust๋กœ API๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
WebView๋Š” ์˜ˆ์ƒ๋Œ€๋กœ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•˜๋ฏ€๋กœ, ํ”„๋กœ๋•์…˜ ์ˆ˜์ค€์˜ ์†”๋ฃจ์…˜์œผ๋กœ ๊ณ ๋ ค๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋ฐ์Šคํฌํ†ฑ ํ”Œ๋žซํผ ์™ธ์—๋„, Tauri๋Š” iOS์™€ Android๋„ ์ง€์›ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.
  • ์ปจํ…์ŠคํŠธ ๊ฒฉ๋ฆฌ๋Š” ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • API์˜ ํ†ต์ผ์„ฑ์ด ๋ถ€์กฑํ•˜๋ฉฐ, ์ฐฝ์˜ ๋ฉ”๋‰ด๋ฐ”๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•๋งŒ ํ•ด๋„ ์—ฌ๋Ÿฌ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
  • ๋„ˆ๋ฌด ๋น ๋ฅธ ๋ฉ”์ด์ € ๋ฒ„์ „ ๋ฐ˜๋ณต ์ „๋žต.
  • ์œ ์šฉํ•œ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.
Electron ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค๋กœ, ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ง„์ž…์ ์ด๋ฉฐ, ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค์— ํ•˜๋‚˜๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Electron ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋กœ, ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค์— ์˜ํ•ด ์‹œ์ž‘๋˜๋ฉฐ, ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค์— ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ Œ๋”๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋„ค์ดํ‹ฐ๋ธŒ Node.js ๋ชจ๋“ˆ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์œผ๋ฉฐ,
๋ชจ๋“  Node.js ๋ชจ๋“ˆ์€ preload ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ์ปจํ…์ŠคํŠธ ๊ฒฉ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ฐฝ ์ƒ์„ฑ ์‹œ nodeIntegration: true ์˜ต์…˜์„ ํ†ตํ•ด ๋ Œ๋”๋Ÿฌ ํ”„๋กœ์„ธ์Šค์˜ Node.js ํ†ตํ•ฉ์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ, preload ์Šคํฌ๋ฆฝํŠธ์™€ ๋ Œ๋”๋Ÿฌ ํ”„๋กœ์„ธ์Šค์˜ ํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ์€ ๊ฒฉ๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฉฐ,
๋‘˜์€ ์˜ค์ง =contextBridge=์™€ =window.postMessage=๋ฅผ ํ†ตํ•ด์„œ๋งŒ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
=contextIsolation: false=๋ฅผ ํ†ตํ•ด ์ด ๋™์ž‘์„ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
=contextBirdge.exposeInMainWorld=๋Š” preload ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ Œ๋”๋Ÿฌ ํ”„๋กœ์„ธ์Šค์˜ ํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ์— API๋ฅผ ๋…ธ์ถœํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
๋ธŒ๋ฆฟ์ง• ์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค:
๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐํ™” ๊ฐ€๋Šฅํ•œ ํด๋ก  ์œ ํ˜• ์™ธ์—๋„, ํ•จ์ˆ˜, Promise, Error ๋“ฑ์˜ ๊ฐ์ฒด๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์—ฌ์ „ํžˆ ์ผ๋ฐ˜์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑ์‹œํ‚ค์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
๋ธŒ๋ฆฟ์ง•์€ ๋‹ค์Œ ํŠน์„ฑ๋„ ๊ฐ€์ง‘๋‹ˆ๋‹ค:
  • preload์˜ ๊ฒฝ์šฐ, API ๋…ธ์ถœ์€ ์ผํšŒ์„ฑ์ด๋ฏ€๋กœ ๋ฐ˜๋ณตํ•ด์„œ ๋…ธ์ถœํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, API ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ์— ๋™๊ธฐํ™”๋  ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค.
  • ํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ์˜ ๊ฒฝ์šฐ, ์›๊ฒฉ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋Š” native code๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • ๋…ธ์ถœ๋œ ๊ฐ์ฒด๋Š” ๋™๊ฒฐ๋˜๋ฏ€๋กœ, ํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ๋Š” API๋ฅผ ์“ธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ง€์›๋˜์ง€ ์•Š๋Š” ์œ ํ˜•์˜ ๊ฒฝ์šฐ, =undefined=/๊ฐ์ฒด ์†์„ฑ ๋ณต์‚ฌ/์˜ค๋ฅ˜ ๋ฐœ์ƒ์ด๋ผ๋Š” ์„ธ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
renderer ํ”„๋กœ์„ธ์Šค๋Š” ipcRenderer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ main ํ”„๋กœ์„ธ์Šค์— ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ipc๋Š” ๋‘ ๊ฐ€์ง€ ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:
  • send: ipcMain์— ๋ฉ”์‹œ์ง€๋งŒ ์ „์†ก
  • invoke: request-reply ๋ชจ๋“œ
์ปจํ…์ŠคํŠธ ๊ฒฉ๋ฆฌ ๋•Œ๋ฌธ์— renderer ํ”„๋กœ์„ธ์Šค์—์„œ =ipcRenderer.send/invoke=๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ๋ถˆํŽธํ•ฉ๋‹ˆ๋‹ค.
main ํ”„๋กœ์„ธ์Šค๋Š” renderer ํ”„๋กœ์„ธ์Šค์— ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋จผ์ € renderer ํ”„๋กœ์„ธ์Šค์˜ WebContents ๊ฐ์ฒด๋ฅผ ์–ป์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
WebContents ๊ฐ์ฒด๋ฅผ ์–ป๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
  • renderer๊ฐ€ ๋จผ์ € main์— ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด, main์ด ๋ฐ›๋Š” =event.sender=๊ฐ€ WebContents ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
  • main์ด ์ฐฝ ์ƒ์„ฑ ์‹œ BrowserWindow๋ฅผ ๋ณด๊ด€ํ•œ ๋‹ค์Œ =BrowserWindow.webContents=๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์ปจํ…์ŠคํŠธ ๊ฒฉ๋ฆฌ ๋•Œ๋ฌธ์— renderer ํ”„๋กœ์„ธ์Šค์—์„œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ๋ถˆํŽธํ•ฉ๋‹ˆ๋‹ค.
ํ‘œ์ค€ MessagePort ์ธํ„ฐํŽ˜์ด์Šค.
https://www.electronjs.org/docs/latest/tutorial/message-ports
main๊ณผ renderer, renderer์™€ renderer ๊ฐ„ ํ†ต์‹ ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
main๊ณผ renderer๋Š” ipcMain๊ณผ ipcRenderer๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ,
์ด ํ†ต์‹  ๋ฐฉ์‹์€ ์ฃผ๋กœ renderer์™€ renderer ๊ฐ„ ํ†ต์‹ ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
ํ†ต์‹ ์„ ์„ค์ •ํ•˜๊ธฐ ์ „์— ๋จผ์ € ipcMain๊ณผ ipcRenderer๋ฅผ ํ†ตํ•ด MessagePort ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด IPC๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด HTTP ๋ฐ WebSocket.
Electron์—์„œ Main๊ณผ Renderer(Web ์ปจํ…์ŠคํŠธ) ๊ฐ„ ํ†ต์‹ ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ๋ฒˆ๊ฑฐ๋กญ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•  ๋•Œ,
๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ ๊ธฐ๋ฐ˜์„ IPC๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์žก์„ฑ์„ ์ค„์ด๋Š” ๊ฒƒ๋„ ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
  • IPC ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋™์ผ ๋„คํŠธ์›Œํฌ์˜ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์— ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • ์„ฑ๋Šฅ์ด ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋ณด๋‹ค ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.
ABI๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— Electron์€ Node.js์˜ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์„ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ๋ชจ๋“ˆ์€ Electron ์ „์šฉ์œผ๋กœ ์ปดํŒŒ์ผ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
https://www.electronjs.org/docs/latest/tutorial/devtools-extension
Electron์€ Chrome ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ API๋ฅผ ์ œํ•œ์ ์œผ๋กœ ์ง€์›ํ•˜๋ฉฐ, ์ผ๋ถ€ ๊ฐœ๋ฐœ ๋„๊ตฌ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Windows ๋ฐ macOS์—์„œ Electron ์ž์ฒด API๋Š” ์‹œ์ž‘ ์‹œ ์ž๋™ ์‹คํ–‰ ์„ค์ •์„ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
https://www.electronjs.org/docs/latest/api/app#appsetloginitemsettingssettings-macos-windows
๊ทธ๋Ÿฌ๋‚˜ ๊ด€๋ จ ๊ธฐ๋Šฅ์˜ ๊ตฌํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋น„๊ทน์ ์ธ ๋ฒ„๊ทธ๋กœ ๊ฐ€๋“ํ•ฉ๋‹ˆ๋‹ค:
  • https://github.com/electron/electron/issues/32657
  • https://github.com/electron/electron/issues/33308
์ด ๊ตฌํ˜„์€ ์‚ฌ์šฉ์ž ์ •์˜ args๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์„ค์ • ํ•ญ๋ชฉ์„ JSON ํŒŒ์ผ๋กœ ์˜์†ํ™”ํ•˜๋Š” ๋ฐ ํŠนํ™”๋œ ์†”๋ฃจ์…˜.
๋‚ด๋ถ€์ ์œผ๋กœ ๋™์ผ ์ €์ž์˜ conf ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ฉฐ, JSON Schema ๋ฐ package.json ๊ธฐ๋ฐ˜ ๋ฒ„์ „ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
๋ฉ”๋ชจ๋ฆฌ์—์„œ ์‹คํ–‰๋˜๋Š” ๋ฌธ์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ, ์ฃผ๊ธฐ์ ์œผ๋กœ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์˜์†ํ™”๋ฉ๋‹ˆ๋‹ค.
๊ฐœ๋ฐœ์ด ํ™œ๋ฐœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ˆœ์ˆ˜ JavaScript ๋ชจ๋“ˆ๋กœ, JSON์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๋ณธ์งˆ์ ์œผ๋กœ JSON์„ ์ฝ๊ณ  ์“ฐ๋Š” ํด๋ž˜์Šค์ผ ๋ฟ์ด๋ฉฐ, ํŠน๋ณ„ํ•œ ์ ์€ ์—†์Šต๋‹ˆ๋‹ค.
์ž‘์„ฑ์ž๊ฐ€ ์œ ์ง€ ๋ณด์ˆ˜๋ฅผ ์ค‘๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.
RxJS์™€ PouchDB๋ฅผ ๊ฒฐํ•ฉํ•œ ๊ณ ๊ธ‰ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค.
PouchDB ์ƒํƒœ๊ณ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, Electron์„ ๊ณต์‹์ ์œผ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
๋‹ค์šด๋กœ๋“œ ์ˆ˜์™€ Github Stars ์ˆ˜๊ฐ€ ๋น„๋ก€ํ•˜์ง€ ์•Š๋Š” ์ „ํ˜•์ ์ธ ์‚ฌ๋ก€๋กœ, ์‹ค์ œ ์‚ฌ์šฉ์ž ์ˆ˜๋Š” ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ž‘์„ฑ์ž๊ฐ€ ์ด ํ”„๋กœ์ ํŠธ์— ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์˜€์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์ด ํ”„๋กœ์ ํŠธ๋Š” ์‹ ๊ทœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์—ฌ์ „ํžˆ ๊ฐ€ํŒŒ๋ฅธ ํ•™์Šต ๊ณก์„ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์ด ํ”„๋กœ์ ํŠธ๋Š” ๋˜ํ•œ ์ž‘์„ฑ์ž๊ฐ€ ์ œ์–ดํ•  ์ˆ˜ ์—†๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ํŒจํ‚ค์ง€์— ์˜์กดํ•˜์—ฌ ๋งค์šฐ ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค:
  • RxJS
  • PouchDB
  • pouchdb-find(RxCollection์˜ find ๋ฉ”์„œ๋“œ๋Š” ์ด ํŒจํ‚ค์ง€๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋™์ผํ•œ ๊ฒฐํ•จ์„ ๊ณต์œ )
  • mquery(์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•จ)
v10 ๋ฒ„์ „๋ถ€ํ„ฐ RxDB๋Š” PouchDB์—์„œ ๋ฒ—์–ด๋‚  ์ค€๋น„๋ฅผ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ”„๋กœ์ ํŠธ์˜ ์ธ๊ธฐ๋„, ์œ ์ง€ ๋ณด์ˆ˜์„ฑ, ์ข…์†์„ฑ์˜ ์‹ ๋ขฐ์„ฑ ์ธก๋ฉด์—์„œ RxDB๋Š” ์‚ฌ์šฉํ•  ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
Node.js์—์„œ PouchDB๋Š” levelup ๋ชจ๋“ˆ์„ ํ†ตํ•ด LevelDB๋ฅผ ์ €์žฅ์†Œ ํ•˜์œ„ ๊ณ„์ธต์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
levelup ๋ชจ๋“ˆ์˜ ํ•˜์œ„ ๊ณ„์ธต์€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์ด์ง€๋งŒ, Electron์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜๋ฏ€๋กœ electron-rebuild๋กœ ์ฒ˜๋ฆฌํ•  ํ•„์š” ์—†์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
PouchDB๋Š” ๋‹ค์ค‘ ํ”„๋กœ์„ธ์Šค ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ, ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜ ์ตœ์ ํ™” ๊ธฐ๋Šฅ์ด ์žˆ๊ณ , Node.js ํ•˜์œ„ ๊ณ„์ธต LevelDB๋„ ๋‹ค์ค‘ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ Electron์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” Main ํ”„๋กœ์„ธ์Šค์—์„œ๋งŒ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ , IPC๋ฅผ ํ†ตํ•ด Renderer์— ๋…ธ์ถœํ•˜์—ฌ ์ ‘๊ทผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
pouchdb-find๋Š” Mongo ์Šคํƒ€์ผ ์ฟผ๋ฆฌ ๊ตฌ๋ฌธ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๊ณต์‹ ํ™•์žฅ์ž…๋‹ˆ๋‹ค.
์ด ํŒจํ‚ค์ง€์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (์ œํ•œ์ ์ด์ง€ ์•Š์Œ):
  • ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์˜คํžˆ๋ ค ์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์–ป์ง€ ๋ชปํ•จ:
    https://github.com/pouchdb/pouchdb/issues/7810
    ๊ด€๋ จ ์ด์Šˆ๋Š” ๋‹ซํ˜”์ง€๋งŒ, ์ €๋Š” v7.2.2 ํŒจํ‚ค์ง€์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๊ฒฝํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์„ ํƒ๊ธฐ ๋ˆ„๋ฝ:
    https://github.com/pouchdb/pouchdb/issues/6572
    https://github.com/pouchdb/pouchdb/issues/6371
์ด ํŒจํ‚ค์ง€์— ์˜์กดํ•œ ์ฟผ๋ฆฌ๋Š” ๋ถ„๋ช…ํžˆ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
Mongo ์ง€์› ์—†์ด๋Š” PouchDB๋Š” ์‚ฌ์šฉํ•  ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
์ด์ „ ๋ฒ„์ „์€ 2020๋…„์— ์ถœ์‹œ๋˜์—ˆ์œผ๋ฉฐ, ๊ทธ๋™์•ˆ ๋ฒ„๊ทธ๊ฐ€ ์ˆ˜์ •๋˜์ง€ ์•Š์•˜๊ณ , ๋งŽ์€ ์ค‘์š”ํ•œ ๋ฒ„๊ทธ ์ด์Šˆ๊ฐ€ ์œ ์ง€ ๋ณด์ˆ˜์ž์— ์˜ํ•ด ๋ฌด์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ ์œ ํ˜• ์ •์˜ =@types/pouchdb=๋„ ๊ตฌํ˜•์ž…๋‹ˆ๋‹ค (PouchDB v6.4์— ๋งž์ถค).
RxDB์˜ ์ž‘์„ฑ์ž๋„ RxDB v10 ์ถœ์‹œ ๋…ธํŠธ์—์„œ PouchDB๊ฐ€ ์ œ๋Œ€๋กœ ์œ ์ง€ ๋ณด์ˆ˜๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/pouchdb/pouchdb/issues/3224
Node-API(N-API)๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์ธ better-sqlite3๋Š”
electron-rebuild๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ข…์†์„ฑ ์ž ๊ธˆ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ Ghost ํŒ€์ด ์œ ์ง€ ๋ณด์ˆ˜ํ•˜๋Š” SQLite3 ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.
์ด ๋ชจ๋“ˆ์€ v5 ๋ฒ„์ „๋ถ€ํ„ฐ Node-API ๊ธฐ๋ฐ˜์œผ๋กœ ์žฌ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ฝœ๋ฐฑ ์ธํ„ฐํŽ˜์ด์Šค๋Š” this๋ฅผ ์„ค์ •ํ•˜์—ฌ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
Promise ๋ž˜ํ•‘์„ ์–ป์œผ๋ ค๋ฉด ์„œ๋“œํŒŒํ‹ฐ ๋ž˜ํผ node-sqlite๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ฐ Database ์ธ์Šคํ„ด์Šค๋Š” ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ์ผ ๋ฟ์ด๋ฉฐ, ๊ฒฝ์Ÿ ์กฐ๊ฑด์€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘๋˜๋Š” ๋™์•ˆ ์ธ์Šคํ„ด์Šค์—์„œ ์‹คํ–‰๋˜๋Š” ๋ชจ๋“  ๋ฌธ์€ ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์˜ ์ผ๋ถ€๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ํ•ญ์ƒ ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋ฉฐ, ์ธ์Šคํ„ด์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ’€์„ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์†”๋ฃจ์…˜์ด ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ VSCode์—์„œ ์‚ฌ์šฉํ•˜๋Š” SQLite3 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, sqlite3์˜ ํฌํฌ์ž…๋‹ˆ๋‹ค.
https://www.electronjs.org/docs/latest/tutorial/application-distribution
๋ณธ์งˆ์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ๋Š” ํŠน์ • ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋งŒ์กฑํ•˜๋Š” ์‚ฌ์ „ ๋นŒ๋“œ๋œ Electron ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒจํ‚ค์ง€๋ฅผ ๋ฐฐํฌํ•จ์œผ๋กœ์จ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, Windows์—์„œ ์ˆ˜๋™ ๋ฐฐํฌ ๋ฐฉ๋ฒ•์€ ํ•ด๋‹น ๋ฒ„์ „, ํ•ด๋‹น ํ”Œ๋žซํผ์˜ ์‚ฌ์ „ ๋นŒ๋“œ๋œ Electron ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ ,
Electron ๋””๋ ‰ํ„ฐ๋ฆฌ์— resources/app ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ ์ „์ฒด ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์„ ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ ํ›„, ์ผ๋ฐ˜์ ์œผ๋กœ Electron ์‹คํ–‰ ํŒŒ์ผ์˜ ์ด๋ฆ„ ๋ณ€๊ฒฝ ๋ฐ ์•„์ด์ฝ˜ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๊ณต์‹ electron-packager ํŒจํ‚ค์ง€๋Š” ์œ„ ๋‹จ๊ณ„๋ฅผ ๊ฐ„์†Œํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Electron ์ „์šฉ์˜ tar์™€ ์œ ์‚ฌํ•œ ํŒŒ์ผ ํ˜•์‹์œผ๋กœ, Electron ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹จ์ผ ํŒŒ์ผ๋กœ ํŒจํ‚ค์ง•ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
resources/app.asar ํŒŒ์ผ์€ resources/app ํด๋”๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ผ๋ถ€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์€ asar ํŒŒ์ผ๋กœ ํŒจํ‚ค์ง•๋œ ํ›„ ์ด ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
asar ํŒจํ‚ค์ง•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, Electron์€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฐพ๊ณ  ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
~--asar.unpack=*.{node,dll}~๋ฅผ electron-packager์˜ --asar ๋Œ€์‹  ์‚ฌ์šฉํ•˜๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฐธ๊ณ :
  • https://github.com/electron/packager/issues/424
  • https://github.com/electron/asar/issues/75
=app.isPackaged=๋Š” Electron ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์— ์žˆ๋Š”์ง€ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— ์žˆ๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ๋ฐ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ด ํŒ๋‹จ ๋ฐฉ์‹์€ ๋‹ค์†Œ ์ง๊ด€์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Electron ์‹คํ–‰ ํŒŒ์ผ์˜ ํŒŒ์ผ ์ด๋ฆ„์ด ์—ฌ์ „ํžˆ electron์ธ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
์ด ํŒจํ‚ค์ง€๋Š” ๊ฐ ํ”Œ๋žซํผ์šฉ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ์„ฑ์„ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์‹คํ–‰ ํŒŒ์ผ ์•„์ด์ฝ˜ ์„ค์ •์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • devDependencies๋ฅผ ์‚ญ์ œํ•˜์—ฌ ํŒจํ‚ค์ง€ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
electron-packager๋Š” ignore ํŒŒ์ผ์— ๋”ฐ๋ผ ํŒจํ‚ค์ง• ๊ฒฝ๋กœ๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ํ•œ๋•Œ .electronignore ํŒŒ์ผ์— ๋Œ€ํ•œ PR์ด ์žˆ์—ˆ์ง€๋งŒ ๊ฑฐ๋ถ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค
(๊ฑฐ๋ถ€ ์ด์œ ๋Š” ๋…ผ๋ฆฌ์™€ ์‚ฌ์‹ค์  ๊ทผ๊ฑฐ๊ฐ€ ๋ถ€์กฑํ–ˆ์Šต๋‹ˆ๋‹ค).
์ด ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•˜๋ฉด electron-packager๋Š” ์“ธ๋ชจ์—†๋Š” ํŒจํ‚ค์ง€๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ช…๋ น์ค„์— ignore ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋งŽ์ด ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ํ•œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๋„ ํ•จ๊ป˜ ํŒจํ‚ค์ง•๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
์ด ํ”„๋กœ์ ํŠธ๋Š” --all ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•  ๋•Œ I/O ๋ฐ CPU ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์ด ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์— ํ•„์š”ํ•œ ์ˆ˜์ค€๋ณด๋‹ค ํ›จ์”ฌ ๋†’์Šต๋‹ˆ๋‹ค.
์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•œ ๊ฒฐ๊ณผ, ์ด ํ”„๋กœ๊ทธ๋žจ์€ ๋ชจ๋“  ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, Electron v28์—์„œ๋Š” ๋™์‹œ์— 10๊ฐœ์˜ Electron์„ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์„œ๋ฒ„ ๋Œ€์—ญํญ๊ณผ ๋‹ค์šด๋กœ๋“œ ์ธก์˜ ๋Œ€์—ญํญ์„ ๊ณ ๋ คํ•  ๋•Œ, ์ด๋Ÿฌํ•œ ๋ฌด๋ถ„๋ณ„ํ•œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋Š” ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ํ™•๋ฅ ๋งŒ ๋†’์ž…๋‹ˆ๋‹ค.
Windows ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ์˜ ์˜คํ”ˆ ์†Œ์Šค ์†”๋ฃจ์…˜.
electron-builder์— ์˜ํ•ด ์ง€์›๋ฉ๋‹ˆ๋‹ค.
์ปค๋ฎค๋‹ˆํ‹ฐ ํŒจํ‚ค์ง€ electron-wix-msi์— ์˜ํ•ด ์ง€์›๋ฉ๋‹ˆ๋‹ค.
Windows 8๋ถ€ํ„ฐ ์ง€์›๋˜๋Š” UWP ํ˜•์‹์œผ๋กœ, Microsoft Store์— ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
electron-builder๋Š” MakeAppx ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ appx๋กœ ํŒจํ‚ค์ง•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Microsoft๊ฐ€ 2018๋…„๋ถ€ํ„ฐ ์ง€์›ํ•˜๋Š” ์ฃผ์š” ํ˜•์‹์œผ๋กœ, MSI๋ฅผ ๋Œ€์ฒดํ•˜๊ณ  Windows 10 ์ด์ƒ ์‹œ์Šคํ…œ์— ์‚ฌ์šฉ๋˜๋ฉฐ, Microsoft Store์— ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Electron ์ปค๋ฎค๋‹ˆํ‹ฐ์—๋Š” ์•„์ง MSIX ํŒจํ‚ค์ง• ์†”๋ฃจ์…˜์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํŒจํ‚ค์ง• ์†”๋ฃจ์…˜ ์ œ๊ณต์—…์ฒด Advanced Installer๋Š” Electron ํ”„๋กœ์ ํŠธ๋ฅผ MSIX๋กœ ํŒจํ‚ค์ง•ํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • Microsoft ๊ณต์‹ ์ œ๊ณต MSIX Packaging Tool์€ EXE ๋˜๋Š” MSI ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ์„ MSIX๋กœ ๋‹ค์‹œ ํŒจํ‚ค์ง•ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:
    https://docs.microsoft.com/en-us/windows/msix/packaging-tool/create-app-package
Electron์—๋Š” ChromeDriver ๊ธฐ๋ฐ˜์˜ ๊ณต์‹์ ์œผ๋กœ ์œ ์ง€ ๋ณด์ˆ˜๋˜๋Š” ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Spectron์ด ์žˆ์—ˆ์ง€๋งŒ, ์œ ์ง€ ๋ณด์ˆ˜์ž ๋ถ€์กฑ์œผ๋กœ 2022๋…„ ์ดˆ์— ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
Spectron์˜ ์ž ์žฌ์ ์ธ ๋Œ€์ฒด ์†”๋ฃจ์…˜์€ Playwright์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ Playwright v1.16 ํ˜„์žฌ, Playwright ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ๋Š” ์—ฌ์ „ํžˆ ์‹คํ—˜์ ์ธ ๊ธฐ๋Šฅ์ด๋ฉฐ ๋Œ€๋ถ€๋ถ„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค:
  • ์˜ค๋ฅ˜๋ฅผ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • evaluate๋Š” Node.js ๋ชจ๋“ˆ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ฐฝ ์˜ค๋ฒ„๋ ˆ์ด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ.
Electron ํ”„๋กœ๊ทธ๋žจ์˜ ํ†ตํ•ฉ ๊ฐœ๋ฐœ ๋ฐ ํŒจํ‚ค์ง•.
Electron ํ”„๋กœ๊ทธ๋žจ์˜ ํ†ตํ•ฉ ํŒจํ‚ค์ง• ๋ฐ ๋ฐฐํฌ.
๋ฌธ์„œ๊ฐ€ ๋น„๊ทน์ ์ผ ์ •๋„๋กœ ์ผ๊ด€์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.
Electron์€ Node.js์™€ ๋‹ค๋ฅธ ๋ฒ„์ „์˜ ABI๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, npm๊ณผ yarn์ด ํ˜„์žฌ Node.js ๋ฒ„์ „์„ ๋Œ€์ƒ์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์„ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
electron-rebuild๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
์œ ์ง€ ๋ณด์ˆ˜์„ฑ ์ธก๋ฉด์—์„œ electron-rebuild๊ฐ€ ํ•„์š”ํ•œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • electron-rebuild๋Š” ์˜ฌ๋ฐ”๋ฅธ ABI ๋ฒ„์ „์„ ์„ ํƒํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, electron-rebuild์— ์˜์กดํ•˜๋Š” ๋ชจ๋“ˆ์€ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ธฐ ์–ด๋ ค์šด ์ข…์†์„ฑ์œผ๋กœ ๋ฐœ์ „ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    https://github.com/electron/electron-rebuild/issues/886
  • ๊ณต์‹ ์ €์žฅ์†Œ์— ์†ํ•˜์ง€๋งŒ, electron-rebuild๋Š” ์ข…์ข… Electron์˜ ์ตœ์‹  ๋ฒ„์ „์„ ๋”ฐ๋ผ๊ฐ€์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.