πŸ§ΉλΉŒλ“œ 전에 κΌ­ ν•„μš”ν•œ λŒ€μ²­μ†Œ - μΊμ‹œ(Cache)λ₯Ό 치우자~

솑연지·2025λ…„ 8μ›” 13일
4

νŠΈλŸ¬λΈ”μŠˆνŒ…

λͺ©λ‘ 보기
31/32

Electron + Vite둜 κ°œλ°œν•˜λ©΄μ„œ VM ν™˜κ²½μ—μ„œ νŒ¨ν‚€μ§•μ„ ν•˜λ‹€ 보면,

β€œκ°™μ€ μ½”λ“œ, 같은 섀정인데 엔진이 μ•ˆ μ—΄λ¦°λ‹€β€λŠ” μ΄μƒν•œ 상황을 κ²ͺλŠ” κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€.

μ²˜μŒμ—λŠ” λ‹¨μˆœν•œ VM(가상머신) 속도 λ¬Έμ œκ² κ±°λ‹ˆ ν•˜κ³  λ„˜μ–΄κ°”μ§€λ§Œ,

λ¬Έμ œλŠ” ν•˜λ£¨μ΄ν‹€μ΄ μ•„λ‹ˆλΌ λΉŒλ“œν•  λ•Œλ§ˆλ‹€ 가끔 κΌ­ λ‚˜νƒ€λ‚œλ‹€λŠ” μ μ΄μ—ˆμ£ .

더 μ΄μƒν•œ 건, 아무것도 λ°”κΎΈμ§€ μ•Šκ³  λ‹€μ‹œ λΉŒλ“œν•˜λ©΄ 또 잘 λœλ‹€λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

이쯀 되면 운이 쒋은 건지, λΉŒλ“œκ°€ μž₯λ‚œμ„ μΉ˜λŠ” 건지 μ•Œ 수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.


πŸ’‘ λΉŒλ“œ μ‚°μΆœλ¬Όκ³Ό μΊμ‹œμ˜ μˆ¨κ²¨μ§„ 함정

λΉŒλ“œλ₯Ό ν•˜λ©΄ dist/, release/, build/ 같은 폴더에 μ‹€ν–‰ 파일과 λ²ˆλ“€λœ JSκ°€ μƒμ„±λ©λ‹ˆλ‹€.

이게 λ°”λ‘œ λΉŒλ“œ μ‚°μΆœλ¬Όμž…λ‹ˆλ‹€.

λ¬Έμ œλŠ” 이 폴더에 남아 μžˆλŠ” μ˜ˆμ „ 파일이 λ‹€μŒ λΉŒλ“œμ— κ·ΈλŒ€λ‘œ μ„žμ—¬ λ“€μ–΄κ°ˆ 수 μžˆλ‹€λŠ” μ μž…λ‹ˆλ‹€.

여기에 μΊμ‹œ(Cache)κΉŒμ§€ λ”ν•΄μ§‘λ‹ˆλ‹€.

Vite, Webpack, Next.js λ“± λΉŒλ“œ 도ꡬ듀은 λΉŒλ“œλ₯Ό λΉ λ₯΄κ²Œ ν•˜κΈ° μœ„ν•΄ μΊμ‹œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

변경이 μ—†λŠ” νŒŒμΌμ€ λ‹€μ‹œ μ²˜λ¦¬ν•˜μ§€ μ•Šκ³  μž¬ν™œμš©ν•˜μ£ .

ν•˜μ§€λ§Œ 가끔 λ³€κ²½ 감지λ₯Ό λ†“μΉ˜λ©΄, 였래된 결과물이 κ·ΈλŒ€λ‘œ 살아남아 λ²„λ¦½λ‹ˆλ‹€.

μΊμ‹œλŠ” λΉŒλ“œ 속도λ₯Ό λ†’μ΄λŠ” β€˜λΆ€μŠ€ν„°β€™μ΄μ§€λ§Œ, 잘λͺ» 쓰이면 발λͺ©μ„ μž‘λŠ” β€˜μ§€λ’°β€™κ°€ λ˜κΈ°λ„ ν•©λ‹ˆλ‹€.


πŸ—‚ λΉŒλ“œ λ„κ΅¬λ³„λ‘œ μ§€μ›Œμ•Ό ν•  폴더

ν”„λ‘œμ νŠΈλ§ˆλ‹€ μ§€μ›Œμ•Ό ν•  폴더가 λ‹€λ¦…λ‹ˆλ‹€.

μ•„λž˜ ν‘œλŠ” λŒ€ν‘œμ μΈ λΉŒλ“œ ν™˜κ²½μ—μ„œ μ²­μ†Œν•΄μ•Ό ν•  μΊμ‹œμ™€ λΉŒλ“œ μ‚°μΆœλ¬Ό ν΄λ”μž…λ‹ˆλ‹€.

λΉŒλ“œ/ν”„λ ˆμž„μ›Œν¬μΊμ‹œ ν΄λ”λΉŒλ“œ μ‚°μΆœλ¬Ό 폴더
Vite.vitedist/
Webpack.webpack-cachedist/
Next.js.next.next
CRAnode_modules/.cachebuild/
Electronμ—†μŒ(κΈ°λ³Έ)dist/, release/
Node.jsnode_modules/.cacheμ—†μŒ

🧹 클린 λΉŒλ“œμ˜ 발견

μ΄λ•ŒλΆ€ν„° β€œν΄λ¦° λΉŒλ“œ(Clean Build)β€λΌλŠ” κ°œλ…μ„ 깊이 λ“€μ—¬λ‹€λ΄€μŠ΅λ‹ˆλ‹€.

클린 λΉŒλ“œλŠ” 이전 λΉŒλ“œ μ‚°μΆœλ¬Όκ³Ό μΊμ‹œλ₯Ό μ™„μ „νžˆ μ§€μš°κ³ , κΉ¨λ—ν•œ μƒνƒœμ—μ„œ μƒˆλ‘œ λΉŒλ“œν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€.

문제의 κ·Όλ³Έ 원인은 λ‹¨μˆœν–ˆμŠ΅λ‹ˆλ‹€.

이전 λΉŒλ“œμ˜ μž”μ—¬ 파일과 μΊμ‹œκ°€ μƒˆ λΉŒλ“œμ— μ„žμ—¬ λ“€μ–΄κ°€λ©΄μ„œ

파일 λˆ„λ½, λ³€κ²½ 미반영 같은 κΈ°μ΄ν•œ ν˜„μƒμ„ λ§Œλ“  κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€.


πŸ›  클린 λΉŒλ“œ μ‹€ν–‰ 방법

μˆ˜λ™ μ‚­μ œ

# macOS / Linux
rm -rf dist release out build .vite .webpack-cache node_modules/.cache
# Windows PowerShell
rd /s /q dist release out build .vite .webpack-cache node_modules\.cache

npm 슀크립트 μžλ™ν™”

"scripts": {
  "clean": "rimraf dist release out build .vite .webpack-cache node_modules/.cache",
  "build": "npm run clean && electron-builder"
}

rimraf μ„€μΉ˜:

npm i rimraf --save-dev

πŸ“¦ Electron + μ—”μ§„ exe 포함 μ‹œ μ£Όμ˜ν•  점

Electron μ•±μ—μ„œ μ—”μ§„ μ‹€ν–‰ νŒŒμΌμ„ 같이 λ°°ν¬ν•˜λ €λ©΄,

electron-builder의 extraResources에 μ •ν™•ν•œ 경둜λ₯Ό μ§€μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.


"build": {
  "asar": true,
  "asarUnpack": [],
  "extraResources": [
    { "from": "electron/engine/bin/seph_engine.exe", "to": "public/seph_engine.exe" }
  ],
  "files": [
    "dist/**",
    "electron/**",
    "!**/*.map"
  ]
}

경둜λ₯Ό λͺ…ν™•νžˆ ν•΄μ£Όλ©΄ νŒ¨ν‚€μ§• μ‹œ μ—”μ§„ 파일 λˆ„λ½μ„ λ°©μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


πŸ”„ CI/CD ν™˜κ²½μ—μ„œμ˜ 클린 λΉŒλ“œ

GitHub Actions, Jenkins, GitLab CI 같은 CI/CD μ„œλ²„λŠ” 맀번 κΉ¨λ—ν•œ ν™˜κ²½μ—μ„œ λΉŒλ“œν•˜μ§€λ§Œ,

λΉŒλ“œ 속도λ₯Ό 높이렀고 μΊμ‹œλ₯Ό 켜면 이 λ¬Έμ œκ°€ λ‹€μ‹œ 생길 수 μžˆμŠ΅λ‹ˆλ‹€.

GitHub Actions μ˜ˆμ‹œ


steps:
  - name: Clean build
    run: rm -rf dist release .vite .webpack-cache node_modules/.cache
  - name: Install dependencies
    run: npm ci
  - name: Build
    run: npm run build

⚠️ VM ν™˜κ²½μ—μ„œ 자주 λ°œμƒν•˜λŠ” λ³€μˆ˜

  • I/O 속도 μ§€μ—° β†’ 파일 λ³΅μ‚¬λ‚˜ 압좕이 쀑간에 λˆ„λ½λ  수 있음
  • μŠ€λƒ…μƒ· 볡원 β†’ μ˜ˆμ „ λΉŒλ“œ 결과물이 κ·ΈλŒ€λ‘œ 볡귀
  • μ‹œκ°„ 동기화 문제 β†’ μ„€μΉ˜κΈ°κ°€ 파일 변경을 인식 λͺ» 함
  • λ°±μ‹  κ°„μ„­ β†’ μ‹€ν–‰ νŒŒμΌμ„ 격리 λ˜λŠ” μ‚­μ œ

πŸ›‘ μ—”μ§„ μ‹€ν–‰ μ „ 점검 μ½”λ“œ


import fs from 'fs';
import path from 'path';
import { spawn } from 'child_process';

const enginePath = path.join(process.resourcesPath, 'app.asar.unpacked', 'public', 'seph_engine.exe');

function fileExists(p: string) {
  try { return fs.existsSync(p); } catch { return false; }
}

export function startEngine() {
  if (!fileExists(enginePath)) {
    throw new Error(`[Engine Missing] ${enginePath}`);
  }

  const proc = spawn(enginePath, [], { detached: true });
  proc.on('error', (err) => {
    console.error('[Engine Spawn Error]', err);
  });
}

βœ… λΉŒλ“œ μ‹€νŒ¨ 원인 체크리슀트

  • 이전 λΉŒλ“œ 결과물을 μ‚­μ œν–ˆλŠ”κ°€?
  • μΊμ‹œ 폴더λ₯Ό λΉ„μ› λŠ”κ°€?
  • μ•± 버전을 μ˜¬λ ΈλŠ”κ°€?
  • μ—”μ§„ exe κ²½λ‘œκ°€ μ •ν™•ν•œκ°€?
  • μ‹€ν–‰ κΆŒν•œμ΄ μžˆλŠ”κ°€?
  • λ°±μ‹ μ—μ„œ μ°¨λ‹¨ν•˜μ§€ μ•Šμ•˜λŠ”κ°€?

πŸ“ 마무리

클린 λΉŒλ“œλŠ” νŠΉμ • λΉŒλ“œ 도ꡬ μ „μš© κΈ°λŠ₯이 μ•„λ‹ˆλΌ, λͺ¨λ“  개발 ν™˜κ²½μ—μ„œ ν†΅ν•˜λŠ” μ•ˆμ „μž₯μΉ˜μž…λ‹ˆλ‹€.

μΊμ‹œλŠ” λΉŒλ“œ μ‹œκ°„μ„ λ‹¨μΆ•μ‹œν‚€λŠ” 쒋은 λ„κ΅¬μ§€λ§Œ, 잘λͺ» 쓰이면 발λͺ©μ„ μž‘λŠ” 주범이 되죠.

특히 VM ν™˜κ²½μ—μ„œλŠ”

클린 λΉŒλ“œ + 버전 증가 + 경둜 κ³ μ •

이 μ„Έ κ°€μ§€κ°€ λΉŒλ“œ μ•ˆμ •μ„±μ˜ ν•΅μ‹¬μž…λ‹ˆλ‹€.

저도 μ˜ˆμ „μ—λŠ” β€œμ•ˆ 되면 ν•œ 번 더 λΉŒλ“œν•˜μ§€ 뭐”라고 μƒκ°ν–ˆμ§€λ§Œ,

μ΄μ œλŠ” μ²˜μŒλΆ€ν„° κΉ¨λ—ν•˜κ²Œ λΉŒλ“œν•΄μ„œ ν•œ λ²ˆμ— μ„±κ³΅ν•˜λŠ” μŠ΅κ΄€μ„ λ“€μ˜€μŠ΅λ‹ˆλ‹€.

λΉŒλ“œ ν™˜κ²½λ„ μ§‘μ²˜λŸΌ, 주기적인 λŒ€μ²­μ†Œκ°€ ν•„μš”ν•©λ‹ˆλ‹€.

profile
ν”„λ‘ νŠΈμ—”λ“œ 개발쟈!!

4개의 λŒ“κΈ€

μ•„λ‹›! 계속 μ’‹μ•„μš” λˆŒλŸ¬μ£Όμ‹œλ„€μš” γ…‹γ…‹γ…‹ μ € λ²¨λ‘œκ·Έμ— 친ꡬ μ—†λŠ”λ° 항상 κ°μ‚¬ν•©λ‹ˆλ‹€!γ…Žγ…Ž

1개의 λ‹΅κΈ€