๐Ÿ’พ ์„ค์น˜ํŒŒ์ผ... ์ฃผ์„ธ์š”? ๊ทธ๋ž˜์„œ ์ง„์งœ `.exe` ๋งŒ๋“ค๊ณ  ์ž๋™ ์—…๋ฐ์ดํŠธ๊นŒ์ง€ ํ•ด๋ดค์Šต๋‹ˆ๋‹ค

์†ก์—ฐ์ง€ยท2025๋…„ 5์›” 8์ผ
0

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

๋ชฉ๋ก ๋ณด๊ธฐ
25/32

Electron์œผ๋กœ ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ๋„ ์ œ๋ฒ• ์ž˜ ๋Œ์•„๊ฐ€๊ณ , UI๋„ ๋‹ค๋“ฌ์–ด์ง€๊ณ , "์ด์ œ ์ข€ ์™„์„ฑ ๋А๋‚Œ ๋‚œ๋‹ค" ์‹ถ์€ ๊ทธ ํƒ€์ด๋ฐ.

๊ทธ๋Ÿฐ๋ฐ์š”.

๋ˆ„๊ตฐ๊ฐ€ ์•„์ฃผ ๊ฐ€๋ณ๊ฒŒ,

์ •๋ง ์•„๋ฌด๋ ‡์ง€๋„ ์•Š๊ฒŒ ๋งํ•˜๋”๊ตฐ์š”.

"์„ค์น˜ํŒŒ์ผ ์ฃผ์„ธ์š”~ ๐Ÿ˜Š"

...

๋จธ๋ฆฟ์†์œผ๋กœ ์ด๋ ‡๊ฒŒ ์™ธ์ณค์Šต๋‹ˆ๋‹ค:

โ€œ๋“œโ€ฆ ๋“œ๋ฆฐ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐโ€ฆ ๊ทธ๊ฑธ ๋‚ด๊ฐ€ ๋งŒ๋“  ์ ์ด ์žˆ์—ˆ๋‚˜โ€ฆ?โ€


๐Ÿคฏ ๋ฐฐํฌ, ๊ทธ ์ด๋ฆ„๋งŒ ๋“ค์–ด๋„

React, Vite, Electron ์กฐํ•ฉ์œผ๋กœ ๋ฐ์Šคํฌํƒ‘ ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๋˜ ์ €๋Š”

๊ธฐ๋Šฅ ๊ตฌํ˜„, UI ๊ตฌ์„ฑ, ์ƒํƒœ ๊ด€๋ฆฌ๊นŒ์ง€ ์ž์‹  ์žˆ์—ˆ์ง€๋งŒ

"์„ค์น˜ ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ",

๊ทธ๊ฑด ๋ญ”๊ฐ€ ๊ฑด๋“ค๋ฉด ์•ˆ ๋  ๊ฒƒ ๊ฐ™์€ ๊ธˆ๋‹จ์˜ ์˜์—ญ์ฒ˜๋Ÿผ ๋А๊ปด์กŒ์Šต๋‹ˆ๋‹ค.

์™ ์ง€ ์ง„์ž…ํ•˜๋ฉด,

  • ๋ญ”๊ฐ€ Windows 98 ๋А๋‚Œ ๋‚˜๋Š” ์ธ์Šคํ†จ ๋งˆ๋ฒ•์‚ฌ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๊ณ 
  • ๋นŒ๋“œํ•˜๋ ค๋ฉด ์ธ์ฆ์„œ๋ถ€ํ„ฐ ๋ฐœ๊ธ‰๋ฐ›์•„์•ผ ํ•  ๊ฒƒ ๊ฐ™๊ณ 
  • ๊น”๊ณ  ๋‚˜๋ฉด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ง€์›Œ์•ผ ํ•  ๊ฒƒ ๊ฐ™๊ณ 

...๊ทธ๋žฌ์Šต๋‹ˆ๋‹ค.

๊ทธ.๋Ÿฐ.๋ฐ.

๋ง‰์ƒ ํ•ด๋ณด๋‹ˆ?

์„ธ์ƒ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์ €๋„ ๋งํ•ฉ๋‹ˆ๋‹ค:

โ€œํ…Œ์ŠคํŠธ์š”? ์„ค์น˜ํŒŒ์ผ ์žˆ์œผ๋‹ˆ ์‹คํ–‰๋งŒ ํ•ด๋ณด์„ธ์š”~ ๐Ÿ˜‰โ€


๐ŸŽฏ ๋ชฉํ‘œ: ์„ค์น˜๋ถ€ํ„ฐ ์—…๋ฐ์ดํŠธ๊นŒ์ง€

์ œ๊ฐ€ ํ•ด๊ฒฐํ•œ ๋ชฉํ‘œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค:

  • Electron ์•ฑ์„ .exe ์„ค์น˜ ํŒŒ์ผ๋กœ ํŒจํ‚ค์ง•
  • ๋”๋ธ”ํด๋ฆญ์œผ๋กœ ์„ค์น˜, ์‹œ์ž‘๋ฉ”๋‰ด/๋ฐ”ํƒ•ํ™”๋ฉด ๋“ฑ๋ก
  • ๋‹ค์Œ ๋ฒ„์ „ ๋ฐฐํฌ ์‹œ ๋ณ„๋„ ์•ˆ๋‚ด ์—†์ด ์ž๋™ ์—…๋ฐ์ดํŠธ ์ ์šฉ
  • ๋ฐฐํฌ ํŒŒ์ผ์„ ์ˆ˜๋™์œผ๋กœ ์˜ฎ๊ธฐ์ง€ ์•Š๊ณ  ์ž๋™์œผ๋กœ ์„œ๋ฒ„์— ์˜ฌ๋ฆฌ๊ธฐ
  • ๋‚ด๋ถ€๋ง์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์„œ๋ฒ„์— ์•ˆ์ „ํ•˜๊ฒŒ ๊ตฌ์„ฑ

๐Ÿ›  ๊ธฐ์ˆ  ์Šคํƒ

ํ•ญ๋ชฉ๋‚ด์šฉ
ํ”„๋ก ํŠธ์—”๋“œReact + Vite
๋ฐ์Šคํฌํƒ‘ ํ†ตํ•ฉElectron + vite-plugin-electron
์ƒํƒœ๊ด€๋ฆฌZustand
๋นŒ๋“œ ๋„๊ตฌelectron-builder
์ž๋™ ์—…๋ฐ์ดํŠธelectron-updater, electron-log
๋ฐฐํฌ ์ž๋™ํ™”Node.js ์Šคํฌ๋ฆฝํŠธ + scp
๋ฐฐํฌ ์„œ๋ฒ„์‚ฌ๋‚ด๋ง HTTP ์„œ๋ฒ„ (ex. http://192.168.x.x:8000/updates/)

๐Ÿงฑ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ (์š”์•ฝ)


project-root/
โ”œโ”€โ”€ src/                    # React ์•ฑ ์ฝ”๋“œ
โ”œโ”€โ”€ electron/
โ”‚   โ”œโ”€โ”€ main.ts            # Electron ์ง„์ž…์ 
โ”‚   โ””โ”€โ”€ preload.ts         # Preload ์Šคํฌ๋ฆฝํŠธ
โ”œโ”€โ”€ dist/                  # Vite ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ
โ”œโ”€โ”€ dist-electron/         # Electron ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ
โ”œโ”€โ”€ release/               # ์„ค์น˜ํŒŒ์ผ ๋ฐ ์ž๋™์—…๋ฐ์ดํŠธ ํŒŒ์ผ
โ”œโ”€โ”€ scripts/deploy.js      # ๋ฐฐํฌ ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ
โ””โ”€โ”€ vite.config.ts

โš ๏ธ ํฐ ํ™”๋ฉด ์ง€์˜ฅ์—์„œ ์‚ด์•„๋‚จ๋Š” ๋ฒ•

Electron์—์„œ ์ž์ฃผ ๊ฒช๋Š” ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ด๊ฒ๋‹ˆ๋‹ค:

๋นŒ๋“œ๋„ ์ž˜ ๋˜๊ณ  .exe๋„ ์ž˜ ์‹คํ–‰๋˜๋Š”๋ฐโ€ฆ

์ฐฝ์ด ๋œจ๊ธด ๋–ด๋Š”๋ฐ ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ๋‚˜์˜ด ๐Ÿ˜ฑ

โœ… ์›์ธ 99%: ๊ฒฝ๋กœ ์„ค์ • ์‹ค์ˆ˜

Electron์€ ๋ธŒ๋ผ์šฐ์ €์ฒ˜๋Ÿผ public ๊ฒฝ๋กœ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ •ํ™•ํ•˜๊ฒŒ ๊ฒฝ๋กœ๋ฅผ ์žก์•„์ฃผ์ง€ ์•Š์œผ๋ฉด ๋กœ๋”ฉ ์‹คํŒจ + ํฐ ํ™”๋ฉด์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๐Ÿงฉ ํ•ด๊ฒฐ๋ฒ•


// main.ts
const startUrl = process.env.NODE_ENV === 'development'
  ? 'http://localhost:3000'
  : url.format({
      pathname: path.join(__dirname, '../../dist/index.html'),
      protocol: 'file:',
      slashes: true
    });

โœ… ์ถ”๊ฐ€: Vite ์„ค์ •๋„ ๊ผญ


// vite.config.ts
export default defineConfig({
  base: './', // ์ด๊ฑฐ ์•ˆ ๋„ฃ์œผ๋ฉด JS, CSS ๋ชป ๋ถˆ๋Ÿฌ์˜ด
})

๐Ÿ”„ ์ž๋™ ์—…๋ฐ์ดํŠธ ๊ตฌํ˜„: ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ์Šต๋‹ˆ๋‹ค

์ž๋™ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด electron-updater์™€ electron-log๋งŒ ์„ค์น˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค:


npm install electron-updater electron-log

ํ•ต์‹ฌ ์ฝ”๋“œ (main.ts)


import { autoUpdater } from 'electron-updater';
import log from 'electron-log';

log.transports.file.level = 'info';
autoUpdater.logger = log;

autoUpdater.checkForUpdatesAndNotify();

autoUpdater.on('update-downloaded', () => {
  autoUpdater.quitAndInstall(); // ์•ฑ ๊บผ์ง€๊ณ  ์žฌ์‹œ์ž‘๋จ
});

package.json ์„ค์ •


"build": {
  "publish": {
    "provider": "generic",
    "url": "http://192.168.0.100:8000/updates/" // ๋‚ด๋ถ€ ์„œ๋ฒ„ ์ฃผ์†Œ
  }
}

์ž๋™์œผ๋กœ latest.yml์„ ๊ธฐ์ค€์œผ๋กœ ์ƒˆ ๋ฒ„์ „์ด ์žˆ์œผ๋ฉด ๋‹ค์šด๋กœ๋“œ + ์žฌ์„ค์น˜๊นŒ์ง€ ํ•ด์ค๋‹ˆ๋‹ค.


๐Ÿ“ฆ ๋ฐฐํฌ ํด๋” ๊ตฌ์„ฑ

๋นŒ๋“œ ์™„๋ฃŒ ํ›„ release/ ํด๋”์—๋Š” ๋‹ค์Œ ํŒŒ์ผ์ด ์ƒ๊น๋‹ˆ๋‹ค:


release/
โ”œโ”€โ”€ MyApp Setup 1.0.0.exe     โ† ์„ค์น˜์šฉ
โ”œโ”€โ”€ MyApp-1.0.0.exe           โ† ์ž๋™ ์—…๋ฐ์ดํŠธ์šฉ
โ”œโ”€โ”€ latest.yml                โ† ์—…๋ฐ์ดํŠธ ๋ฉ”ํƒ€ ์ •๋ณด

์ด ์„ธ ํŒŒ์ผ์„ ์„œ๋ฒ„์— ์˜ฌ๋ ค๋‘๋ฉด ์ž๋™ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.


๐Ÿš€ ๋ฐฐํฌ ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ

์ˆ˜๋™์œผ๋กœ ์„œ๋ฒ„์— ์˜ฎ๊ธฐ์ง€ ์•Š๊ณ , ๋ฐฐํฌ๋ฅผ ์ž๋™ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“ scripts/deploy.js


const { execSync } = require('child_process');

const files = ['latest.yml', 'MyApp Setup 1.0.0.exe', 'MyApp-1.0.0.exe'];
const server = 'user@192.168.x.x';
const remote = '/var/www/updates/';

files.forEach(file => {
  console.log(`[๋ฐฐํฌ ์ค‘] ${file}`);
  execSync(`scp release/"${file}" ${server}:${remote}`);
});

์‹คํ–‰ ๋ฐฉ๋ฒ•


npm run electron:build
node scripts/deploy.js

๋นŒ๋“œํ•˜๊ณ  ๋ฐฐํฌ๊นŒ์ง€ 30์ดˆ ์•ˆ์— ๋๋‚ฉ๋‹ˆ๋‹ค.

์„ค์น˜ํŒŒ์ผ ์š”์ฒญ ๋“ค์–ด์˜ค๋ฉด ์ด์ œ โ€œ์ž ๊น๋งŒ์š”, ๋ฐ”๋กœ ์˜ฌ๋ฆด๊ฒŒ์š”โ€ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๐Ÿค– ๊ทธ๋Ÿฐ๋ฐ ์ž๋™ ์—…๋ฐ์ดํŠธ๋Š” ๋„๋Œ€์ฒด ์™œ ์ž๋™์œผ๋กœ ๋˜๋Š” ๊ฑธ๊นŒ์š”?

Electron ์•ฑ์ด ์ž๋™ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑด,

electron-updater์™€ electron-builder๊ฐ€ ์•„์ฃผ ์ž˜ ์งœ์—ฌ์ง„ ๊ทœ์น™์„ ๊ณต์œ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด ์‹œ์Šคํ…œ์€ ์•„๋ž˜์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค:

  1. ์•ฑ ์‹คํ–‰ ์‹œ, autoUpdater.checkForUpdatesAndNotify()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด
  2. ์„ค์ •๋œ ์„œ๋ฒ„ ์ฃผ์†Œ(publish.url)์— ์žˆ๋Š” latest.yml ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  3. ์ด latest.yml์—๋Š” ํ˜„์žฌ ๋ฐฐํฌ ์ค‘์ธ ์ตœ์‹  ๋ฒ„์ „ ์ •๋ณด๊ฐ€ ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

version: 1.0.1
path: MyApp Setup 1.0.1.exe
sha512: <๋ฌด๊ฒฐ์„ฑ ๊ฒ€์‚ฌ์šฉ ํ•ด์‹œ>
  1. ์•ฑ์˜ package.json์— ๋ช…์‹œ๋œ ํ˜„์žฌ ๋ฒ„์ „๊ณผ ๋น„๊ตํ•ด์„œ,

  2. ์ตœ์‹  ๋ฒ„์ „์ด ๋” ๋†’์œผ๋ฉด path์— ๋ช…์‹œ๋œ .exe๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ 

  3. ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ์„ ์ข…๋ฃŒํ•˜๋ฉด autoUpdater.quitAndInstall()์„ ํ†ตํ•ด

    ์ƒˆ ์„ค์น˜ํŒŒ์ผ์ด ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๊ณ  ๊ธฐ์กด ์•ฑ์€ ๊ต์ฒด๋ฉ๋‹ˆ๋‹ค.


โœ… ์ด๊ฒŒ ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š”?

  • electron-builder๊ฐ€ ๋นŒ๋“œํ•  ๋•Œ ์ž๋™์œผ๋กœ latest.yml๊ณผ ๋ฒ„์ „๋ณ„ .exe๋ฅผ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค.
  • electron-updater๋Š” ์ด latest.yml์˜ ๊ตฌ์กฐ๋ฅผ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๊ณ  ๋‹ค์šด๋กœ๋“œ + ์„ค์น˜๊นŒ์ง€ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ๊ทธ์ €โ€ฆ ๋ฒ„์ „๋งŒ ์˜ฌ๋ฆฌ๊ณ , ์„œ๋ฒ„์— ์˜ฌ๋ฆฌ๋ฉด ๋.

    ์ฆ‰, ์šฐ๋ฆฌ๊ฐ€ ์ž๋™ํ™”ํ•œ ๊ฑด ๋ฐฐํฌ๊ณ , Electron์ด ์ž๋™ํ™”ํ•ด์ค€ ๊ฑด ์—…๋ฐ์ดํŠธ ๋กœ์ง์ž…๋‹ˆ๋‹ค.


๐Ÿ“ฆ ์š”์•ฝํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:

๊ตฌ์„ฑ ์š”์†Œ์—ญํ• 
latest.yml์ตœ์‹  ๋ฒ„์ „ ๋ฉ”ํƒ€์ •๋ณด ์ œ๊ณต
electron-updater๋ฒ„์ „ ๋น„๊ต + ๋‹ค์šด๋กœ๋“œ + ์„ค์น˜
electron-builder.exe, latest.yml ์ž๋™ ์ƒ์„ฑ
๋‚ด ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ์„œ๋ฒ„ ์—…๋กœ๋“œ ์ž๋™ํ™” (scp)
์‚ฌ์šฉ์ž๋Š”๊ทธ๋ƒฅ ์‹คํ–‰๋งŒ ํ•˜๋ฉด ์•Œ์•„์„œ ์ตœ์‹ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋จ

๐Ÿ‘€ ์‹ค๋ฌด ํŒ ๋ชจ์Œ

  • appId๋Š” ๊ณ ์ •๊ฐ’์ด์–ด์•ผ ์ž๋™ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ •ํ™•ํžˆ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • version ํ•„๋“œ๋Š” ๋ฐ˜๋“œ์‹œ ์ˆ˜๋™์œผ๋กœ ์˜ฌ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค (์ž๋™ ์—…๋ฐ์ดํŠธ ๋น„๊ต์šฉ).
  • win.target: 'nsis'๋Š” ์„ค์น˜ ๋งˆ๋ฒ•์‚ฌ๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.
  • autoUpdater.checkForUpdatesAndNotify()๋Š” ์•ฑ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ์—…๋ฐ์ดํŠธ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž ๋กœ๊ทธ๋Š” electron-log๋กœ ๋‚จ๊ธฐ๋ฉด /AppData/Local/... ์— ์ž๋™ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

โ“ ๊ธ€์„ ๋ณธ ์‚ฌ๋žŒ๋“ค์ด ์ถ”๊ฐ€๋กœ ๊ถ๊ธˆํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์งˆ๋ฌธ๋“ค

1. โ€œ์ด๊ฑฐ GitHub ๊ฐ™์€ ๊ณต๊ฐœ ์ €์žฅ์†Œ ์—†์–ด๋„ ๋˜๋‚˜์š”?โ€

๋„ค, electron-updater๋Š” GitHub๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์‚ผ์ง€๋งŒ

provider: "generic"์„ ์“ฐ๋ฉด ๋‚ด๋ถ€๋ง ์„œ๋ฒ„๋‚˜ ๋กœ์ปฌ ์„œ๋ฒ„์—์„œ๋„ ์™„๋ฒฝํžˆ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์‹ฌ์ง€์–ด ์‚ฌ์„ค IP๋‚˜ ์‚ฌ๋‚ด ํŒŒ์ผ์„œ๋ฒ„๋„ OK์ž…๋‹ˆ๋‹ค.


2. โ€œSetup.exe๋ž‘ 1.0.0.exe ์ฐจ์ด๋Š” ๋ญ์˜ˆ์š”?โ€

Setup.exe: ์‚ฌ์šฉ์ž๊ฐ€ ์ฒ˜์Œ ์„ค์น˜ํ•  ๋•Œ ์“ฐ๋Š” ์ „์ฒด ์„ค์น˜ํŒŒ์ผMyApp-1.0.0.exe: ์ž๋™ ์—…๋ฐ์ดํŠธ์šฉ ํŒจ์น˜ ํŒŒ์ผ (silent install์šฉ)

์ž๋™ ์—…๋ฐ์ดํŠธ๋Š” ์ด ์ž‘์€ -๋ฒ„์ „.exe๋งŒ ๋‹ค์šด๋กœ๋“œํ•ด์„œ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.


3. โ€œ๋ฒ„์ „์€ ์–ด๋–ป๊ฒŒ ์ธ์‹ํ•ด์š”?โ€

package.json์˜ "version": "1.0.1" ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ž๋™ ์—…๋ฐ์ดํŠธ๋Š” latest.yml์˜ ๋ฒ„์ „๊ณผ ๋น„๊ตํ•ด์„œ

ํ˜„์žฌ ์•ฑ๋ณด๋‹ค ๋†’์€ ๋ฒ„์ „์ด๋ฉด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๋ฒ„์ „ ์•ˆ ์˜ฌ๋ฆฌ๊ณ  ๋ฐฐํฌํ•˜๋ฉด ์—…๋ฐ์ดํŠธ ์•ˆ ๋ฉ๋‹ˆ๋‹ค.


4. โ€œ์„ค์น˜ํŒŒ์ผ ์„ค์น˜ํ•˜๋ฉด ์–ด๋””์— ์„ค์น˜๋ผ์š”?โ€

๊ธฐ๋ณธ์ ์œผ๋กœ Windows์˜

C:\Users\{username}\AppData\Local\Programs\MyApp\ ๊ฒฝ๋กœ์— ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

electron-builder์—์„œ installDirectory, ์•„์ด์ฝ˜, ์‹คํ–‰ ๊ถŒํ•œ ๋“ฑ๋„ ์„ค์ • ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


5. โ€œ์•ฑ ์•„์ด์ฝ˜์€ ์–ด๋–ป๊ฒŒ ๋ฐ”๊ฟ”์š”?โ€

build ์„ค์ •์— .ico ํŒŒ์ผ์„ ์ง€์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.


"build": {
  "win": {
    "icon": "public/icon.ico"
  }

6. โ€œ์„ค์น˜ํ•  ๋•Œ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ(UAC) ๋œจ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‚˜์š”?โ€

๋„ค! ๋‹ค์Œ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค:


"win": {
  "requestedExecutionLevel": "requireAdministrator"
}

๊ทธ๋Ÿฌ๋ฉด ์„ค์น˜ํ•  ๋•Œ UAC ๊ฒฝ๊ณ ์ฐฝ์ด ๋œจ๋ฉฐ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.


7. โ€œ์ž๋™ ์—…๋ฐ์ดํŠธ ์•ˆ ๋˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์–ด์š”?โ€

๋„ค, ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค:

  • latest.yml์ด ์„œ๋ฒ„์— ์—†๊ฑฐ๋‚˜ URL ์„ค์ •์ด ํ‹€๋ฆผ
  • version์„ ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋‹ค์‹œ ๋‚ฎ์ท„์„ ๊ฒฝ์šฐ (๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ ๋ฏธ์ง€์›)
  • ์•ฑ์„ UAC ๊ถŒํ•œ ์—†์ด ์„ค์น˜ํ–ˆ๋Š”๋ฐ, ์—…๋ฐ์ดํŠธ ํŒŒ์ผ์ด ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์„ ์š”๊ตฌํ•จ
  • ๋„คํŠธ์›Œํฌ์—์„œ ์—…๋ฐ์ดํŠธ ์„œ๋ฒ„ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ

๐Ÿง˜ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

React + Electron ์•ฑ์„ ์„ค์น˜ํ˜•์œผ๋กœ ๋ฐฐํฌํ•˜๋ ค๋ฉด ๋ญ”๊ฐ€ ๋ณต์žกํ•˜๊ณ  ๋ฌด์„œ์šธ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํ•ด๋ณด๋‹ˆ ๊ฝค ์žฌ๋ฐŒ๊ณ , ์€๊ทผํžˆ ๋ฟŒ๋“ฏํ•˜๊ณ ,

๋ฌด์—‡๋ณด๋‹ค โ€œ๋‚ด๊ฐ€ ๋งŒ๋“  ์•ฑ์ด ์ง„์งœ๋กœ ๊น”๋ฆฐ๋‹คโ€๋Š” ๊ฒฝํ—˜์€ ๊ต‰์žฅํžˆ ์งœ๋ฆฟํ•ฉ๋‹ˆ๋‹ค.

์›น ๊ฐœ๋ฐœ์ž๋„ ์„ค์น˜ํ˜• ์•ฑ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ทธ ์•ฑ์ด ์•Œ์•„์„œ ์—…๋ฐ์ดํŠธ๋„ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฑธ ์„œ๋ฒ„์— ์ž๋™์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๊นŒ์ง€ ๊ตด๋Ÿฌ๊ฐ‘๋‹ˆ๋‹ค.

์ด ๊ธ€์„ ์—ฌ๊ธฐ๊นŒ์ง€ ์ฝ์œผ์‹  ๋‹น์‹ ๋„, ์ง€๊ธˆ ๋ฐ”๋กœ npm run electron:build์„ ํ•ด๋ณด์„ธ์š”.

profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์Ÿˆ!!

0๊ฐœ์˜ ๋Œ“๊ธ€