๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • What would life be If we had no courage to attemp anything?
Development/Electron

[Electron]Electron

by DevIseo 2023. 1. 11.

Electron ์ด๋ž€?

 ๐Ÿ’ก - JavaScript, HTML ๋ฐ CSS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์Šคํฌํƒ‘ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ

  • Chromium ๊ณผ Node.js ๋ฅผ ๋ฐ”์ด๋„ˆ๋ฆฌ์— ๋‚ด์žฅ
  • Electron์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•˜๋‚˜์˜ JavaScript ์ฝ”๋“œ ๋ฒ ์ด์Šค๋ฅผ ์œ ์ง€ํ•˜๊ณ 
  • Windows, macOS ๋ฐ Linux์—์„œ ์ž‘๋™ํ•˜๋Š” ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์•ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ

 

ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ

๐Ÿ’ก ํ”„๋ก ํŠธ์—”๋“œ : ํฌ๋กœ๋ฏธ์›€ ๋ฐฑ์—”๋“œ : ๋…ธ๋“œJS ํฌ๋กœ๋ฏธ์›€ ๋ Œ๋”๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋…ธ๋“œJS์™€ ๊ฒฐํ•ฉ - V8์„ ๊ณต์œ 

 

โ–ณ์˜คํ”ˆ์†Œ์Šค ์›น๋ธŒ๋ผ์šฐ์ € ํฌ๋กœ๋ฏธ์›€(Chromium)

โ–ณ๋ธŒ๋ผ์šฐ์ € ๋ฐ–์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์ธ ๋…ธ๋“œJS

โ–ณ์˜คํ”ˆ์†Œ์Šค ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ V8

ํ™œ์šฉ ์‚ฌ๋ก€

  • Atom Editor
  • VScode
  • Slack

์žฅ์ 

  1. ๋‚ฎ์€ ์ง„์ž… ์žฅ๋ฒฝ
    • JavaScript ์›น ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์ด๋‚˜ ์–ธ์–ด๋ฅผ ๋ฐฐ์šธ ํ•„์š” x
  2. ๊ฐœ๋ฐœ ์†๋„ ํ–ฅ์ƒ
    • JavaScript๋Š” ํ•œ ์ค„์”ฉ ํ•ด์„ํ•˜๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์„ ์‚ฌ์šฉ
    • ๊ฐœ๋ฐœ์ž๊ฐ€ ์†์‰ฝ๊ฒŒ ๋””๋ฒ„๊น… ํ›„ ์ตœ์ ํ™” ๊ฐ€๋Šฅ → ๋น ๋ฅธ ๊ตฌํ˜„
    • ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง, ๋””์ž์ธ ๋ฐ ๊ตฌ์กฐ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์— ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„๊ณผ ๋น„์šฉ์ด ์ค„์–ด๋“ฆ
  3. ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์ง€์›
    • OS์— ๋Œ€ํ•œ ๋นŒ๋“œ๋ฅผ ์ง€์›ํ•˜๊ณ  ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Œ
    • ๋ธŒ๋ผ์šฐ์ € ๋ฒ„์ „๋ณ„๋กœ ๊ธฐ๋Šฅ์„ ์ œ์•ฝํ•˜๊ฑฐ๋‚˜ ํƒ€๊ฒŸ ํ”Œ๋ ›ํผ์— ๋”ฐ๋ผ ๋ณ„๋„์˜ ๋ฒ„์ „์„ ใ…‡์ฅฌใ…ฃํ•  ํ•„์š” ์—†์Œ
  4. ํ’๋ถ€ํ•œ OS ๋„ค์ดํ‹ฐ๋ธŒ API๋ฅผ ๊ฐ€์ง„ ๋Ÿฐํƒ€์ž„ ์ œ๊ณต
  5. ์จ๋“œํŒŒํ‹ฐ ์ง€์›
    • ๋…ธ๋“œJS์˜ ๋ชจ๋“  ๋นŒํŠธ์ธ ๋ชจ๋“ˆ๊ณผ ์จ๋“œํŒŒํ‹ฐ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • npm ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋“ฑ๋ก๋œ ๋Œ€๋ถ€๋ถ„์˜ ๋ชจ๋“ˆ๋„ ์ด์šฉ ๊ฐ€๋Šฅ
    • ๋…ธ๋“œJS๋ฅผ ํ†ตํ•ด ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์ ‘๊ทผํ•˜๊ณ  ๋„คํŠธ์›Œํฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ์•ฝ ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  6. ๋…ธ๋“œ ์ ‘๊ทผ ๊ถŒํ•œ ๊ด€๋ฆฌ
    • ์›น๋ทฐ์—์„œ ๋…ธ๋“œJS์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๊ณ ๋‚˜๋ฆฌ ํ•  ์ˆ˜ ์žˆ์Œ
    • ์›น๋ทฐ ํŽ˜์ด์ง€ ๋‚ด์—์„œ Require์ด๋‚˜ Process์™€ ๊ฐ™์€ ๋…ธ๋“œJS API๋ฅผ ์ง์ ‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • ๋‹ค๋งŒ, ๋…ธ๋“œJS ๋ชจ๋“ˆ ์ž์ฒด๊ฐ€ ์•ˆ์ „ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์–ด์„œ ๋ณด์•ˆ์— ์œ ์˜
  7. ๋นŒ๋“œ ํˆด๊ณผ ์ธ์Šคํ†จ๋Ÿฌ ์ œ๊ณต
    • ๋นŒ๋“œ ํˆด์„ ์ œ๊ณตํ•˜์—ฌ ์ผ๋ ‰ํŠธ๋ก  ๋ฐ์Šคํฌํ†ฑ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์†์‰ฝ๊ฒŒ ํŒจํ‚ค์ง•ํ•  ์ˆ˜ ์žˆ์Œ
    • autoUpdater ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์ด์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž๋™ ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๋‹จ์ 

  1. ํฐ ์„ค์น˜ ํŒŒ์ผ ์šฉ๋Ÿ‰
    • ํฌ๋กœ๋ฏธ์›€๊ณผ ๋…ธ๋“œJS๊ฐ€ ํฌํ•จ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ ‰ํŠธ๋ก ์œผ๋กœ ๊ฐœ๋ฐœํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ธฐ๋ณธ 100MB ์ด์ƒ ( ์ดˆ๊ธฐ ์„ค์น˜ ํŒŒ์ผ ์šฉ๋Ÿ‰์ด ํผ)
  2. ์ƒ๋Œ€์ ์œผ๋กœ ๋Š๋ฆฐ ์†๋„
    • ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค, RAM์„ ๋งŽ์ด ์ฐจ์ง€
    • ์˜ค๋ž˜๋œ ์ปดํ“จํ„ฐ์—์„œ UI๊ฐ€ ์•ฝ๊ฐ„ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ์Œ
    • ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์„ ์œ„ํ•œ ์ผ๋ ‰ํŠธ๋ก ์€ ํšจ์œจ์„ฑ์ด ๋‹ค์†Œ ๋–จ์–ด์ง
  3. ๋ณด์•ˆ์€ ๊ฐœ๋ฐœ์ž์˜ ์ฑ…์ž„
    • ๋…ธ๋“œJS ํ†ตํ•ฉ์œผ๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋” ํฐ ๊ถŒํ•œ์„ ๊ฐ–๊ฒŒ๋จ
    • ๋”ฐ๋ผ์„œ, ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ž„์˜์˜ ์ฝ˜ํ…์ธ ๋ฅผ ํ‘œ์‹œํ•˜๋ฉด ๋…ธ๋“œJS ๋ชจ๋“ˆ ์ž์ฒด๊ฐ€ ์•ˆ์ „ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ
  4. ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋นŒ๋“œ
    • ์ผ๋ ‰ํŠธ๋ก ์€ ํฌ๋กœ์Šค ํ”Œ๋žซํผ์„ ์ง€์šฐ๋„ˆ
    • ํ•˜๋‚˜์˜ ํ”Œ๋žซํผ์—์„œ ๋ชจ๋“  ํ”Œ๋žซํผ์šฉ ๋ฐ์Šคํฌํ†ฑ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•  ์ˆ˜ ์—†์Œ
    • ๋ฐ์Šคํฌํ†ฑ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ธฐ๋ณธOS์— ๋Œ€ํ•œ ์ข…์†์„ฑ ๊ฐ€์งˆ ๊ฒฝ์šฐ → ํ•ด๋‹น ํ”Œ๋žซํผ์—์„œ๋งŒ ์ปดํŒŒ์ผ ๊ฐ€๋Šฅ
      • ex) ๋งฅ OS ์ฝ”๋“œ ์„œ๋ช…์€ ๋งฅ OS์—์„œ๋งŒ ๊ฐ€๋Šฅ

Electron ์‹œ์ž‘ํ•˜๊ธฐ

  • Electron์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ•„์ˆ˜์ ์œผ๋กœ Node.js๋ฅผ ์„ค์น˜ํ•ด์•ผํ•จ
  • ๊ฐ€๋Šฅํ•œ LTS ์ตœ์‹  ๋ฒ„์ „์„ ์ด์šฉํ•  ๊ฒƒ์„ ๊ถŒ๊ณ 
node -v
npm -v

Scaffold Project

mkdir my-electron-app && cd my-electron-app
# ํŒจํ‚ค์ง€ ์ดˆ๊ธฐํ™”
npm init

 

 

# ์˜์กด์„ฑ ์ถ”๊ฐ€
npm install --save-dev electron
  • package.json ์ถ”๊ฐ€
{
  "scripts": {
    "start": "electron ."
  }
}

 

 

# ์‹คํ–‰
npm start

Electron ๋™์ž‘ ์›๋ฆฌ

์ถœ์ฒ˜ : ์นด์นด์˜ค ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ https://tech.kakao.com/2021/08/17/frontend-growth-11/

๐Ÿ’ก Electron์€ 2๊ฐ€์ง€ ํ”„๋กœ์„ธ์Šค ์กด์žฌ

  • ๋ฉ”์ธ(Main) ํ”„๋กœ์„ธ์Šค์™€ ๋ Œ๋”๋Ÿฌ(Renderer) ํ”„๋กœ์„ธ์Šค Electron ์•ฑ์€ ๋‹จ ํ•˜๋‚˜์˜ ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ€์ง

 

  • ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค์™€ ๋ Œ๋”๋Ÿฌ ํ”„๋กœ์„ธ์Šค ๊ฐ„์— ํ†ต์‹ ์ด ์ด๋ค„์ ธ์•ผํ•จ
  • ์ผ๋ ‰ํŠธ๋ก ์—์„œ๋Š” ์ด๋ฅผ ipcMain๊ณผ ipcRenderer์™€ ๊ฐ™์€ IPC ๋ชจ๋“ˆ์„ ํ†ตํ•ด ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ํ†ต์‹ ์„ ์ด๋ฃธ

๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค

  • Node.js๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘
  • ๋ Œ๋”๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ด€๋ฆฌ

๋ Œ๋”๋Ÿฌ ํ”„๋กœ์„ธ์Šค

  • ์„œ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘

Electron ์‚ฌ์šฉ

๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ

  • main.js - ๋ฉ”์ธ ํ™”๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
const { app, BrowserWindow } = require('electron');
const path = require('path');

//์ฐฝ์„ ์ •์˜
/* webPreferneces
ํŽ˜์ด์ง€๊ฐ€ ํ‘œ์‹œ ๋˜๊ธฐ ์ „ ์‹คํ–‰ํ•  ์ „์ฒ˜๋ฆฌ ์ฝ”๋“œ ์ง€์ •. 
์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฐ˜๋“œ์‹œ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ์ „๋‹ฌ๋˜์•ผ ํ•จ.
*/
/*
win.loadFile => ์ฐฝ์—์„œ ๋ถˆ๋Ÿฌ๋“ค์ผ HTML ๋ฌธ์„œ ์ง€์ • 
*/
const createWindow = () => {
		//create the browser window!
    const win = new BrowserWindow({
        width: 640,
        height: 480,
        webPreferences: { preload: path.join(__dirname, 'preload.js') }
    });
 
    win.loadFile('index.html');
};

// Application์ด ์ค€๋น„๋œ ํ›„ ์‹คํ–‰ํ•  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง€์ •
app.whenReady().then(() => {
    createWindow();
 
    app.on('activate', () => {
        if (BrowserWindow.getAllWindows().length === 0) createWindow();
    });
});
 
app.on('window-all-closed', () => {
    if (process.platform !== 'darwin') app.quit();
});
  • preload.js - ์‚ฌ์ „์— ๋กœ๋“œ ๋˜์–ด์•ผ ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
//์ „์ฒ˜๋ฆฌ ์ฝ”๋“œ๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์ด๊ธฐ ์œ„ํ•œ ์˜ˆ์ œ
window.addEventListener('DOMContentLoaded', () => {
    const replaceText = (selector, text) => {
        const element = document.getElementById(selector)
        if (element) element.innerText = text
    }
 
    for (const type of ['chrome', 'node', 'electron']) {
        replaceText(`${type}-version`, process.versions[type]);
    }
});
  • index.html - ๋ฉ”์ธ ํ™”๋ฉด
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
    <title>Hello World!</title>
  </head>
  <body>
    <h1>Hello World!</h1>
    We are using Node.js <span id="node-version"></span>,
    Chromium <span id="chrome-version"></span>,
    and Electron <span id="electron-version"></span>.
  </body>
</html>

 

Referenece

https://jetalog.net/104

https://cypsw.tistory.com/56

https://www.samsungsds.com/kr/insights/1239178_4627.html

'Development > Electron' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Electron] ipcRenderer.invoke & ipcMin.handle  (0) 2023.06.15
[Electron] dialog.showOpenDialog()  (0) 2023.06.15
[Electron] electron ์•„์ด์ฝ˜ ๋„ฃ๊ธฐ  (0) 2023.01.25
[Electron] Electron + React ์—ฐ๋™ํ•˜๊ธฐ  (0) 2023.01.13
[Electron]Electron-forge  (0) 2023.01.12

๋Œ“๊ธ€