Logo

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 명령어를 사용하면 현재 설치 가능한 버전을 시간 순으로 나열해줍니다.

예를 들어, 현재 이 글을 쓰고 있는 시점에서 설치 가능한 주요 프로그래밍 언어 별 런타임 버전을 확인해보겠습니다.

Python
$ 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
Java
$ 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
Node.js
$ 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
Bun
$ 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 최신 버전을 사용해보겠습니다. 아직 설치되어 있지 않은 런타임 버전은 사용하기 전에 먼저 다운로드 후 설치가 됩니다.

Python
$ 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
Java
$ 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)
Node.js
$ 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
Bun
$ 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분씩 날리는 일은 거의 사라질 거예요! 😁