Mise: 통합 런타임 버전 관리 (끝판왕)
여러 프로그래밍 언어를 자유자재로 넘나드는 풀스택 개발자들에게는 다양한 런타임의 버전을 관리하는 게 쉽지 않죠? 대개는 Node.js는 nvm, Python은 pyenv, Java는 SDKMAN과 같은 런타임 매니저를 사용해서 버전을 관리하실 거예요. 하지만 이 역시도 프로그래밍 언어마다 관리 도구와 설정 파일이 달라서 정신이 혼미해질 때가 있죠. 😵💫
Mise는 이러한 런타임 버전 관리에 대한 고민에 해결해주는 끝판왕 도구인데요. Mise만 있으면 하나의 표준화된 방식으로 여러 프로그래밍 언어의 런타임 버전을 빠르고 간편하게 관리할 수 있답니다.
Mise 설치
Mise는 크로스 플랫폼 CLI(커맨드 라인 인터페이스) 도구로서 대부분의 운영 체제룰 지원합니다.
macOS에서는 Homebrew를 통해서 손쉽게 설치할 수 있고요.
$ brew install mise
Windows에서는 Chocolatey로 설치하시면 됩니다.
$ choco install mise
Linux 계열 운영체제나 Windows에서 WSL(Windows Subsystem for Linux)를 사용하시는 분은 curl
명령어로 설치하시면 됩니다.
$ curl https://mise.run | sh
설치 후에는 새로운 쉘을 열 때마다 Mise가 자동으로 활성화될 수 있도록 RC 파일에 설정을 추가해 줍니다.
macOS에서 Zsh를 쓰시면서 Homebrew로 설치하신 분들은 다음 명령어를 실행하시고요.
$ echo 'eval "$(mise activate zsh)"' >> ~/.zshrc
Linux에서 Bash를 쓰시면서 curl로 설치하신 분들은 다음 명령어를 실행해주세요.
$ echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc
Windows에서는 <homedir>\AppData\Local\mise\shims
경로를 PATH
환경 변수에 추가해줍니다.
설치 가능한 버전 확인
Mise로 런타임을 설치하려면 우선 어떤 버전을 설치해야 할지 알아야겠죠?
mise ls-remote
명령어를 사용하면 현재 설치 가능한 버전을 시간 순으로 나열해줍니다.
예를 들어, 현재 이 글을 쓰고 있는 시점에서 설치 가능한 주요 프로그래밍 언어 별 런타임 버전을 확인해보겠습니다.
$ mise ls-remote python |tail -10
3.13.0
3.13-dev
3.13.1
3.13.2
3.13.3
3.13.4
3.13.5
3.14.0b4
3.14-dev
3.15-dev
$ mise ls-remote java |tail -10
21.0.1
21.0.2
22.0.0
22.0.1
22.0.2
23.0.0
23.0.1
24.0.0
24.0.1
24.0.2
$ mise ls-remote node |tail -10
23.11.0
23.11.1
24.0.0
24.0.1
24.0.2
24.1.0
24.2.0
24.3.0
24.4.0
24.4.1
$ mise ls-remote bun |tail -10
1.2.9
1.2.10
1.2.11
1.2.12
1.2.13
1.2.14
1.2.15
1.2.16
1.2.17
1.2.18
명령어의 결과로 버전이 너무 많이 나오기 때문에 | tail -10
을 붙여서 가장 최근 10개의 버전만 출력하였습니다.
현재 설치 가능한 버전이
전역 런타임 버전 관리
먼저 전역에서 Mise를 사용하여 어떻게 런타임 버전을 관리할 수 있는지 알아볼까요?
프로그래밍 언어의 런타임을 전역에서 사용하려면 mise use
명령어를 --global
옵션과 함께 사용합니다.
줄여서 mise u
명령어를 -g
옵션과 함께 사용해도 됩니다.
버전 번호는 언어 이름 뒤에 @
기호로 기분해서 언어@버전
형태로 명시하면 되는데요.
버전을 명시하지 않으면 현재 시점에서 최신 버전이 선택됩니다.
그리고 꼭 전체 버전을 명시할 필요는 없고, 메이저나 마이너 버전까지만 표시하면 그 범위 내에서 최신 버전을 사용합니다.
예를 들어, Python v3.13, Java v22, Node.js v24과 Bun 최신 버전을 사용해보겠습니다. 아직 설치되어 있지 않은 런타임 버전은 사용하기 전에 먼저 다운로드 후 설치가 됩니다.
$ mise use -g python@3.13
mise python@3.13.5 ✓ installed mise ~/.config/mise/config.toml tools: python@3.13.5
$ python --version
Python 3.13.5
$ mise use -g java@22
mise use -g java@22
mise To enable macOS integration, run the following commands:
sudo mkdir /Library/Java/JavaVirtualMachines/22.0.2.jdk
sudo ln -s /Users/dale/.local/share/mise/installs/java/22.0.2/Contents /Library/Java/JavaVirtualMachines/22.0.2.jdk/Contents
openjdk version "22.0.2" 2024-07-16
OpenJDK Runtime Environment (build 22.0.2+9-70)
OpenJDK 64-Bit Server VM (build 22.0.2+9-70, mixed mode, sharing)
mise java@22.0.2 ✓ installed mise ~/.config/mise/config.toml tools: java@22.0.2
$ java --version
openjdk 22.0.2 2024-07-16
OpenJDK Runtime Environment (build 22.0.2+9-70)
OpenJDK 64-Bit Server VM (build 22.0.2+9-70, mixed mode, sharing)
$ mise use -g node@24
mise use node@24
mise node@24.4.1 ✓ installed mise ~/.config/mise/config.toml tools: node@24.4.1
$ node -v
v24.4.1
$ mise use -g bun
mise bun@1.2.18 ✓ installed mise ~/.config/mise/config.toml tools: bun@1.2.18
$ bun -v
1.2.18
런타임의 설치 및 사용 설정이 끝나고 나서 mise ls
명령어를 치면 현재 전역에서 사용 중인 모든 런타임과 버전이 일목요연하게 출력됩니다.
Requested 열에는 mise use
를 통해서 지정했던 버전이 나오고, Version 열에는 실제로 컴퓨터에 설치된 정확한 전체 버전이 나옵니다.
$ mise ls
Tool Version Source Requested
bun 1.2.18 ~/.config/mise/config.toml latest
java 22.0.2 ~/.config/mise/config.toml 22
node 24.4.1 ~/.config/mise/config.toml 24
python 3.13.5 ~/.config/mise/config.toml 3.13
참고로 전역 런타임의 버전은 ~/.config/mise/config.toml
설정 파일을 통해서 관리됩니다.
--global
줄여서 -g
옵션을 줘서 실행한 명령어는 모두 이 곳에 반영된다고 보면 됩니다.
$ cat ~/.config/mise/config.toml
[tools]
bun = "latest"
java = "22"
node = "24"
python = "3.13"
프로젝트 별 런타임 버전 관리
전역에서는 최신 버전의 런타임을 사용하더라도, 프로젝트에서는 상황에 따라 구 버전을 사용해야하는 경우도 있습니다. 게다가 같은 프로그래밍 언어로 여러 프로젝트에서 개발하는 경우, 프로젝트로 별로 사용해야 하는 런타임 버전이 상이할 수 있죠.
Mise를 활용하면 프로젝트 별로도 아주 깔끔하고 유연하게 런타임 관리를 할 수 있습니다.
방법이 정말 간단한데요.
프로젝트 폴더에 들어가 --global
옵션없이 mise use
명령어로 원하는 버전의 런타임을 지정해주기만 하면 됩니다.
예를 들어, our-project
폴더 안에 있는 프로젝트의 Node.js 버전을 v18로 지정해보겠습니다.
Node.js 18이 이미 설치되어 있지 않은 경우에는 마찬가지로 먼저 다운로드 및 설치가 진행됩니다.
$ cd our-project
$ mise use node@18
mise node@18.20.8 ✓ installed mise ~/work/our-project/mise.toml tools: node@18.20.8
프로젝트에서 사용되고 있는 Node.js을 버전을 확인해보면, 전역에서 설치했던 v24가 아니라 v18이 확인되죠?
$ node -v
v18.20.8
mise ls
명령어를 실행해보시면 이제 Node.js v18이 활성화되어 있는 것을 볼 수 있습니다.
$ mise ls
Tool Version Source Requested
bun 1.2.18 ~/.config/mise/config.toml latest
java 22.0.2 ~/.config/mise/config.toml 22
node 18.20.8 ~/work/our-project/mise.toml 18
node 24.4.1
python 3.13.5 ~/.config/mise/config.toml 3.13
프로젝트 별 런타임 버전은 프로젝트의 최상위 디렉토리에 있는 mise.toml
설정 파일에 저장됩니다.
우리가 방금 설치한 Node.js 런타임의 버전이 18로 등록되어 있습니다.
$ cat mise.toml
[tools]
node = "18"
해당 프로젝트에서 버전을 지정해주지 않은 런타임은 전역에서 설치한 버전이 그대로 사용됩니다. 예를 들어, Python 버전을 확인해보면 전역에서 설치했던 버전과 동일한 것을 볼 수 있습니다.
$ python --version
Python 3.13.5
실제로 이럴 확률이 적겠지만 실습을 위해서 동일한 프로젝트에 Python v3.12도 설치해볼께요.
$ mise use python@3.12
mise python@3.12.11 ✓ installed mise ~/work/our-project/mise.toml tools: python@3.12.11
다시 Python 버전을 확인해보면 이번에는 버전이 v3.12로 떨어진 것을 볼 수 있습니다.
$ python --version
Python 3.12.11
다시 mise.toml
설정 파일을 확인해보면 우리가 방금 설치한 Python 런타임의 버전이 추가된 것을 볼 수 있을 것입니다.
$ cat mise.toml
[tools]
node = "18"
python = "3.12"
mise ls
명령어를 통해서도 Python이 v3.13이 아닌 v3.12가 활성화되어 있다는 것을 알 수 있습니다.
$ mise ls
Tool Version Source Requested
bun 1.2.18 ~/.config/mise/config.toml latest
java 22.0.2 ~/.config/mise/config.toml 22
node 18.20.8 ~/work/our-project/mise.toml 18
node 24.4.1
python 3.12.11 ~/work/our-project/mise.toml 3.12
python 3.13.5
협업 프로젝트에서는 mise.toml
파일을 GitHub와 같은 코드 저장소에 올려두는 것이 권장됩니다.
그러면 동료 개발자가 처음으로 코드 저장소를 로컬에 복제하고 mise ls
명령어를 실행하면 누락된 런타임이 표시되거든요.
$ mise ls
Tool Version Source Requested
node 18.20.8 (missing) ~/work/our-project/mise.toml 18
python 3.12.11 (missing) ~/work/our-project/mise.toml 3.12
이때 mise install
또는 줄여서 mise i
명령어를 실행하면 프로젝트에 필요한 정확한 버전의 런타임을 일괄로 설치할 수 있습니다. CI 환경에서도 같은 방법으로 항상 동일한 런타임이 설치되도록 보장할 수 있겠죠?
$ mise install
mise python@3.12.11 ✓ installed
mise node@18.20.8 ✓ installed
자 이제, 프로젝트 디렉토리를 나가서 다시 Node.js나 Python 버전을 확인해보시면 전역에서 설치한 버전이 확인될 거에요. Mise가 자동으로 현재 경로에 보고 프로젝트 안에 있는지 밖에 있는지 파악하여 정확한 버전을 잡아주기 때문입니다.
$ cd ..
$ node -v
v24.4.1
$ python --version
Python 3.13.5
너무 편리하죠? 😍
보너스: 환경 변수 관리
Mise를 사용하면 런타임 버전과 환경 변수 관리를 같이 할 수도 있습니다.
새로운 환경 변수를 추가할 때는 mise set
명령어 뒤에 이름=값
형태로 명시해줍니다.
$ mise set DB_USER=root
$ mise set DB_PASS=1234
$ echo $DB_USER $DB_PASS
root 1234
mise set
명령어에 아무 인자도 넘기지 않으면 Mise를 통해 관리되고 있는 모든 환경 변수를 확인할 수 있습니다.
$ mise set
key value source
DB_USER root ~/work/our-project/mise.toml
DB_PASS 1234 ~/work/our-project/mise.toml
mise.toml
파일에 런타임 버전과 함께 환경 변수가 함께 저장되니 하나의 설정 파일로 통합 관리를 할 수 있게 되는 것이지요.
$ cat mise.toml
[tools]
node = "18"
python = "3.12"
[env]
DB_USER = "root"
DB_PASS = "1234"
환경 변수를 삭제하고 싶다면 mise unset
명령어를 사용하면 됩니다.
$ mise unset DB_PASS
$ mise set
key value source
DB_USER root ~/work/our-project/mise.toml
런타임 버전 제거
프로젝트에서든 전역에서든 런타임을 사용하고 싶지 않을 때는 mise unuse
명령어를 사용하면 되는데요.
명령어를 실행하면 해당 런타임을 비활성화시킬 뿐만 아니라 삭제까지 할지 물어봅니다.
$ mise unuse python@3.12
remove core:python@3.12.11 ?
Yes No All
←/→ toggle • y/n/a/enter submit
더 이상 해당 런타임 버전을 사용할 일이 없다면 Yes
를 선택해서 삭제하시면 되고,
나중에 다시 쓰실 예정이시라면 No
를 선택하셔서 단순히 비활성화만 시키시면 됩니다.
순수하게 특정 런타임의 버전을 삭제하고 싶다면 mise uninstall
또는 줄여서 mise rm
명령어를 쓰시면 됩니다.
$ mise uninstall python@3.13.5
mise python@3.13.5 ✓ uninstalled
런타임 업그레이드
전체 버전이 아닌 메이저나 마이너 버전을 지정하여 런타임을 설치한 경우, 추후에 같은 조건을 만족하는 새로운 버전이 나올 가능성이 존재합니다.
현재 사용 중인 런타임 중에서 새로운 버전이 있는지 확인하려면 mise outdated
명령어를 사용합니다.
$ mise outdated
name requested current latest source
bun latest 1.2.15 1.2.18 ~/.config/mise/config.toml
python 3.13 3.13.3 3.13.5 ~/.config/mise/config.toml
mise upgrade
또는 줄여서 mise up
명령어를 통해서 손쉽게 오래된 버전의 런타임을 새로운 버전을 대체할 수 있습니다.
$ mise upgrade
mise bun@1.2.18 ✓ installed
mise uninstall bun@1.2.15 ✓ remove ~/Library/Caches/mise/bun/1.2.15
mise python@3.13.5 ✓ installed
mise uninstall python@3.13.3 ✓ remove ~/Library/Caches/mise/python/3.13.3
마치며
지금까지 Python, Java, Node.js, Bun 등 프로그래밍 언어에 구애받지 않고 런타임 버전을 통합해서 깔끔하게 관리할 수 있도록 도와주는 Mise에 대해서 알아보았습니다. Mise만 한 번 제대로 설정해두면, 개발 환경 설정하시느라 30분씩 날리는 일은 거의 사라질 거예요! 😁