단순하고 깔끔한 윈도 분석 환경
TL; DR
winget
을 씁시다!
윈도는 쓸수록 지저분해진다?
윈도 환경은 빠르게 지저분해진다. 윈도의 역사를 고려하면 마이크로소프트가 다소 억울할 수도 있겠다. 윈도가 다양한 생태계를 오랫동안 유지, 포용, 확장해 온 탓이다. 인스톨러의 설치 방식 역시 조금씩 달라서, 여러 앱이 깔리면서 환경은 꼬이기 마련이다. 이런 ‘윈도’ 엔트로피의 증가 경향을 막을 수는 없겠지만, 가속할 필요는 없지 않을까?
개발 환경에 관한 것이라면 윈도 안에서 리눅스를 거의 완벽하게 구현한 WSL2라는 훌륭한 물건이 있다. 하지만 분석 용도로 쓰기에 WSL2가 지나치게 ’번잡하다’는 느낌을 종종 받는다. 이번 포스팅에서는 Windows Terminal + PowerShell + winget을 이용해 데이터 분석을 위한 일관된 윈도 환경 구축에 관해 다뤄보겠다. 여기 소개할 환경은 윈도 뿐 아니라 MacOS, Linux에서도 동일하게 구축할 수 있다. Unix 기반 OS에서는 구축이 더 쉽다. 윈도 구축을 무사히 마쳤다면, 다른 OS에서는 (어쩌면 Google의 도움을 약간 받아서?) 더 쉽게 구축할 수 있을 것이다.
출발선
내가 확인한 작동 환경은 아래와 같다.
- Windows 11 Version 22H2
윈도11 버전 이외에 윈도를 설치해 쓰는 환경이라면 특별한 호환성 문제는 없을 것이다.
winget 설치
공식 문서가 여러모로 완벽해서 덧붙일 것이 없다. 공식 문서에서 있는 링크를 누르면 윈도 스토어의 “앱 설치 관리자”가 뜬다. winget을 쓰기 위해서는 이 녀석을 설치해야 한다.
Windows Terminal 설치
만일 윈도 터미널(WT)이 이미 설치되어 있고 잘 설정되어 있다면 이 단계를 건너 뛰어도 된다. 아직 설치 전이라면 익숙하고 불편한 윈도 CMD 창, 즉 커맨드셸을 켜자. 커맨드셸에서 winget을 통해 기초가 되는 앱 두 개를 설치할 예정이다.
윈도에서 커맨드 창을 여는 가장 쉬운 방법은 “검색”에서 “커맨드”라고 검색하는 것이다. 그러면 “명령 프롬프트” 검색된다.
- Windows Terminal
- PowerShell (Core 버전, 크로스플랫폼 버전)
어떻게 설치하면 될까? 아래 사이트 중 하나로 가자.
위 웹사이트의 검색창에 “Windows Terminal”을 넣고 엔터를 누르자. 아래 검색 결과에 정식 본과 preview 버전 두 개가 뜰 것이다. 특별한 이유가 없다면 정식 버전을 설치하도록 하자. 클릭해서 들어가면 아래와 같은 스크린 샷이 보인다.
박스 친 부분을 클릭으로 복사할 수 있다. 이대로 copy-paste(복붙)를 해주면 된다. CTRL-V로는 커맨드셸에서는 제대로 붙지 않을 수 있다. 복사 후 마우스 우버튼 클릭으로 붙여녛기를 선택하면 잘 들어갈 것이다. 다 안되면 직접 타이핑하자.
>_ winget install --id=Microsoft.WindowsTerminal -e
이렇게 winget을 통해서 필요한 앱들을 터미널을 통해 설치할 수 있다. Winget은 Debian의 apt 혹은 Mac의 brew와 거의 같은 방식으로 작동한다.
Powershell 역시 같은 방식으로 설치하자.
>_ winget install --id=Microsoft.PowerShell -e
WT를 설치하면 윈도용 PowerShell이 깔려 있다. 크로스플랫폼으로 개발된 PowerShell Core를 추가로 깔도록 하자.
Windows Terminal 설정
WT는 여느 터미널 앱에 뒤지지 않을 만큼의 다양한 커스터마이징이 가능하다. 그 내용을 여기서 자세히 다루지 않겠다. WT의 폰트 설정, 윈도에서 기본셸로 쓸 파워셸(PS)의 외관 바꾸기 두 개만 보도록 하자. WT는 맥 OS의 iTerm2, 그리고 PS은 bash 혹은 zsh 정도라고 생각해도 무방하다.
Font 설정
폰트 설정은 코딩 환경을 좌우한다. PS를 잘 쓰려면 Nerd 패치가 된 폰트를 써야 한다. 아래 두 폰트를 추천한다.
Hack의 zip을 다운받아 압축을 풀면, 윈도용과 비 윈도용 그리고 보통, 이탤릭, 볼드, 이탤릭 볼드 폰트가 구별되어 있다. 용도별로 필요한 폰트를 깔면 된다.
윈도 터미널은 아직 다중 폰트, 즉 한글 폰트와 영문 폰트의 분리 적용을 지원하지 않는다. 한글의 활용이 높다면 D2Coding을 그렇지 않다면 Hack이 좋다. D2Coding의 경우 Nerd Font 매핑에 조금 문제가 있지만, 사용이 불가능할 정도는 아니다.
Ligature 버전과 그렇지 않은 버전 두 가지가 있다. 리거쳐란 -
+ >
와 같은 합자를 →의 단일 글자로 바꾸는 폰트를 의미한다.
폰트를 설치한 후 WT 설정 → PS 설정 → 모양 안에서 앞서 설치한 폰트를 선택하면 된다.
PowerShell 꾸미기
기본 PS는 그리 사용성이 좋지 않다. 다행스럽게도 리눅스나 맥의 “Oh-My-Zsh” 같은 것이 PS에도 있다. “Oh-My-Posh”, 즉 “오 마이 파워셸”이다. 마찬가지로 winget을 통해 설치하도록 하자. 다만 PS의 모양새가 제대로 돌아가려면 앞서 언급한 Nerd 폰트가 필요하다.
>_ winget install --id=JanDeDobbeleer.OhMyPosh -e
설치 후 필요한 여러가지 테마를 골라 설정할 수 있다. 자세한 것은 LINK를 참고하자.
앱 설치 I
이제 데이터분석 작업을 위해 필요한 앱들을 설치할 것이다. 우선 잘 알려진 앱부터 깔도록 하자.
- Visual Studio Code
- Git
- GitHub Desktop
절차는 다음과 같다.
- WT에서 PowerShell을 실행하자.
- winistall.app 사이트에서 필요한 앱을 검색한다.
- 설치를 위한 명령을 (복붙으로) 실행한다.
>_ winget install --id=Microsoft.VisualStudioCode -e
>_ winget install --id=Git.Git -e
>_ winget install --id=GitHub.GitHubDesktop -e
이렇게 설치하는 앱과 해당 서비스에서 직접 인스톨러를 다운받아서 설치하는 것이 많이 다를까? 기본적으로 동일하다. 다만 경우에 따라서는 설치 디렉토리 등이 보다 일관성 있게 유지된다는 점, 그리고 보다 체계적인 업데이트가 가능하다 등의 장점이 있다.
앱 설치 II
이제 데이터 분석을 위해서 필요한 앱을 설치하자. 아래 명령은 winstall.app에서 가져온 것이다.
App | Winget command |
---|---|
Miniforge3 for Python | >_ winget install --id=CondaForge.Miniforge3 -e |
R | >_ winget install --id=RProject.R -e |
Julia | >_ winget install --id=Julialang.Julia -e |
Quarto | >_ winget install --id=RStudio.quarto -e |
Miniforge3를 제외하고 다른 소프트웨어는 설치와 실행에 문제가 없었다. Miniforge3에는 약간의 설정이 필요하다.
Miniforge3 (for Python)
파이썬의 경우 네이티브로 깔아서 써도 된다. 다만 여러모로 conda 환경 아래 쓰는 것이 편리하다. 그리고 conda를 쓴다면 우리는 쓸모없이 크고 비효율적인 원본 아나콘다 대신 파이썬 환경 및 패키지 관리에 특화된 미니콘다를 설치할 것이다. 최근 아나콘다의 전 제품이 200 인 이상 단체에 대해서 유료화되었다. Miniforge3는 라이센스 이슈가 없는 별도의 커뮤니티 버전이다. winstall.app에서 miniforge3를 검색하자.
>_ winget install --id=CondaForge.Miniforge3 -e
아쉽게도 Miniforge3의 실행 경로가 윈도 path에 기본으로 잡혀있지 않다. 즉 커멘드셸에서 conda
를 쳐도 해당 폴더에 있지 않는 이상 실행되지 않는다.
환경 변수 설정
아래 그림과 같이 윈도 태스크바의 검색 창에서 “환경 변수”라고 치면 아래 그림과 같은 검색 결과 비슷한 것이 뜰 것이다. “계정의 환경 변수 편집”을 선택하도록 하자.
왼쪽 그림과 같은 창이 뜨면 path
항목 위에서 더블클릭을 하자. 그러면 오른쪽 화면이 뜬다. 여기에 miniforge3의 “윈도용 명령어 경로”를 넣어주면 된다. 설치 경로는 컴의 조건과 상황에 따라서 차이가 날 수 있다. 개인사용자 대부분은 C:\Users\{USER NAME}\miniforge3
에 설치될 것이다. 일부 조직에서 관리하는 컴퓨터 같은 경우 C:\Users\{USER NAME}\AppData\Local\miniforge3
에 설치될 수 있다.
한글 윈도의 경우 탐색기에서 Users
가 “이용자”라고 보일 것이다. “이용자”가 Users
다. 해당 폴더로 들어가서 찾으면 된다. 기우로 적으면, {USER NAME}
은 각 이용환경에서 특정 이용자의 이름에 해당한다. 문자 그대로 저 글자를 찾지는 마시라.
- 윈도용 명령어 경로: 설치 경로 +
\Script
Script
폴더는 conda를 위한 윈도용 명령어들을 담고 있는 폴더다. 명령어 경로를 path에 설정하고 WT을 다시 실행하자. 일단 PS이 아니라 커맨드셸이 필요하다. 커맨드셸을 열고 conda --version
을 넣어 보자. 버전 숫자가 나오면 잘 설치된 것이다. 이제 miniforge3를 PS에서 부리기 위한 명령을 실행하자.
>_ conda init powershell
조금 기다리면 PS을 위한 콘다 환경이 세팅된다. WT를 다시 실행한 후 PS에서 conda --version
을 실행해보자. 버전이 뜨면 설정이 완료된 것이다. 이제부터 ‘익숙한’ conda 환경 그대로다!
Miniforge3 대신 Miniconda를 설치한다면, 위 과정을 응용하면 된다. Miniconda도 winstall.app에서 찾을 수 있다.
설치 앱 업그레이드
winget을 설치했다면 터미널에서 간단하고 일관되게 작업할 수 있다. 별 생각하기 싫다면, 아래와 같이 하자.
>_ winget upgrade --all
자세한 내용은 여기를 참고하자.
VS Code as IDE
이제 개별 데이터 분석 도구(언어)를 부릴 IDE로 VS Code를 쓸 것이다. VS Code가 편리한 이유는 다음과 같다.
- 크로스 플랫폼, 크로스 랭귀지
- 다양하고 풍부한 Extension 지원
- Jupyter 활용 가능
- Quarto를 통해 일관된 문서 작성 가능
R 이용자에게 RStudio는 정말 뛰어난 IDE이지만, 그 안에서 다른 언어와 운용하기는 쉽지 않다. VS Code가 개별 언어를 위한 최선의 환경은 아닐지 몰라도 차선 쯤은 된다. 사용하는 언어에 맞게 필요한 아래 VS Code 익스텐션을 설치하도록 하자.
Extenstions
Language | Extension | Desc |
---|---|---|
Python | Python, Pylance | https://code.visualstudio.com/updates/v1_70 |
R | R | https://code.visualstudio.com/docs/languages/r |
Julia | Julia | https://code.visualstudio.com/docs/languages/julia |
Jupyter | Juputer, Jupyter Keymap | https://code.visualstudio.com/docs/datascience/jupyter-notebooks |
Quarto | Quarto | https://marketplace.visualstudio.com/items?itemName=quarto.quarto |
Some Tips for Jupyter in VS Code
폰트 운용
VS Code 설정에서 폰트를 바꿀 수 있다. VS Code는 두 개 이상의 폰트를 쓸 수 있고, 우선 순위가 자연스러운 방식으로 구현된다. 만일 Hack NF와 D2Coding을 함께 설치했다면, 폰트 설정 항목에 "Hack NF", "D2Coding ligature"
와 같은 식으로 차례로 넣어주면 된다.
Jupyter 모듈 설치
Jupyter를 실행할 때 만일 해당 언어 환경에 Jupyter가 깔려 있지 않다면 어떻게 될까? 똑똑한 VS Code는 무엇을 깔아야 하는지 알려준다. 아래 그림과 같은 메시지에서 설치 관련 명령을 복사헤서 붙여 넣고 실행하자. VS Code에서 하단에 커맨드셸을 활성화하려면 CTRL-J를 누르도록 하자. 혹은 오른쪽 상단의 아이콘 중에서 하단 바가 색칠된 형태의 아이콘을 눌러도 된다.
Jupyter 인터프리터 선택
보통 주피터 환경에서는 인터프리터, 즉 어떤 언어 설정에서 명령을 실행할지는 선택할 수 있다. 콘다의 가상 환경을 쓸 때 혹은 주피터를 여러 언어 환경에서 쓸 때 유용한 기능인데 VS Code에도 그대로 구현되어 있다.
F1
클릭- 검색창에서 Python을 칠 때 나오는 것 중에서 “Python:인터프리터 선택” 클릭
- 아래 그림과 같은 창에서 인터프리터를 선택하면 된다. 만일 보이지 않으면 리프레시 버튼을 눌러서 다시 환경을 갱신해보자. Conda 가상 환경까지 잘 찾아준다.
간혹 내가 miniforge3를 설치한 위치의 python 환경이 보이지 않을 수 있는데, 그럴 때는 VS Code를 재시작하고 위 과정을 반복하면 된다. 뭔가 안될 때는 일단 재시작이다.
Quarto 환경
Quarto의 장점은 문서 내의 코드를 그대로 실행해 결과를 보여주는 데 있다. 이 장점을 살리기 위해서는 몇 가지 설정이 필요하다.
- 문서를 컴파일하기 전에 코드가 실행될 (특정 환경에 속한) 파이썬 인터프리터를 선택하자.
- 선택한 후 VS Code 내에서 에디터를 띄우면
conda activate
를 통해서 적당한 환경이 자동으로 설정된다. 만일 외부의 PS에서 실행한다면 해당 환경까지 알아서 진입해야 한다. - ipykernel이 해당 환경에 설치되어 있어야 한다. 앞서 jupyter notebook을 VS Code에서 실행하기 위해 필요했던 ipykernel이 해당 환경에 설치되어 있어야 한다. 설치가 되어 있지 않다면 다시 확인하자.
{YOUR-CONDA-ENV}
는 이용자의 가상환경의 이름을 뜻한다.
>_ ({YOUR-CONDA-ENV}) conda install -n {YOUR-CONDA-ENV} ipykernel --update-deps --force-reinstall
- 이제 마지막으로 콘다 환경에 아래 두 개의 패키지를 더 설치하면 된다.
>_ ({YOUR-CONDA-ENV}) conda install nbformat nbclient
4를 설치하지 않고 Quarto 문서(.qmd
)를 컴파일하면 nbformat
과 nbclient
를 설치할 것을 안내해준다. 3을 설치하지 않고 실행하면 [WinError 2]...
에러가 뜬다. 간혹 ipykernel을 설치를 했는데도 qmd 문서 컴파일 시 에러가 뜬다면 아래의 방법으로 다시 설치하자.
>_ ({YOUR-CONDA-ENV}) python -m ipykernel install --user