본문으로 바로가기
제품데스크톱 도구TASTECAD도면 확인TASTEFILES파일 관리TASTEFTP파일 전송TASTESSH원격 작업공간TASTEZIP압축과 해제개발 도구TASTECODERust 통합 개발 환경TASTESTUDIO통합 개발·테스트 환경TASTEETL데이터 통합(ETL)서버TASTEREMOTE원격 데스크톱 서버TASTEGEO공간정보 서버TASTEMAIL메일 작업공간시작하기다운로드문서구매모든 제품
마켓플레이스
소식
개발소식오늘의 개발 소식개발 문서프로그래밍 언어RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron알고리즘알고리즘 기초알고리즘 핵심알고리즘 심화실무 알고리즘
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스커뮤니티 안내
협업기술 전수홈페이지 구축데스크톱 앱 구축릴리스·결제 파이프라인판매 파트너문의
서비스원격 데스크톱설치 패키지 커스텀
TASTEDEV
제품

데스크톱 도구

TASTECAD복잡한 도면을 가볍게 열다TASTEFILES필요한 파일만, 가장 빠르게TASTEFTP파일이 오가는 가장 단정한 길TASTESSH서버와 나 사이, 더 단단한 연결TASTEZIP더 빠르게 묶고, 더 안전하게 풀다

개발 도구

TASTECODERust 앱을 편집 · 빌드 · 디버깅 · 테스트까지 한 창에서TASTESTUDIO편집부터 원격 테스트와 승인 기반 AI 수정까지TASTEETL값을 보며 데이터를 옮깁니다

서버

TASTEREMOTE우리 회사 서버로 운영하는 원격 데스크톱TASTEGEOGeoServer 호환 공간정보 서버를 Rust로 다시 세웁니다TASTEMAIL메일의 주도권을 다시 내 손에

시작하기

다운로드모든 제품 최신 판문서제품 사용법구매구독 · 영구 라이선스모든 제품모든 제품 한눈에
모든 제품
마켓플레이스소식
개발

소식

오늘의 개발 소식언어 · 프레임워크 · GitHub · AI 공식 발표개발 문서언어 · 프레임워크 · 알고리즘 안내서

프로그래밍 언어

RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart

프레임워크

프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular
서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express
앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron

알고리즘

알고리즘 기초복잡도 분석 · 정렬 · 탐색 · 기본 자료구조 · 트리와 힙알고리즘 핵심그래프 탐색 · 최단 경로와 최소 신장 트리 · 동적 계획법 · 탐욕 알고리즘 · 분할 정복 · 백트래킹알고리즘 심화문자열 알고리즘 · 수학과 정수론 · 비트 연산 · 구간 트리 · 유니온 파인드실무 알고리즘코딩 면접 풀이 전략 · LRU 캐시 · 레이트 리미터 · 일관된 해시
개발 문서 전체 보기
커뮤니티
프로젝트빌더와 작업 발견개발 로그결정과 시행착오프롬프트재사용 가능한 지시AI 도구 이슈Claude · Codex · Gemini 문제와 우회법쇼케이스완성된 결과커뮤니티 안내공개하고 함께 만드는 방식
협업
기술 전수Rust·egui 네이티브 앱 만들기홈페이지 구축10개 언어, 계정, 문서·다운로드데스크톱 앱 구축Rust·egui, WebView 없이릴리스·결제 파이프라인서명 · MSI·deb·rpm·AppImage · 해시판매 파트너소개하고 결제액의 30% 받기문의구축 · 제휴 · 투자 문의
서비스
원격 데스크톱브라우저로 내 컴퓨터에 접속설치 패키지 커스텀필요한 기능만, 설정은 미리
구매
KO
한국어EnglishDeutschEspañolFrançaisItalianoPortuguês (Brasil)日本語简体中文繁體中文
로그인
로그인
TASTEDEV

작은 도구부터, 더 좋은 개발까지.

support@tastedev.netTASTEDEV 후원하기
제품제품군구매문서다운로드마켓플레이스고객 지원
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스
정책개인정보처리방침이용약관구독 약관환불 정책커뮤니티 운영 정책
계정로그인가입하기
방문자
오늘
012345678901234567890123456789012345678901234567890123456789
어제
012345678901234567890123456789012345678901234567890123456789
누적 조회
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
상호
지엑스소프트
대표자
최영구
사업자등록번호
853-44-00368
주소
인천광역시 미추홀구 경인로 351 9층 V24
전화
+82-10-4404-1523
이메일
whitecalvin@tastedev.net
개인정보 보호책임자
최영구

© 2026 TASTEDEV제품 정보는 현재 검증된 개발 소스를 기준으로 합니다.출시·고도화 중

Electron 문서
Electron
Electron 시작하기프로젝트 구조핵심 개념데이터와 상태테스트배포
토론

Electron 안내서 · 6/6

배포

완성한 앱을 사용자에게 전하려면 실행 파일로 묶고(패키징), 운영체제별 설치 파일을 만들고, 코드 서명을 하고, 업데이트 경로를 마련해야 합니다. 이 장에서는 Electron Forge를 중심으로 이 과정을 살펴보고, 널리 쓰이는 electron-builder와 자동 업데이트 방법도 소개합니다.

Forge의 세 단계: package, make, publish

Electron Forge는 배포를 세 단계로 나눕니다.

# 1. 현재 운영체제용 실행 가능한 앱을 out/ 아래에 만든다
npm run package

# 2. 설정한 maker로 설치 파일을 out/make/ 아래에 만든다
npm run make

# 3. 만든 설치 파일을 GitHub 릴리스 같은 배포 대상에 올린다
npm run publish

package 단계에서 앱 코드는 기본적으로 ASAR 아카이브 하나로 묶입니다. 파일 수가 줄어 설치와 읽기가 빨라지고, 소스 파일이 그대로 드러나지 않습니다. 다만 ASAR는 암호화가 아니므로 비밀 값을 앱에 넣어서는 안 됩니다.

maker: 설치 파일 형식

maker결과물운영체제
@electron-forge/maker-squirrelSquirrel.Windows 설치 프로그램(Setup.exe)Windows
@electron-forge/maker-dmgDMG 디스크 이미지macOS
@electron-forge/maker-zipZIP 압축 파일모든 운영체제
@electron-forge/maker-deb.deb 패키지Debian, Ubuntu

maker는 대체로 해당 운영체제에서 실행해야 합니다. 예를 들어 DMG는 macOS에서 만듭니다. 그래서 보통 CI에서 Windows, macOS, Linux 실행 환경을 하나씩 두고 각자 빌드합니다.

코드 서명과 공증

서명하지 않은 앱은 운영체제가 경고를 띄우거나 실행을 막습니다. 배포용 앱은 반드시 서명합니다.

  • macOS: Apple Developer Program에 가입해 Developer ID 인증서로 서명하고, Apple의 공증(notarization) 서비스에 제출합니다. 공증하지 않은 앱은 Gatekeeper가 실행을 막습니다.
  • Windows: Authenticode 코드 서명 인증서로 서명합니다. 최근에는 인증서의 개인 키를 하드웨어 보안 모듈이나 클라우드 서명 서비스에 보관해야 하는 경우가 많으므로, 쓰려는 서명 방식을 Forge의 Windows 서명 옵션과 맞춰 둡니다.

Forge에서는 packagerConfig에 서명과 공증 설정을 넣습니다. 비밀 값은 코드에 적지 않고 환경 변수로 넘깁니다.

// forge.config.js
module.exports = {
  packagerConfig: {
    asar: true,
    icon: 'assets/icon', // 확장자를 빼면 운영체제에 맞는 .ico, .icns 를 찾는다
    osxSign: {},
    osxNotarize: {
      appleId: process.env.APPLE_ID,
      appleIdPassword: process.env.APPLE_PASSWORD, // 앱 전용 암호
      teamId: process.env.APPLE_TEAM_ID,
    },
  },
  makers: [
    {
      name: '@electron-forge/maker-squirrel',
      config: {
        certificateFile: './cert.pfx',
        certificatePassword: process.env.CERTIFICATE_PASSWORD,
      },
    },
    { name: '@electron-forge/maker-dmg', config: {} },
    { name: '@electron-forge/maker-deb', config: {} },
  ],
  publishers: [
    {
      name: '@electron-forge/publisher-github',
      config: {
        repository: { owner: 'my-org', name: 'my-app' },
        prerelease: true,
      },
    },
  ],
}

GitHub publisher는 GITHUB_TOKEN 환경 변수의 토큰으로 릴리스를 만듭니다. Forge 템플릿에 들어 있는 Fuses 플러그인(@electron/fuses)은 ELECTRON_RUN_AS_NODE 같은 기능을 패키징 단계에서 꺼서 앱을 더 단단하게 만듭니다.

자동 업데이트

Electron에는 Squirrel 기반의 autoUpdater 모듈이 내장되어 있으며 macOS와 Windows를 지원합니다. Linux에서는 보통 배포판의 패키지 관리자나 AppImage 같은 형식의 업데이트 방식을 씁니다.

공개 GitHub 저장소에 릴리스를 올리는 오픈 소스 앱이라면, 무료 업데이트 서비스 update.electronjs.org를 쓰는 update-electron-app 패키지가 가장 간단합니다. macOS에서는 앱이 서명되어 있어야 업데이트가 동작합니다.

// main.js
const { updateElectronApp } = require('update-electron-app')

updateElectronApp() // 시작할 때와 이후 주기적으로 업데이트를 확인한다

직접 운영하는 업데이트 서버가 있다면 autoUpdater에 피드 주소를 지정합니다.

const { app, autoUpdater } = require('electron')

const server = 'https://updates.example.com'
autoUpdater.setFeedURL({ url: `${server}/update/${process.platform}/${app.getVersion()}` })

// 실제 앱에서는 다시 시작하기 전에 사용자에게 묻는다
autoUpdater.on('update-downloaded', () => autoUpdater.quitAndInstall())

app.whenReady().then(() => autoUpdater.checkForUpdates())

electron-builder

electron-builder는 Forge 대신 널리 쓰이는 패키징 도구입니다. 설정 파일 하나로 여러 설치 형식, 코드 서명, 자동 업데이트(electron-updater)를 다룹니다.

npm install --save-dev electron-builder
npx electron-builder --win    # Windows: NSIS 설치 프로그램
npx electron-builder --mac    # macOS: DMG (macOS에서 실행)
npx electron-builder --linux  # Linux: AppImage 등
# electron-builder.yml
appId: com.example.myapp
productName: My App
directories:
  output: dist
files: ["main.js", "preload.js", "index.html", "renderer.js"]
mac:
  target: dmg
win:
  target: nsis
linux:
  target: AppImage
publish:
  provider: github
// electron-builder로 배포한 앱의 자동 업데이트
const { app } = require('electron')
const { autoUpdater } = require('electron-updater')

app.whenReady().then(() => autoUpdater.checkForUpdatesAndNotify())

Forge와 electron-builder는 같은 일을 하는 다른 도구입니다. 한 프로젝트에서는 하나만 고릅니다.

정리

  • Forge는 package로 앱을 묶고, make로 설치 파일을 만들고, publish로 배포 대상에 올립니다.
  • 설치 형식은 maker로 고르며, 보통 운영체제마다 따로 빌드합니다.
  • macOS는 서명과 공증, Windows는 Authenticode 서명이 필요하고, 비밀 값은 환경 변수로 넘깁니다.
  • 자동 업데이트는 update-electron-app, 내장 autoUpdater, 또는 electron-builder의 electron-updater로 구현합니다.

공식 문서

  • Distribution Overview
  • Code Signing
  • Updating Applications
  • Electron Fuses
  • Electron Forge
  • electron-builder
이 장에 대해 질문이 있나요?
이전 장테스트

댓글 0개

인기 댓글순최신순

로그인 · 로그인하면 댓글을 남길 수 있습니다.