โ์ฌ์ฉ์ํํ .exe๋ง ๊ณ ๋ฅด๊ฒ ํ๊ณ ์ถ์ต๋๋ค.
๋ค๋ฅธ ๊ฑฐ?
.zip
?.txt
? ๊ณ ๋ฅด์ง๋ ๋ชปํ๊ฒ ํด์ฃผ์ธ์. ํด๋ฆญ๋ ๋ชป ํ๊ฒ์.โ
์ฒ์์ ์ ๋ง ๊ทธ๊ฒ... ์ฌ์ธ ์ค ์์์ด์.
<input type="file">
React๋ก ํ๋ก์ ํธ๋ฅผ ์ง๋ค ๋ณด๋ฉด ํ์ผ ์ ํ์ด ํ์ํ์์์?
<input type="file" accept=".exe" />
์ ๋ ์ด๊ฑธ ์ผ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์ ๋ง๋งํ๊ฒ .exe
๋ง ๋์ฌ ์ค ์๊ณ ํ์ธ ๋ฒํผ์ ๋๋ ์ฃ .
๊ทธ๋ฐ๋ฐโฆ
"๋ชจ๋ ํ์ผ (.)"
?????? ๐จ
์ ์ด๊ฒ ๋ณด์ฌ...?
.txt
๋ ์ ํ๋๊ณ , .pdf
๋ ๋๊ณ โฆ ์จ๊ฐ ํ์ผ์ด ๋ค ๋ค์ด์ค๋ ๊ฒ๋๋ค.
โaccept๋ ๋๋์ฒด ์ ์ค ๊ฑฐ์ผโฆ??โ ์ถ์ ์๊ฐ์ด์์ฃ .
accept
๋ ๋ง ๊ทธ๋๋ก โ์ถ์ฒโ์ผ ๋ฟ์
๋๋ค์ฌ์ค <input type="file" accept="...">
๋ "์ด๋ฐ ํ์ผ์ด ์ ์ ํด์~"๋ผ๋ ํํธ์ผ ๋ฟ์ด๊ณ ,
์ฌ์ฉ์ ์ ํ์ ์ ํํ ๊ถํ์ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ๋ ๋ณด์์ด ๊ฐ์ฅ ์ค์ํ๊ธฐ ๋๋ฌธ์,
์ฌ์ฉ์ ํ์ผ ์์คํ ์ ์ ๊ทน์ ์ผ๋ก ์ ํํ์ง ์์ต๋๋ค.
๐งจ ๊ทธ๋์ ๊ฒฐ๊ตญโฆ ์ด์ํ ํ์ผ์ด ๋ค์ด์ค๊ณ ๋ฉํ๋ฐ์ดํฐ ์ถ์ถ์์ ์ฑ์ด ํฐ์ง๊ณ ... ๐ฃ
Electron์์๋ ์ด๋ ๊ฒ ์ธ ์ ์์ด์:
const result = await window.electronAPI.openFileDialog({
title: '์คํ ํ์ผ์ ์ ํํ์ธ์',
filters: [{ name: '์คํ ํ์ผ', extensions: ['exe'] }],
properties: ['openFile']
});
์ด ์ฝ๋ ํ๋๋ฉด,
โ .exe ์ธ ํ์ฅ์? ์ ๋ ์ ๋ณด์ฌ์
โ "๋ชจ๋ ํ์ผ"? ๊ทธ๋ฐ ๊ฑฐ ์์ต๋๋ค
โ
.zip
?.txt
? ์ ํ์กฐ์ฐจ ๋ชป ํฉ๋๋ค!
Electron์ ๋ด๋ถ์ ์ผ๋ก Node.js๋ฅผ ๋ด์ฅํ๊ณ ์์ด์
dialog.showOpenDialog()
๋ก ์ด์์ฒด์ ์ ํ์ผ ํ์๊ธฐ๋ฅผ ์ง์ ํธ์ถํฉ๋๋ค.
์ฆ, ์ด๊ฑด ํํธ๊ฐ ์๋๋ผ ์ง์ง OS์๋ค๊ฐ "์ด๊ฑฐ๋ง ๋ณด์ฌ์ค!"๋ผ๊ณ ๋งํ๋ ๊ฑฐ์์.
Electron์ ๋ด๋ถ์ ์ผ๋ก Node.js๋ฅผ ๋ด์ฅํ๊ณ ์๊ณ ,
ํ์ผ ์์คํ , ๋ค์ดํฐ๋ธ ๋ชจ๋, OS API ๋ฑ์ ์์ ๋กญ๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค.
๊ทธ๋์ ๊ฐ๋ฅํด์ง๋ ๊ฒ๋ค:
fs
, path
๋ฑ์ ํตํ ํ์ผ ์ง์ ์ ๊ทผchild_process
๋ก PowerShell/CLI ํธ์ถdialog.showOpenDialog()
๋ก ํ์ฅ์ ์ ํ ๊ฐ์ .exe
๋ฉํ๋ฐ์ดํฐ ์ถ์ถ, ์๋ช
ํ์ธ๊น์ง ๊ฐ๋ฅ!์น๋ธ๋ผ์ฐ์ ๋ ์ด๊ฑธ ๋ชป ํฉ๋๋ค.
๋ณด์์ด ์ฐ์ ์ด๊ธฐ ๋๋ฌธ์, ์ฌ์ฉ์ ๋๋ฐ์ด์ค์ ์๋ ํ์ผ์ ๋ง์๋๋ก ๋ณด๊ณ , ํํฐ๋งํ๊ณ , ์คํํ๊ณ ํ๋ ํ์๋ ์ ํ๋์ฃ
ํญ๋ชฉ | React (๋ธ๋ผ์ฐ์ ) | Electron |
---|---|---|
ํ์ฅ์ ์ ํ | โ ํํธ๋ง ๊ฐ๋ฅ | โ ์ง์ง ์ ํ ๊ฐ๋ฅ |
์์คํ ์ ๊ทผ | โ ์ ํ๋จ | โ Native API ๊ฐ๋ฅ |
๋ฉํ๋ฐ์ดํฐ ์ถ์ถ | โ ๋ถ๊ฐ๋ฅ | โ PowerShell, ์ธ์ฆ์ ๋ถ์ ๊ฐ๋ฅ |
UX | ๐ข ์ค์ ์ ๋ ๊ฐ๋ฅ | ๐ ์ค์ ์ฐจ๋จ ๊ฐ๋ฅ |
Electron์ ์ฐ๋ ์ด์ ๊ฐ ์ด๋ฐ ๊ฐ๋ ฅํ ์์คํ ์ ์ด๋ ฅ ๋๋ฌธ ์๋๊ฒ ์ด์? ๐
ํ์ผ ์ ํ๊ธฐ ํ๋๋ ์ ๋๋ก ๋ค๋ฃจ๋ฉด ์ฑ์ด ํจ์ฌ ๊ฒฌ๊ณ ํด์ง๋๋ค.
โ๊ทธ๋ผ Node.js์ฐ๋ฉด ํ์ผ ์ ํ๊ธฐ๋ฅผ ์ ํํ ์ ์๋์??
.exe
๋ง ๊ณ ๋ฅด๊ฒ ํ๋ ค๋ฉด?Electron ์ ์ฐ๋๋ฐ ์ง์ง .exe
๋ง ๊ณ ๋ฅด๊ฒ ํ๊ณ ์ถ์ผ์๋ค๊ณ ์?
๊ทธ๋ผ ์ด๊ฑด ํฌ๊ฒ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํด๋ณด์ ์ผ ํฉ๋๋ค.
.exe
์๋๋ฉด ๊ฑฐ์ ํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
if (!file.name.endsWith('.exe')) {
alert('์ด ํ์ผ์ .exe๊ฐ ์๋๋๋ค!');
return;
}
๐งจ ๋จ์ : ์ฌ์ฉ์ ์ ์ฅ์์ ์ด๋ฏธ ํ์ผ ๊ณ ๋ฅด๊ณ ๋ "์ ๋ผ์" ํ๋ฉด UX๊ฐ ์ ์ข์์.
<input type="file">
๋์ ๋ฒํผ + ๋๋๊ทธ์ค๋๋กญ UI๋ฅผ ๋ง๋ค์ด์ ๋ด๋ถ์์ .exe
ํ์ผ๋ง ๊ฑฐ๋ฅด๋ ๋ฐฉ์์
๋๋คโaccept=".exe" ์คฌ๋๋ฐ๋ ์ ๋งํ๋ค?โ
โ ๋น์ฐํ ๊ฑฐ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ๋ ๊ถํ์ด ์๊ฑฐ๋ ์.
๐ก ํ์ง๋ง Electron์ OS์ ์ง์ง ๋ง์ ๊ฑธ ์ ์๋ ๋๊ตฌ๋๊น์.
dialog.showOpenDialog()
๋ฅผ ์ฐ๋ฉด
๋ณด์์ฑ, UX, ์ค์ ๋ฐฉ์ง๊น์ง ์๋ฒฝํ๊ฒ ์ฑ๊ธธ ์ ์์ต๋๋ค.
๐ ๋ง์ฝ Electron ์์ด ์ด ๊ธฐ๋ฅ์ด ๊ผญ ํ์ํ๋ค๋ฉด?
"์ ๋๋ก ๋ชป ๋ง๋๋ค๋ ์ฌ์ค์ ์๊ณ , ๋์ UX๋ฅผ ์ค๊ณํ๋ ๊ฒ"์ด ์ค์ํฉ๋๋ค!