Post

Mise로 통합 런타임 버전 관리하기

nvm, gvm, pyenv, SDKMAN, asdf, direnv를 대체하는 올인원 개발 도구 mise의 사용법과 장점을 정리합니다

Mise란 무엇인가?

Mise(프랑스어 ‘mise en place’에서 유래, 발음은 ‘meez’)는 개발 환경을 일관되고 편리하게 관리하기 위한 차세대 CLI 도구입니다. 기존에는 언어별로 각각 독립된 버전 관리 도구를 사용하고, 환경 변수 제어를 위해 다른 도구를 붙이고, 태스크 실행을 위해 또 다른 도구를 써야 했습니다.

Mise는 이 모든 역할을 단 하나의 도구로 통합합니다.

1
Mise = Tools + Env + Tasks

Mise가 제공하는 핵심 기능 3가지는 다음과 같습니다.

  1. Tools: Node.js, Python, Java, Go, Terraform, kubectl은 물론 빌드 도구인 gradle, Python 초고속 패키지 관리자인 uv 등 900개 이상의 다양한 개발 도구와 런타임 버전을 관리하고 디렉터리 이동 시 자동으로 버전을 전환합니다.
  2. Env: 프로젝트 디렉터리별로 필요한 환경 변수를 자동으로 활성화하고 제어합니다.
  3. Tasks: 빌드, 테스트, 린트, 배포 등 프로젝트의 반복 명령어를 정의하고 도구 및 환경 변수 맥락을 유지한 상태로 실행합니다.

기존 도구들과의 비교

개발자들은 오랫동안 각 언어별 버전 관리 도구나 환경 관리 도구를 조합해 사용해 왔습니다. 아래 비교를 통해 Mise가 어떤 장점을 제공하는지 확인해 볼 수 있습니다.

언어별 버전 관리 도구와의 비교 (nvm, pyenv, SDKMAN 등)

비교 항목nvm / pyenv / SDKMAN / gvmMise
지원 범위특정 단일 언어 중심여러 언어 및 900+개 도구 통합 지원
설정 파일도구별로 개별 파일 사용 (예: .nvmrc, .python-version)mise.toml 하나로 통합 관리
속도 및 성능셸 스크립트 기반이 많아 속도가 비교적 느림Rust로 작성되어 매우 빠르고 가벼움
환경 변수 관리불가능 (별도 도구 필요)내장 기능으로 기본 지원
태스크 실행기없음내장 기능으로 기본 지원

통합 버전 관리 도구와의 비교 (asdf)

Mise는 asdf의 설정을 그대로 호환하면서도 한층 더 진화한 기능을 제공합니다.

비교 항목asdfMise
설정 파일.tool-versions만 사용 가능mise.toml 기반의 선언적 설정 지원 (asdf 파일도 호환)
언어/런타임 관리가능가능
구현 언어Bash 셸 스크립트 위주Rust 기반 (asdf 대비 최대 수십 배 속도 향상)
환경 변수 관리제한적 또는 플러그인 필요기본 제공 (config 파일의 env 섹션)
태스크 실행기없음기본 제공 (config 파일의 tasks 섹션)

환경 변수 관리 도구와의 비교 (direnv)

디렉터리 진입 시 자동으로 환경 변수를 동기화해 주는 direnv의 기능 역시 대체할 수 있습니다.

비교 항목direnvMise
디렉터리별 환경 변수가능 (.envrc 활용)가능 (mise.toml, .env 등 연동)
도구 및 런타임 관리불가능가능
태스크 실행기불가능가능

설치 및 셸 활성화 설정

설치 방법

macOS (Homebrew)

1
brew install mise

Windows (Chocolatey)

1
choco install mise

Linux / WSL (curl 설치)

1
curl https://mise.run | sh

설치 완료 후 아래 명령어로 정상 작동하는지 검증합니다.

1
2
mise --version
mise doctor

셸 활성화 (Shell Activation)

디렉터리를 이동할 때 자동으로 런타임과 환경 변수가 활성화되도록 사용 중인 셸에 설정을 추가해야 합니다.

zsh (macOS 기본)

1
2
echo 'eval "$(mise activate zsh)"' >> ~/.zshrc
source ~/.zshrc

bash

1
2
echo 'eval "$(mise activate bash)"' >> ~/.bashrc
source ~/.bashrc

fish

1
echo 'mise activate fish | source' >> ~/.config/fish/config.fish

Windows 환경

Windows Command Prompt나 PowerShell을 사용하는 경우, 다음 경로를 환경 변수 PATH에 추가해야 합니다.

1
<homedir>\AppData\Local\mise\shims

셸 활성화를 사용하지 않고 명시적으로 도구를 실행하고 싶다면 mise exec 또는 mise run 명령어를 사용할 수도 있습니다.


기본 개념: 설정 파일의 계층 구조

Mise는 글로벌 설정과 프로젝트별 설정을 명확히 구분하여 적용합니다.

구분설명설정 파일 경로
Global모든 프로젝트와 셸에 공통으로 적용되는 런타임 및 기본 설정~/.config/mise/config.toml
Project해당 프로젝트 디렉터리 하위에서만 적용되는 설정mise.toml 또는 .mise.toml
Local 전용개인 로컬 전용으로, Git에 커밋하지 않고 로컬에서만 덮어쓸 설정mise.local.toml

Mise는 mise.toml 외에도 이전 도구와의 호환을 위해 .tool-versions 파일을 지원하지만, 환경 변수와 태스크 실행 등 통합 관리를 위해서 mise.toml 사용이 적극 권장됩니다.


런타임 버전 관리 실무

1. 설치 가능한 버전 조회

mise ls-remote 명령어로 런타임별 설치 가능한 버전을 확인합니다.

1
2
3
4
mise ls-remote python | tail -3
# 3.13.3
# 3.13.4
# 3.13.5

gradle이나 uv 같은 빌드 도구와 패키지 매니저 역시 버전을 손쉽게 조회할 수 있습니다.

1
2
3
4
5
6
7
8
9
mise ls-remote gradle | tail -3
# 8.12
# 8.12.1
# 8.13

mise ls-remote uv | tail -3
# 0.5.24
# 0.5.25
# 0.5.26

2. 글로벌(Global) 버전 설정

시스템 전역에서 기본값으로 사용할 버전을 지정하려면 -g 또는 --global 옵션을 사용합니다.

1
2
3
mise use -g python@3.13
mise use -g node@24
mise use -g gradle@8.13

이 설정은 ~/.config/mise/config.toml에 자동 기록됩니다.

3. 프로젝트별 버전 설정

프로젝트 루트 폴더로 이동한 후 -g 옵션 없이 mise use를 실행하면 해당 폴더에 mise.toml이 생성되고 기록됩니다.

1
2
3
cd my-project
mise use node@18
mise use uv@0.5

4. 설정 및 활성화 목록 확인

현재 실제로 활성화되어 작동 중인 도구 목록과 설정 소스는 mise ls로 조회합니다.

1
2
3
4
5
6
7
mise ls
# Tool   Version  Source                         Requested
# node   18.20.8  ~/work/my-project/mise.toml    18
# uv     0.5.26   ~/work/my-project/mise.toml    0.5
# node   24.4.1   ~/.config/mise/config.toml     24
# python 3.13.5   ~/.config/mise/config.toml     3.13
# gradle 8.13.0   ~/.config/mise/config.toml     8.13

5. 선언된 런타임 일괄 설치

프로젝트 소스코드를 처음 내려받은 후, mise.toml에 명시된 버전들을 한 번에 설치할 수 있습니다.

1
mise install

6. 버전 제거 및 업그레이드

  • 비활성화: mise unuse python@3.12
  • 완전 제거: mise uninstall python@3.13.5 (또는 mise rm python@3.13.5)
  • 최신 업데이트 확인: mise outdated
  • 버전 업그레이드: mise upgrade (또는 mise up)

고급 환경 변수 제어

단순히 KEY=VALUE 형태로 환경 변수를 로드하는 것뿐만 아니라 강력한 부가 기능을 제공합니다.

환경 변수 기본 제어

1
2
mise set DB_USER=root
mise set DB_PASS=1234

위와 같이 설정하면 mise.toml[env] 영역에 값이 저장되며, mise set 명령만 입력하여 현재 선언된 목록을 확인할 수 있습니다. 삭제는 mise unset DB_PASS로 수행합니다.

필수 환경 변수 검증 (Required)

애플리케이션 실행을 위해 꼭 필요한 API 키나 데이터베이스 연결 문자열이 누락되는 상황을 막기 위해 필수 설정을 지정할 수 있습니다.

1
2
3
[env]
DATABASE_URL = { required = true }
API_KEY = { required = "외부 API 콘솔에서 발급받은 API 키를 설정해주세요." }

해당 폴더 진입 시 필수 환경 변수가 정의되지 않았다면 경고 또는 에러를 발생시켜 안전한 구동을 돕습니다.

기존 .env 파일 로드

기존에 사용하던 외부 .env 파일을 활용하고 싶다면 mise.toml에서 로드 경로를 지정해 줄 수 있습니다.

1
2
[env]
_.file = ".env"

민감 정보 격리와 개인 로컬 설정

API 키나 원격 데이터베이스 암호 같은 민감한 정보는 소스코드 공유 대상이 아니므로 mise.toml에 직접 적지 말아야 합니다. 이를 위해 공통 구조는 mise.toml에 정의하고, 구체적인 값은 Git 추적에서 제외되는 mise.local.toml 혹은 .env에 정의하는 개발 흐름이 권장됩니다.

1
2
3
my-project/
├── mise.toml         (Git 커밋: 필수 변수명 선언 및 공통 환경 설정)
└── mise.local.toml   (Git 제외: 로컬 전용 및 실제 보안 관련 값 입력)

태스크 러너(Task Runner) 활용

Mise는 반복적으로 실행되는 빌드, 테스트, 포맷팅, 배포 스크립트를 관리하기 위한 훌륭한 태스크 러너 기능도 내장하고 있습니다.

기본 태스크 정의와 실행

mise.toml 파일에 [tasks.<이름>] 형식으로 스크립트를 작성합니다.

1
2
3
[tasks.hello]
description = "인사말을 출력하는 간단한 테스트 태스크"
run = "echo '안녕하세요, Mise 태스크입니다!'"

실행은 아래 명령을 사용합니다.

1
mise run hello

태스크 상세 기능과 기법

1. 여러 명령 순차 실행

run 속성에 리스트 형식을 부여하면 순서대로 실행됩니다.

1
2
3
4
5
6
7
8
[tasks.ci]
description = "CI 통합 검증 절차"
run = [
  "npm ci",
  "npm run lint",
  "npm test",
  "npm run build"
]

2. 태스크 간 의존성 설정 (depends)

태스크가 실행되기 전에 반드시 먼저 실행되어야 하는 선행 태스크를 정의할 수 있습니다.

1
2
3
4
5
6
7
8
[tasks.install]
description = "패키지 의존성 설치"
run = "npm install"

[tasks.test]
description = "테스트 구동"
depends = ["install"]
run = "npm test"

3. 모노레포 구조 및 실행 디렉터리 설정 (dir)

프로젝트 하위 폴더별로 다른 명령을 내려야 하는 모노레포 구조에서 매우 강력하게 작동합니다.

1
2
3
4
5
6
7
8
9
10
11
[tasks.frontend-dev]
description = "프론트엔드 개발 서버 시작"
dir = "frontend"
run = "npm run dev"
alias = "fe"

[tasks.backend-dev]
description = "백엔드 스프링부트 서버 구동"
dir = "backend"
run = "gradle bootRun"
alias = "be"

축약어(alias)를 지원하여 mise run femise run be로 신속하게 태스크를 구동할 수 있습니다.

4. 파일 기반 태스크 분리 (File Task)

태스크 동작이 복잡하고 라인이 길어질 때, TOML 파일 내부에 길게 적는 것보다 셸 스크립트 파일로 작성해 분리하는 것이 좋습니다.

  • 파일 경로 예시: mise-tasks/build ```bash #!/usr/bin/env bash #MISE description=”프로젝트 빌드 수행 스크립트” #MISE alias=”b”

set -euo pipefail npm run build

1
2
3
4
5
6
7
8
9
10
파일에 실행 권한(`chmod +x`)을 부여해 두면 `mise run build` 명령 실행 시 자동으로 감지하여 구동됩니다.

#### 5. 파일 변경 모니터링 (Watch 모드)
`sources`와 `outputs` 속성을 선언하면 입력 대상 소스코드 변경을 감지해 태스크를 재실행할 수 있습니다.
```toml
[tasks.build]
description = "빌드 및 감지"
run = "npm run build"
sources = ["src/**/*", "package.json"]
outputs = ["dist"]

셸 환경에서 mise watch build를 실행하면 파일 변화가 감지될 때마다 빌드가 다시 유발됩니다.


모범 사례: 풀스택 프로젝트 환경 예시 (Node.js + Spring Boot + uv)

프론트엔드는 Node.js(Vite 등), 백엔드는 Java(Spring Boot), 그리고 데이터 분석 및 자동화 스크립트 처리를 위해 Python(uv 패키지 매니저)으로 구성된 종합 프로젝트의 표준 설정 예시입니다.

mise.toml (공통 공유 파일)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[tools]
node = "20"
java = "21"
gradle = "8.13"
python = "3.12"
uv = "0.5"

[env]
SPRING_PROFILES_ACTIVE = "local"
DATABASE_URL = { required = "로컬 환경에 맞는 데이터베이스 접속 주소를 mise.local.toml 또는 .env 파일에 구성해주세요." }

[tasks.setup]
description = "전체 환경 초기 설정"
run = [
  "cd frontend && npm install",
  "gradle dependencies",
  "uv sync"
]

[tasks.fe]
description = "프론트엔드 서버 실행"
dir = "frontend"
run = "npm run dev"

[tasks.be]
description = "백엔드 서버 실행"
run = "gradle bootRun"

[tasks.analyze]
description = "Python 분석 스크립트 구동 (uv 사용)"
run = "uv run python scripts/analyze.py"

[tasks.test]
description = "프론트 및 백엔드 통합 테스트 실행"
run = [
  "cd frontend && npm test",
  "gradle test"
]

.gitignore 추가 권장 설정

1
2
.env
mise.local.toml

JetBrains IntelliJ 연동 가이드

IntelliJ 플러그인을 활성화하면 Mise를 통해 설치된 Java, Node.js 등의 SDK 경로를 IDE 내에서 자동으로 인식시킬 수 있어 매우 편리합니다.

  1. IntelliJ에서 Settings / Preferences > Plugins 로 이동합니다.
  2. Marketplace에서 Mise를 검색한 후 설치합니다.
  3. IDE 설정 창에 생성된 Mise 설정 항목에서 로컬 시스템의 mise 실행 파일 경로를 지정해 줍니다.
  4. 프로젝트 설정을 다시 열면, Java SDK 목록에서 Mise가 관리하는 JDK(예: .local/share/mise/installs/java/...)를 자동으로 찾아내어 선택할 수 있게 됩니다.
  5. 관련 공식 가이드: https://mise.en.dev/lang/java.html

개발팀 README 권장 작성 템플릿

협업 프로젝트의 온보딩 장벽을 획기적으로 낮추기 위해 README.md에 추가하기 좋은 환경 가이드 양식입니다.

1
2
3
4
5
6
7
8
9
10
11
## 개발 환경 셋업 가이드

이 프로젝트는 개발 도구 버전 관리, 환경 변수 자동화, 반복 태스크 관리를 위해 `mise`를 사용합니다.

### 1. mise 설치 및 활성화
- macOS: `brew install mise`
- Linux: `curl https://mise.run | sh`

사용 중인 셸 설정 파일(예: `~/.zshrc`)의 맨 하단에 다음 줄을 추가합니다.
```sh
eval "$(mise activate zsh)"

2. 필요한 개발 도구 일괄 설치

프로젝트 루트 디렉터리에서 다음 명령을 실행하여 버전을 맞춥니다.

1
mise install

3. 로컬 전용 설정 파일 구성

.env.example을 복사하여 .env를 만들거나, mise.local.toml을 루트에 생성해 로컬 DB 커넥션 등의 개별 설정 값을 입력합니다.

4. 프로젝트 개발 서버 구동

  • 프론트엔드 구동: mise run fe
  • 백엔드 구동: mise run be
  • 분석 스크립트 실행: mise run analyze
  • 전체 테스트: mise run test

정리

Mise는 단순한 버전 스위칭 도구의 영역을 넘어 전체 개발 흐름을 통합적으로 관리하고 표준화할 수 있는 강력한 대안입니다. 개인의 로컬 편의성 향상뿐 아니라, 협업 프로젝트 팀 전반의 개발 온보딩을 단순화하고, 배포 스크립트와 실행 방식을 단일 설정 파일(mise.toml)로 통일하여 예측 가능한 개발 파이프라인을 구축해 보시기 바랍니다.

출처

This post is licensed under CC BY 4.0 by the author.