TL;DR
์๋ก์ด CLI ๋๊ตฌ๋ฅผ ์ค์นํ ๋
npm install -g๊ฐ ๊ฐ์ฅ ํํ ์ด์ ๋ ๊ธฐ์ ์ ์ฐ์๊ฐ ์๋๋ผ ๋คํธ์ํฌ ํจ๊ณผ(Node.js๊ฐ ์ด๋ฏธ ๊น๋ ค ์์ผ๋๊น)์ ๋ฐฐํฌ ๋ง์ฐฐ์ ์ต์ํ ๋๋ฌธ์ด๋ค. ํ์ง๋ง Rust/Go ๋ฐ์ด๋๋ฆฌ ๋ฐฐํฌ๊ฐ ๋น ๋ฅด๊ฒ ๋๊ณ ์๊ณ , brewยทcargo-binstallยทmise ๊ฐ์ ๋์ ์ฑ๋๋ ์ฑ์ํด์ง๊ณ ์๋ค. ์ด ๊ธ์ npm๋ถํฐ ์์คํ ํจํค์ง ๋งค๋์ , ๋ฉํ ํด ๋งค๋์ , ์ง์ ๋ฐ์ด๋๋ฆฌ ๋ฐฐํฌ๊น์ง ์ ์ฒด ์ํ๊ณ๋ฅผ ์กฐ๋งํ๋ค.
AI-assisted
๋๊ธฐ: ์ ์ ๋ถ npm install์ธ๊ฐ
์๋ก์ด ๊ฐ๋ฐ ๋๊ตฌ๋ฅผ ์ฐพ์ผ๋ฉด ์ค์น ๊ฐ์ด๋์ ์ฒซ ์ค์ด ๊ฑฐ์ ํญ์ ์ด๋ ๊ฒ ์๊ฒผ๋ค.
npm install -g some-toolClaude Code๋, Vercel CLI๋, Prettier๋, ESLint๋ ์ ๋ถ npm์ด๋ค. ์ฌ์ง์ด JavaScript์ ์ ํ ๊ด๊ณ์์ด ๋ณด์ด๋ ๋๊ตฌ๋ npm์ผ๋ก ์ค์นํ๋ค. ์ฒ์์ โ์ ํํ npm์ด์ง?โ๋ผ๋ ์๋ฌธ์ด ๋ค์๋ค. brew๋ ์๊ณ , cargo๋ ์๊ณ , pip๋ ์๋๋ฐ ์ ์ ๋ npm์ด CLI ๋๊ตฌ ๋ฐฐํฌ์ ๊ธฐ๋ณธ๊ฐ์ด ๋์์๊น?
๋ต์ ์ฐพ์๋ณด๋ ๊ธฐ์ ์ ์ฐ์๋ผ๊ธฐ๋ณด๋ค๋ ๋คํธ์ํฌ ํจ๊ณผ์ ๋ฐฐํฌ ๋ง์ฐฐ์ ๋ฌธ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ง๋ฌธ์ ํ๊ณ ๋ค๋ค ๋ณด๋ ์์ฐ์ค๋ฝ๊ฒ โ๋๊ตฌ๋ฅผ ๋ง๋ ์ฌ๋์ ์ด๋ค ์ฑ๋๋ก ๋ฐฐํฌํ๋๊ฐโ, โ๊ฐ ํจํค์ง ๋งค๋์ ๋ ์ด๋ค ์ฒ ํ์ผ๋ก ์ค๊ณ๋์๋๊ฐโ๋ผ๋ ๋ ๋์ ๊ทธ๋ฆผ์ด ๋ณด์ด๊ธฐ ์์ํ๋ค.
์ด ๊ธ์ ๊ทธ ๊ถ๊ธ์ฆ์์ ์ถ๋ฐํด ํจํค์ง ๋งค๋์ ์ํ๊ณ ์ ์ฒด๋ฅผ ์ ๋ฆฌํ๋ค.
1. npm์ด CLI ๋ฐฐํฌ์ ๊ธฐ๋ณธ๊ฐ์ด ๋ ์ด์
์ค์น ๊ธฐ๋ฐ์ด ์๋์ ์ด๋ค
npm์ Node.js๋ฅผ ์ค์นํ๋ฉด ์๋์ผ๋ก ๋ธ๋ ค์จ๋ค. ํ๋ก ํธ์๋ ๊ฐ๋ฐ์, ๋ฐฑ์๋ ๊ฐ๋ฐ์, ์ฌ์ง์ด Python์ด๋ Go๋ฅผ ์ฃผ๋ก ์ฐ๋ ๊ฐ๋ฐ์๋ ์ด๋ค ์ด์ ๋ก๋ Node.js๊ฐ ๊น๋ ค ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. npm ๋ ์ง์คํธ๋ฆฌ์๋ 320๋ง ๊ฐ ์ด์์ ํจํค์ง๊ฐ ๋ฑ๋ก๋์ด ์๊ณ , ์ฐ๊ฐ ์์กฐ ๊ฑด์ ๋ค์ด๋ก๋๊ฐ ๋ฐ์ํ๋ค.
๋๊ตฌ๋ฅผ ๋ฐฐํฌํ๋ ์ ์ฅ์์ โ์ ์ ๊ฐ ์ด๋ฏธ ๊ฐ๊ณ ์์ ํ๋ฅ ์ด ๊ฐ์ฅ ๋์ ํจํค์ง ๋งค๋์ โ๋ฅผ ๊ณ ๋ฅด๋ฉด npm์ด 1์์๊ฐ ๋๋ค.
๋ฐฐํฌ ๋ง์ฐฐ์ด ๊ฑฐ์ ์๋ค
# npm ํจํค์ง ๋ฐฐํฌ์ ์ ์ฒด ๊ณผ์
npm init
# ... ์ฝ๋ ์์ฑ ...
npm publish์ด๊ฒ ์ ๋ถ๋ค. ๋ฐ์ด๋๋ฆฌ ํฌ๋ก์ค์ปดํ์ผ์ด ํ์ ์๊ณ (JS๋ ์ด๋์๋ ๋์๊ฐ๋๊น), Homebrew์ฒ๋ผ PR ๋ฆฌ๋ทฐ๋ฅผ ๊ธฐ๋ค๋ฆด ํ์๋ ์๊ณ , apt์ฒ๋ผ .deb ํจํค์ง๋ฅผ ๋ง๋ค ํ์๋ ์๋ค. ๊ณ์ ๋ง๋ค๊ณ npm publish ํ ์ค์ด๋ฉด ์ ์ธ๊ณ์์ ์ค์นํ ์ ์๋ค.
npx๋ผ๋ ํฌ๋ฌ ๊ธฐ๋ฅ
# ์ค์น ์์ด ๋ฐ๋ก ์คํ
npx create-next-app my-app
npx degit user/repo my-project
npx prettier --write .npx๋ ํจํค์ง๋ฅผ ์์๋ก ๋ฐ์์ ํ ๋ฒ ์คํํ๊ณ ๋ฒ๋ฆฐ๋ค. ๊ธ๋ก๋ฒ ์ค์น๋ก ์์คํ
์ ์ค์ผ์ํค์ง ์์๋ ๋๊ณ , ํญ์ ์ต์ ๋ฒ์ ์ด ์คํ๋๋ค. ์ด๋ฐ โ์ค์น ์๋ ์คํโ ๊ธฐ๋ฅ์ ๋ค๋ฅธ ํจํค์ง ๋งค๋์ ์๋ ์๊ฑฐ๋ ์ฝํ๋ค. Python์ uvx, pipx๊ฐ ๋น์ทํ์ง๋ง npm/npx์ ๋๋ฌ ๋ฒ์์๋ ๋ฏธ์น์ง ๋ชปํ๋ค.
๊ฒฐ๊ตญ ๋คํธ์ํฌ ํจ๊ณผ๋ค
๊ธฐ์ ์ ์ผ๋ก ๋ ๋์ ๋์์ด ์์ด๋ โ์ด๋ฏธ ๋ค ๊น๋ ค ์์ผ๋๊นโ๊ฐ ๊ฐ์ฅ ๊ฐ๋ ฅํ ์ด์ ๋ค. Claude Code๊ฐ npm์ผ๋ก ๋ฐฐํฌ๋๋ ๊ฒ๋, Anthropic์ด JavaScript ํ์ฌ์ฌ์๊ฐ ์๋๋ผ ๊ฐ์ฅ ๋ง์ ๊ฐ๋ฐ์์๊ฒ ๊ฐ์ฅ ์ ์ ๋ง์ฐฐ๋ก ๋๋ฌํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
2. ํจํค์ง ๋งค๋์ ์ ๋ถ๋ฅ
ํจํค์ง ๋งค๋์ ๋ ํฌ๊ฒ ๋ค ๊ฐ์ง๋ก ๋๋ ์ ์๋ค.
| ๋ถ๋ฅ | ์ค๋ช | ๋ํ ์์ |
|---|---|---|
| ์ธ์ด๋ณ ํจํค์ง ๋งค๋์ | ํน์ ์ธ์ด ์ํ๊ณ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ/๋๊ตฌ ๋ฐฐํฌ | npm, pip, cargo, go install |
| ์์คํ ํจํค์ง ๋งค๋์ | OS ์์ค์์ ๋ฐ์ด๋๋ฆฌ ์ค์น | brew, apt, scoop, winget |
| ๋ฉํ/์ ๋๋ฒ์ค ํด ๋งค๋์ | ์ฌ๋ฌ ๋๊ตฌ์ ๋ฒ์ ์ ํตํฉ ๊ด๋ฆฌ | mise, aqua, proto, Nix |
| ์ง์ ๋ฐ์ด๋๋ฆฌ ๋ฐฐํฌ | ํจํค์ง ๋งค๋์ ์์ด ๋ฐ์ด๋๋ฆฌ ์ง์ ์ ๋ฌ | GitHub Releases, curl | sh, Docker |
๊ฐ ๋ถ๋ฅ๋ ์๋ก ๊ฒฝ์ํ๊ธฐ๋ ํ๊ณ ๋ณด์ํ๊ธฐ๋ ํ๋ค. ์๋ฅผ ๋ค์ด ripgrep์ cargo๋ก๋, brew๋ก๋, apt๋ก๋, GitHub Releases์์ ์ง์ ๋ฐ์ด๋๋ฆฌ๋ก๋ ์ค์นํ ์ ์๋ค. ๋๊ตฌ ์ ์์๊ฐ ์ฌ๋ฌ ์ฑ๋์ ๋์ ๋ฐฐํฌํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
3. ์ธ์ด๋ณ ํจํค์ง ๋งค๋์ ๋น๊ต
npm / npx โ ๊ฐ์ฅ ๋์ ๋๋ฌ ๋ฒ์
- ์ธ์ด: JavaScript / TypeScript
- ๋ ์ง์คํธ๋ฆฌ: npmjs.com (320๋ง+ ํจํค์ง)
- CLI ๋๊ตฌ ์ค์น:
npm install -g <tool>๋๋npx <tool> - ์ฅ์ : ์ค์น ๊ธฐ๋ฐ ์ต๋, npx๋ก ๋ฌด์ค์น ์คํ, ๋ฐฐํฌ ๋ง์ฐฐ ์ต์
- ๋จ์ : Node.js ๋ฐํ์ ํ์, JS ํน์ ์
node_modules๋ฌด๊ฒ๊ฐ
# ๊ธ๋ก๋ฒ ์ค์น
npm install -g vercel
# ์ค์น ์์ด ์คํ
npx create-next-app my-appoptionalDependencies ํจํด
esbuild, SWC ๊ฐ์ ๋๊ตฌ๋ JS๊ฐ ์๋ ๋ค์ดํฐ๋ธ ๋ฐ์ด๋๋ฆฌ์ธ๋ฐ๋ npm์ผ๋ก ๋ฐฐํฌํ๋ค. ํ๋ซํผ๋ณ ๋ฐ์ด๋๋ฆฌ๋ฅผ
optionalDependencies๋ก ๋ถ๋ฆฌํด์ ์ฌ์ฉ์ OS์ ๋ง๋ ๊ฒ๋ง ์ค์น๋๊ฒ ํ๋ ๊ธฐ๋ฒ์ด๋ค. npm์ ๋๋ฌ ๋ฒ์๋ฅผ ํ์ฉํ๋ฉด์๋ ๋ค์ดํฐ๋ธ ์ฑ๋ฅ์ ์ ๊ณตํ๋ ์ ์ถฉ์์ด๋ค.
pip / pipx / uvx โ Python ์ํ๊ณ
- ์ธ์ด: Python
- ๋ ์ง์คํธ๋ฆฌ: PyPI (60๋ง+ ํจํค์ง)
- CLI ๋๊ตฌ ์ค์น:
pipx install <tool>๋๋uvx <tool> - ์ฅ์ : Python ์ฌ์ฉ์์ธต ๋์, uvx๋ ๋งค์ฐ ๋น ๋ฆ
- ๋จ์ : Python ๋ฐํ์ ํ์, ์์กด์ฑ ๊ด๋ฆฌ๊ฐ ์ญ์ฌ์ ์ผ๋ก ๋ณต์กํ์
# pipx โ ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ์ CLI ๋๊ตฌ ์ค์น (๊ณต์ ๊ถ์ฅ)
pipx install ruff
# uvx โ Rust ๊ธฐ๋ฐ์ผ๋ก ํจ์ฌ ๋น ๋ฅธ ๋์ (pipx ๋์ฒด)
uvx ruff check .pip vs pipx vs uvx
pip install: ํ์ฌ ํ๊ฒฝ์ ์ง์ ์ค์น. ์์กด์ฑ ์ถฉ๋ ์ํpipx install: ๋๊ตฌ๋ง๋ค ๊ฒฉ๋ฆฌ๋ ๊ฐ์ํ๊ฒฝ ์์ฑ. ์์ ํ์ง๋ง ๋๋ฆผuvx: pipx์ ๊ฐ์ ๊ฐ๋ ์ด์ง๋ง Rust ๊ธฐ๋ฐ์ผ๋ก 10~100๋ฐฐ ๋น ๋ฆ. 2026๋ ํ์ฌ ๊ฐ์ฅ ๊ถ์ฅ๋๋ ๋ฐฉ์
cargo / cargo-binstall โ Rust ์ํ๊ณ
- ์ธ์ด: Rust
- ๋ ์ง์คํธ๋ฆฌ: crates.io
- CLI ๋๊ตฌ ์ค์น:
cargo install <tool>๋๋cargo binstall <tool> - ์ฅ์ : ์ฑ๊ธ ๋ฐ์ด๋๋ฆฌ ์ถ๋ ฅ, ๋ฐ์ด๋ ์ฑ๋ฅ
- ๋จ์ :
cargo install์ ์์ค ์ปดํ์ผ์ด๋ผ ๋๋ฆผ, Rust ํด์ฒด์ธ ํ์
# ์์ค์์ ์ปดํ์ผ (๋๋ฆผ, Rust ํด์ฒด์ธ ํ์)
cargo install ripgrep
# ๋ฏธ๋ฆฌ ์ปดํ์ผ๋ ๋ฐ์ด๋๋ฆฌ ๋ค์ด๋ก๋ (๋น ๋ฆ, ํด์ฒด์ธ ๋ถํ์)
cargo binstall ripgrepcargo-binstall์ GitHub Releases์์ ๋ฏธ๋ฆฌ ๋น๋๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ฐพ์ ์ค์นํ๋ค. ๋ฐ์ด๋๋ฆฌ๊ฐ ์์ผ๋ฉด cargo install๋ก ํด๋ฐฑํ๋ค. Rust ๋๊ตฌ์ ์ง์
์ฅ๋ฒฝ์ ํฌ๊ฒ ๋ฎ์ถ ๋๊ตฌ๋ค.
go install โ ์ฑ๊ธ ๋ฐ์ด๋๋ฆฌ์ ๊ฐ์
- ์ธ์ด: Go
- CLI ๋๊ตฌ ์ค์น:
go install github.com/user/tool@latest - ์ฅ์ : ์ฑ๊ธ ์คํํฑ ๋ฐ์ด๋๋ฆฌ, ๋ฐํ์ ์์กด์ฑ ์์
- ๋จ์ : Go ํด์ฒด์ธ ํ์, ์ค์ง์ ๋ฐฐํฌ์๋ GoReleaser ํ์
# Go ๋ชจ๋์์ ์ง์ ์ค์น
go install github.com/junegunn/fzf@latestGo๋ ํฌ๋ก์ค์ปดํ์ผ์ด ๊ธฐ๋ณธ ๋ด์ฅ๋์ด ์์ด์ linux/darwin/windows x amd64/arm64 ์กฐํฉ์ ํ ๋ฒ์ ๋น๋ํ ์ ์๋ค. GoReleaser๋ฅผ ์ฐ๋ฉด GitHub Releases ์ ๋ก๋, Homebrew formula ์์ฑ, Docker ์ด๋ฏธ์ง ๋น๋๊น์ง ์๋ํ๋๋ค.
์ธ์ด๋ณ ํจํค์ง ๋งค๋์ ๋น๊ตํ
| ํญ๋ชฉ | npm | pip/uvx | cargo | go install |
|---|---|---|---|---|
| ๋ฐํ์ ํ์ | Node.js | Python | Rust ํด์ฒด์ธ | Go ํด์ฒด์ธ |
| ๋ฌด์ค์น ์คํ | npx | uvx, pipx | - | - |
| ๋ฐ์ด๋๋ฆฌ ์ถ๋ ฅ | JS (์ธํฐํ๋ฆฌํ ) | Python (์ธํฐํ๋ฆฌํ ) | ๋ค์ดํฐ๋ธ ๋ฐ์ด๋๋ฆฌ | ๋ค์ดํฐ๋ธ ๋ฐ์ด๋๋ฆฌ |
| ์ค์น ์๋ | ๋น ๋ฆ | uvx ๋น ๋ฆ / pip ๋ณดํต | binstall ๋น ๋ฆ / install ๋๋ฆผ | ๋ณดํต |
| ๋ฐฐํฌ ๋ง์ฐฐ | ๋งค์ฐ ๋ฎ์ | ๋ฎ์ | ๋ฎ์ | ๋ฎ์ (GoReleaser ํ์) |
4. ์์คํ ํจํค์ง ๋งค๋์ ๋น๊ต
์์คํ ํจํค์ง ๋งค๋์ ๋ ์ธ์ด์ ์ข ์๋์ง ์๊ณ OS ์์ค์์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ค์นํ๋ค. ์ฌ์ฉ์์๊ฒ ๋ณ๋ ๋ฐํ์์ ์๊ตฌํ์ง ์๋๋ค๋ ๊ฒ์ด ๊ฐ์ฅ ํฐ ์ฅ์ ์ด๋ค.
Homebrew โ macOS/Linux ๊ฐ๋ฐ์์ ๊ธฐ๋ณธ
brew install ripgrep
brew install --cask visual-studio-code- macOS ๊ฐ๋ฐ์์ ์ฌ์ค์ ํ์ค ํจํค์ง ๋งค๋์
- Linux ์ง์(Linuxbrew)๋ ์ฑ์ํด์ ธ macOS + Linux ์ปค๋ฒ ๊ฐ๋ฅ
- 2025๋ 11์ Homebrew 5.0์์ Linux ARM64 ์ง์ ์ถ๊ฐ
- ์ฐ๊ฐ 2.6์ต ๊ฑด ์ด์์ formula ์ค์น ์ด๋ฒคํธ (2025-2026 ๊ธฐ์ค)
Homebrew์ ๋๊ตฌ๋ฅผ ๋ฑ๋กํ๋ ค๋ฉด
๋ ๊ฐ์ง ๊ฒฝ๋ก๊ฐ ์๋ค.
- homebrew-core: ๊ณต์ ์ ์ฅ์์ PR์ ๋ณด๋ด๊ณ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์์ผ ํ๋ค. ํ์ง ๊ธฐ์ค์ด ๋๊ณ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.
- ๊ฐ์ธ tap:
homebrew-<name>GitHub ์ ์ฅ์๋ฅผ ๋ง๋ค๊ณ formula๋ฅผ ์์ฑํ๋ฉด ๋๋ค. ๋ฆฌ๋ทฐ ์์ด ๋ฐ๋ก ๋ฐฐํฌ ๊ฐ๋ฅ. GoReleaser๊ฐ ์ด ๊ณผ์ ์ ์๋ํํด์ค๋ค.
apt / dnf โ Linux ๋ฐฐํฌํ ๊ธฐ๋ณธ
# Debian/Ubuntu
sudo apt install ripgrep
# Fedora/RHEL
sudo dnf install ripgrep- OS์ ๊ธฐ๋ณธ ๋ด์ฅ๋์ด ์์ด ์ถ๊ฐ ์ค์น ๋ถํ์
- ์์คํ ๊น์์ด ํตํฉ๋์ด ์์กด์ฑ ๊ด๋ฆฌ๊ฐ ์ ๊ตํจ
- ๋๊ตฌ ์ ์์ ์ ์ฅ์์๋ .deb/.rpm ํจํค์ง ๋น๋, GPG ์๋ช , ์ ์ฅ์ ํธ์คํ ๋ฑ ๋ฐฐํฌ ๋ง์ฐฐ์ด ๋งค์ฐ ๋์
- ์ ๋ฐ์ดํธ ์ฃผ๊ธฐ๊ฐ ๋๋ ค์ ์ต์ ๋ฒ์ ๋ฐ์์ด ๋ฆ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์
Windows: Scoop / Chocolatey / winget
# winget โ Windows 11 ๊ธฐ๋ณธ ๋ด์ฅ
winget install ripgrep
# scoop โ ๊ฐ๋ฐ์ ์นํ์ , ๊ด๋ฆฌ์ ๊ถํ ๋ถํ์
scoop install ripgrep
# chocolatey โ ๊ฐ์ฅ ํฐ ํจํค์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ
choco install ripgrep| ํญ๋ชฉ | winget | scoop | chocolatey |
|---|---|---|---|
| ์ค์น ํ์ | Windows 11 ๊ธฐ๋ณธ | ๋ณ๋ ์ค์น | ๋ณ๋ ์ค์น |
| ๊ด๋ฆฌ์ ๊ถํ | ํ์ํ ์ ์์ | ๋ถํ์ | ํ์ |
| ํจํค์ง ์ | 8,000+ | ์ค๊ฐ | 10,000+ |
| ์ฑ๊ฒฉ | MS ๊ณต์ | ๊ฐ๋ฐ์ ์ค์ฌ, ๊น๋ | ๊ธฐ์ ์ค์ฌ |
์์คํ ํจํค์ง ๋งค๋์ ๋น๊ตํ
| ํญ๋ชฉ | brew | apt/dnf | winget | scoop |
|---|---|---|---|---|
| ํ๋ซํผ | macOS, Linux | Linux | Windows | Windows |
| ๋ฐฐํฌ ๋ง์ฐฐ | ์ค๊ฐ (tap์ ๋ฎ์) | ๋์ | ์ค๊ฐ | ๋ฎ์ |
| ์ ๋ฐ์ดํธ ์๋ | ๋น ๋ฆ | ๋๋ฆผ | ์ค๊ฐ | ๋น ๋ฆ |
| ๋ฐํ์ ์๊ตฌ | ์์ | ์์ | ์์ | ์์ |
5. ๋ฉํ ํด ๋งค๋์ ์ ๋ถ์
์ธ์ด๋ณ ํจํค์ง ๋งค๋์ ๊ฐ ๋์ด๋๋ฉด์ โNode 18, Python 3.12, Go 1.22๋ฅผ ๋์์ ๊ด๋ฆฌํ๊ณ ์ถ๋คโ๋ ์์๊ฐ ์๊ฒผ๋ค. ๋ฉํ ํด ๋งค๋์ ๋ ์ฌ๋ฌ ๋ฐํ์๊ณผ CLI ๋๊ตฌ์ ๋ฒ์ ์ ํ๋ก์ ํธ ๋จ์๋ก ๊ด๋ฆฌํด์ฃผ๋ ๋๊ตฌ๋ค.
asdf โ mise: ์ ๋์ฒด๋๊ณ ์๋๊ฐ
# asdf โ ์์กฐ ํ๋ฌ๊ทธ์ธ ๊ธฐ๋ฐ ๋ฒ์ ๋งค๋์
asdf install nodejs 20.11.0
asdf local nodejs 20.11.0
# mise โ asdf ํธํ์ด๋ฉด์ Rust ๊ธฐ๋ฐ์ผ๋ก 10~100๋ฐฐ ๋น ๋ฆ
mise install node@20
mise use node@20- asdf๋ ํ๋ฌ๊ทธ์ธ ์ํ๊ณ๊ฐ ํฌ์ง๋ง ์
ธ shim ๊ธฐ๋ฐ์ด๋ผ ๋๋ฆฌ๊ณ
.tool-versionsํ์ผ์ ์์กด - mise(๊ตฌ rtx)๋ Rust๋ก ์์ฑ๋์ด ํจ์ฌ ๋น ๋ฅด๊ณ , asdf ํ๋ฌ๊ทธ์ธ๊ณผ ํธํ๋๋ฉฐ,
.env์ง์๊ณผ ๋ด์ฅ task runner๊น์ง ์ ๊ณต - GitLab Development Kit๊ฐ asdf์์ mise๋ก ์ ํํ๋ ๋ฑ ์ค์ง์ ๋์ฒด๊ฐ ์งํ ์ค
aqua, proto: ์ ์ธ์ ๋ฒ์ ๊ด๋ฆฌ
# aqua.yaml โ ํ๋ก์ ํธ์ ํ์ํ ๋๊ตฌ๋ฅผ ์ ์ธ์ ์ผ๋ก ๊ด๋ฆฌ
registries:
- type: standard
ref: v4.155.1
packages:
- name: BurntSushi/ripgrep@14.1.0
- name: junegunn/fzf@0.46.1- aqua: Go๋ก ์์ฑ๋ ์ ์ธ์ CLI ๋ฒ์ ๋งค๋์ . ์ฒดํฌ์ฌ ๊ฒ์ฆ๊ณผ SLSA ์ถ์ฒ ์ฆ๋ช ์ง์์ด ๊ฐ์
- proto: moonrepo์์ ๋ง๋ Rust ๊ธฐ๋ฐ ๋ฉํฐ ์ธ์ด ๋ฒ์ ๋งค๋์ . Node.js, Python, Rust, Go ๋ฑ์ ํ๋๋ก ๊ด๋ฆฌ
Nix / Devbox: ์์ ํ ์ฌํ์ฑ
# Devbox โ Nix๋ฅผ ์ฝ๊ฒ ์ธ ์ ์๊ฒ ๊ฐ์ผ ๋๊ตฌ
devbox init
devbox add ripgrep nodejs python
devbox shell # ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ ์ง์
- Nix: 10๋ง ๊ฐ ์ด์์ ํจํค์ง๋ฅผ ๊ฐ์ง ์์ ์ฌํ ๊ฐ๋ฅํ ๋น๋ ์์คํ . โ๋ด ๋จธ์ ์์๋ ๋๋๋ฐโ๋ฅผ ์์ฒ ์ฐจ๋จ
- Devbox: Nix์ ํ์ต ๊ณก์ ์
devbox.jsonํ๋๋ก ๋จ์ํ. 40๋ง ๊ฐ ์ด์์ Nix ํจํค์ง๋ฅผ Nix ์ธ์ด ์์ด ์ฌ์ฉ ๊ฐ๋ฅ - Fedora 44๊ฐ Nix๋ฅผ ๊ณต์ ์ ์ฅ์์ ํฌํจ ์น์ธํ๋ ๋ฑ ์ํฐํ๋ผ์ด์ฆ ๋์ ์ด ๊ฐ์ํ๋๊ณ ์์
6. ๋๊ตฌ ๋ฐฐํฌ์์ ์ ํ์ง โ ๋ฐฐํฌ ๋ง์ฐฐ ๋น๊ต
๋๊ตฌ๋ฅผ ๋ง๋ ์ฌ๋์ด โ์ด๋๋ก ๋ฐฐํฌํ ๊นโ๋ฅผ ๊ฒฐ์ ํ ๋ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ ์ฒซ ๋ฐฐํฌ๊น์ง์ ๋ง์ฐฐ๊ณผ ์ ์ง๋ณด์ ๋ถ๋ด์ด๋ค.
| ํ๋ซํผ | ์ฒซ ๋ฐฐํฌ๊น์ง | ์ ์ง๋ณด์ ๋ถ๋ด | ํฌ๋ก์คํ๋ซํผ |
|---|---|---|---|
| npm | npm publish ํ ์ค | ๋ฎ์ | macOS/Linux/Windows |
| PyPI | wheel ๋น๋ + twine upload | ๋ฎ์ | macOS/Linux/Windows |
| crates.io | cargo publish | ๋ฎ์ (10MB ์ ํ) | macOS/Linux/Windows |
| Go ๋ชจ๋ | ํ๊ทธ push๋ง ํ๋ฉด ์๋ ์ธ๋ฑ์ฑ | ๊ฑฐ์ ์์ | macOS/Linux/Windows |
| Homebrew (tap) | GitHub ์ ์ฅ์ + formula ์์ฑ | ๋ฎ์ | macOS/Linux |
| Homebrew (core) | PR ์ ์ถ + ๋ฆฌ๋ทฐ ํต๊ณผ | ๋์ (์ ์ง๋ณด์ ์๋ฌด) | macOS/Linux |
| apt/dnf | .deb/.rpm ๋น๋ + GPG + ์ ์ฅ์ ํธ์คํ | ๋งค์ฐ ๋์ | Linux only |
| GitHub Releases | CI์์ ๋น๋ + ์ ๋ก๋ | ๋ฎ์ (GoReleaser ์ฌ์ฉ ์) | ์ ์ฒด |
| Docker Hub | docker build && docker push | ๋ฎ์ | Docker๊ฐ ์๋ ๊ณณ ์ด๋๋ |
npm์ ๋ฐฐํฌ ๋ง์ฐฐ์ด ๊ฐ์ฅ ๋ฎ๋ค๋ ๊ฒ์ด ๋ณด์ธ๋ค. ํนํ ๋ฐ์ด๋๋ฆฌ ์ปดํ์ผ ์์ด JS๋ง์ผ๋ก ๋ฐฐํฌํ ์ ์๋ค๋ ์ ์ด ๊ฐ์ธ ๊ฐ๋ฐ์์๊ฒ ๋งค๋ ฅ์ ์ด๋ค. ๋ฐ๋ฉด apt/dnf๋ ํจํค์ง ๋ณต์ก๋๊ฐ ๋์์ ๊ฐ์ธ์ด ๊ด๋ฆฌํ๊ธฐ ์ด๋ ต๋ค.
์ค๋ฌด์์์ ๋ฉํฐ์ฑ๋ ๋ฐฐํฌ
์ ๋ง๋ค์ด์ง ๋๊ตฌ๋ ํ๋์ ์ฑ๋์๋ง ์์กดํ์ง ์๋๋ค. ๋ํ์ ์ธ ํจํด์ ์ด๋ ๋ค.
- GitHub Releases์ ํ๋ซํผ๋ณ ๋ฐ์ด๋๋ฆฌ ์ ๋ก๋ (GoReleaser๋ก ์๋ํ)
- Homebrew tap์ formula ๋ฑ๋ก
- npm์ wrapper ํจํค์ง ๋ฐฐํฌ (optionalDependencies๋ก ๋ฐ์ด๋๋ฆฌ ํฌํจ)
- cargo-binstall / crates.io ๋ฑ๋ก (Rust ๋๊ตฌ์ธ ๊ฒฝ์ฐ)
- ํ์ํ๋ฉด Docker ์ด๋ฏธ์ง๋ ๋ฐฐํฌ
์ด ์ ์ฒด๋ฅผ CI ํ์ดํ๋ผ์ธ ํ๋๋ก ์๋ํํ๋ ๊ฒ์ด 2026๋ ํ์ฌ์ ํ์ค ๋ฐฐํฌ ๋ฐฉ์์ด๋ค.
7. ๋ณด์๊ณผ ๊ณต๊ธ๋ง ๊ณต๊ฒฉ
ํจํค์ง ๋งค๋์ ๊ฐ ํธ๋ฆฌํ ์๋ก ๊ณต๊ฒฉ ํ๋ฉด๋ ๋์ด์ง๋ค. ํนํ npm์ ๊ท๋ชจ๊ฐ ํฐ ๋งํผ ๊ฐ์ฅ ๋ง์ ๊ณต๊ฒฉ์ ๋ฐ๊ณ ์๋ค.
npm โ ๊ฐ์ฅ ํฐ ํ์
- 2025๋ 9์: ์ฃผ๊ฐ ๋ค์ด๋ก๋ ํฉ๊ณ 26์ต ๊ฑด์ธ 18๊ฐ ํจํค์ง๊ฐ ๋์์ ํ์ทจ๋จ. ํ์ดํฌ์ค์ฟผํ ์ด ์๋๋ผ ์ ์ง๋ณด์์์ ์๊ฒฉ ์ฆ๋ช ์ ์ง์ ํ์ทจํ ๊ณต๊ฒฉ
- Shai-Hulud ์ (2025๋ 9์): npm ์ต์ด์ ์๊ฐ ์ ํ ์. ๊ฐ์ผ๋ ํจํค์ง๊ฐ ์๋์ผ๋ก ๋ค๋ฅธ ํจํค์ง๋ฅผ ๊ฐ์ผ์์ผ 500๊ฐ ์ด์์ผ๋ก ํ์ฐ
- TeamPCP ์บ ํ์ธ (2026๋ 3-4์): axios(์ฃผ๊ฐ 1์ต ๋ค์ด๋ก๋), @bitwarden/cli ํ์ดํฌ์ค์ฟผํ ๊ณต๊ฒฉ. ํ์ทจ๋ publish ํ ํฐ์ผ๋ก ์์ฒ๋ผ ์ ํ
- 2025๋ 4๋ถ๊ธฐ ์ ์ฑ ํจํค์ง์ 99.8%๊ฐ npm์์ ๋ฐ์
PyPI, crates.io๋ ์์ ํ์ง ์๋ค
- PyPI: ML ๊ฐ๋ฐ์๋ฅผ ํ๊ฒ์ผ๋ก ํ ํ์ดํฌ์ค์ฟผํ ํจํค์ง 1๋ง ๊ฑด ์ด์ ๋ฐ๊ฒฌ (2025๋ )
- crates.io:
faster_log,async_println๋ฑ ์ํธํํ ํค ํ์ทจ ํจํค์ง ๋ฑ์ฅ (2025๋ 5์)
๋ฐฉ์ด์ ์ ํ์ค: Trusted Publishing (OIDC)
# GitHub Actions์์ npm์ ์ง์ ์ธ์ฆ (์ ์ฅ๋ ์ํฌ๋ฆฟ ์์ด)
- uses: actions/setup-node@v4
with:
registry-url: 'https://registry.npmjs.org'
- run: npm publish
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} # ๊ธฐ์กด ๋ฐฉ์
# Trusted Publishing โ ํ ํฐ ์์ฒด๊ฐ ๋ถํ์ (OIDC)
# npm, PyPI, crates.io ๋ชจ๋ ์ง์- GitHub Actions๊ฐ OIDC๋ก ๋ ์ง์คํธ๋ฆฌ์ ์ง์ ์ ์์ ์ฆ๋ช ํ๋ ๋ฐฉ์
- ์ ์ฅ๋ ์ํฌ๋ฆฟ ์์ฒด๋ฅผ ์์ฐ์ผ๋ก์จ ์๊ฒฉ ์ฆ๋ช ํ์ทจ ๊ณต๊ฒฉ์ ์์ฒ ์ฐจ๋จ
- npm์ ์ถ๊ฐ๋ก 2FA ํ์ํ, ํ ํฐ ์๋ช ๋จ์ถ(๊ธฐ๋ณธ 7์ผ, ์ต๋ 90์ผ), staged publishing(๋จ๊ณ์ ๋ฐฐํฌ)์ ๋์ ์ค
์ค์น ์ ํ์ธ ์ต๊ด
- ํจํค์ง ์ด๋ฆ ์คํ ํ์ธ (typosquatting ๋ฐฉ์ง)
- ๋ค์ด๋ก๋ ์, ๋ง์ง๋ง ์ ๋ฐ์ดํธ ๋ ์ง, ์ ์ง๋ณด์์ ์ ํ์ธ
npm audit/pip audit/cargo audit๋ก ์๋ ค์ง ์ทจ์ฝ์ ์ ๊ฒ- ๊ฐ๋ฅํ๋ฉด ๊ณต์ ๋ฌธ์์์ ์๋ดํ๋ ์ค์น ๋ฐฉ๋ฒ์ ์ฌ์ฉ
8. ํธ๋ ๋: npm์์ ๋ฐ์ด๋๋ฆฌ๋ก
JS ๋๊ตฌ์ Rust/Go ์ฌ์์ฑ ๋ฌผ๊ฒฐ
2025-2026๋ , JavaScript ์ํ๊ณ์ ํต์ฌ ๋๊ตฌ๋ค์ด Rust๋ Go๋ก ์ฌ์์ฑ๋๊ณ ์๋ค.
| ๊ธฐ์กด ๋๊ตฌ (JS) | ๋์ฒด ๋๊ตฌ (Rust/Go) | ์ฑ๋ฅ ์ฐจ์ด |
|---|---|---|
| ESLint + Prettier | Biome | 20๋ฐฐ ๋น ๋ฆ |
| ESLint | Oxlint (v1.0, 2025๋ 6์) | 50~100๋ฐฐ ๋น ๋ฆ |
| webpack | Rspack, Turbopack | 10๋ฐฐ ์ด์ ๋น ๋ฆ |
| Babel | SWC | 20๋ฐฐ ๋น ๋ฆ |
| Rollup | Rolldown | ์๋ฐฐ ๋น ๋ฆ |
์ด ๋๊ตฌ๋ค์ Rust๋ก ์์ฑ๋์์ง๋ง ์ฌ์ ํ npm์ผ๋ก๋ ๋ฐฐํฌ๋๋ค. optionalDependencies ํจํด์ผ๋ก ํ๋ซํผ๋ณ ๋ฐ์ด๋๋ฆฌ๋ฅผ npm ํจํค์ง ์์ ๊ฐ์ธ๋ ๋ฐฉ์์ด๋ค. npm์ ๋๋ฌ ๋ฒ์๋ฅผ ํฌ๊ธฐํ์ง ์์ผ๋ฉด์ ๋ค์ดํฐ๋ธ ์ฑ๋ฅ์ ์ ๊ณตํ๋ ์ ๋ต์ด๋ค.
๊ฐ๋ณ ๋๊ตฌ๋ฅผ ๋์ด ๋ฐํ์ ์ฐจ์์ ์์ง์๋ ์๋ค. Zig๋ก ์์ฑ๋ Bun์ ๋ฐํ์, ํจํค์ง ๋งค๋์ , ๋ฒ๋ค๋ฌ, ํ ์คํธ ๋ฌ๋๋ฅผ ํ๋์ ๋ฐ์ด๋๋ฆฌ๋ก ๋ฌถ์ด Node.js ๊ธฐ๋ฐ ๋๊ตฌ ์ฒด์ธ ์ ์ฒด๋ฅผ ๋์ฒดํ๋ ์ ๊ทผ์ ์ทจํ๋ค.
cargo-binstall์ ์๋ฏธ
Rust CLI ๋๊ตฌ๋ฅผ ์ค์นํ ๋ ๊ฐ์ฅ ํฐ ์ง์ ์ฅ๋ฒฝ์ โRust ํด์ฒด์ธ์ ์ค์นํด์ผ ํ๋คโ๋ ์ ์ด์๋ค. cargo-binstall์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค. GitHub Releases์์ ๋ฏธ๋ฆฌ ๋น๋๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ฐพ์ ์ค์นํ๋ฏ๋ก Rust๋ฅผ ๋ชฐ๋ผ๋ Rust ๋๊ตฌ๋ฅผ ์ธ ์ ์๋ค.
# Rust ํด์ฒด์ธ ์์ด๋ Rust ๋๊ตฌ ์ค์น ๊ฐ๋ฅ
cargo binstall ripgrep bat fd-findJSR (JavaScript Registry)์ ๋ฑ์ฅ
2024๋ 3์ ์ถ์๋ JSR์ TypeScript ์ฐ์ ๋ ์ง์คํธ๋ฆฌ๋ค. npm์ ๋์ฒดํ๋ ๊ฒ์ด ์๋๋ผ ๋ณด์ํ๋ ์์น๋ค.
- TypeScript๋ฅผ ์ง์ ์ ๊ณต (Deno์์๋ ๊ทธ๋๋ก, Node.js์์๋ ์๋ ํธ๋์คํ์ผ)
- ์๋ API ๋ฌธ์ ์์ฑ
- 2026๋ ์ด ๊ธฐ์ค 4๋ง ๊ฐ ์ด์์ ํจํค์ง
- ์คํ ๊ฑฐ๋ฒ๋์ค ๋ณด๋ ์ค๋ฆฝ
ํ๋ฆ ์ ๋ฆฌ
npm์ด CLI ๋๊ตฌ ๋ฐฐํฌ์์ ์ฐจ์งํ๋ ๋น์ค์ ์ฌ์ ํ ํฌ์ง๋ง, ์๋ก ๋ง๋ค์ด์ง๋ ๋๊ตฌ๋ค์ ์ ์ ๋ค์ดํฐ๋ธ ๋ฐ์ด๋๋ฆฌ๋ก ์ด๋ํ๊ณ ์๋ค. ๋ฐฐํฌ ์ฑ๋๋ ๋ค์ํ๋์ด โnpm ํ๋๋ง์ผ๋ก ๋ฐฐํฌโ๊ฐ ์๋๋ผ โGitHub Releases + brew + npm + cargo๋ฅผ ๋์์โ๊ฐ ํ์ค์ด ๋์ด๊ฐ๊ณ ์๋ค.
๊ฐ๋ฐ์ ์ ์ฅ์์๋ npm๋ง ์์๋ ๋๋ถ๋ถ์ ๋๊ตฌ๋ฅผ ์ค์นํ ์ ์์ง๋ง, brewยทmiseยทcargo-binstall ๊ฐ์ ๋์์ ์์๋๋ฉด ๋ ๊ฐ๋ณ๊ณ ๋น ๋ฅธ ์ค์น๊ฐ ๊ฐ๋ฅํ๋ค.