brunch

파이썬 개발, ‘UV’를 만나고 모든 것이 달라졌다

속도라는 단순함이 가져다준 개발의 즐거움

by 파도비늘

언제부터였을까요. 파이썬으로 무언가를 만드는 일보다, 개발 환경을 설정하는 데 더 많은 시간을 쏟기 시작한 것이. pip, virtualenv, pyenv, poetry...

저마다의 이유로 태어난 훌륭한 도구들이지만, 어느새 제 컴퓨터에는 여러 도구들이 복잡하게 얽혀 있었습니다. 프로젝트를 시작할 때마다 '이번에는 어떤 조합으로 가야 할까?'를 고민하는 것은 더 이상 즐거운 탐구가 아닌, 피곤한 관문처럼 느껴졌습니다. 그러던 어느 날, 저는 'uv'를 만났습니다.


파이썬 프로젝트 관리가 정말 쉬워집니다. 특히 생태계를 처음 접하는 경우, 파이썬을 설정하는 것이 훨씬 더 빨라집니다.


이 문장을 처음 봤을 때, 저는 반신반의했습니다. 또 하나의 도구가 추가되는 것뿐이지 않을까? 하지만 uv는 달랐습니다. 그것은 새로운 도구의 등장이 아니라, 복잡했던 생태계에 대한 하나의 명쾌한 '정리'처럼 다가왔습니다.



첫 만남, 속도에 매료되다

uv를 처음 알게 된 것은 'Ruff'라는 유명한 린터(linter)를 만든 Astral 팀의 작품이라는 소식을 통해서였습니다. Rust로 만들어졌다는 사실만으로도 이미 기대감은 충분했습니다. Rust가 가진 성능과 안정성에 대한 명성은 익히 들어왔기 때문입니다.

설치는 간단했습니다. 단 한 줄의 명령어로 제 개발 환경에 들어온 uv는, 첫인상부터 저를 압도했습니다.


# uv로 가상 환경을 만들고 FastAPI와 SQLAlchemy 설치하기
uv venv
uv add FastAPI SQLAlchemy


눈을 깜빡할 사이였습니다. 수많은 의존성 패키지들이 설치되는 과정이 마치 잘 짜인 영상처럼 순식간에 지나갔습니다. 과거 pip로 패키지를 설치하며 커피를 내리거나 잠시 다른 일을 하던 순간들이 주마등처럼 스쳐 지나갔습니다. 이것은 단순히 '빠르다'는 표현으로는 부족한, 완전히 새로운 경험이었습니다.


정말 빠릅니다. 방금 언급한 다른 모든 도구보다 훨씬 빠릅니다.


이 솔직하고 자신감 넘치는 문장에 저는 고개를 끄덕일 수밖에 없었습니다. Astral이 벤처 캐피털(VC)의 지원을 받는다는 사실에 잠시 여러 생각이 들기도 했습니다. 막대한 자원으로 더 강력한 도구를 만들 것이라는 기대감과 동시에, 언젠가 그들의 비즈니스 모델이 우리에게 어떤 영향을 줄지에 대한 작은 우려도 스쳤습니다. 하지만 일단은 이 경이로운 속도를 온전히 즐기기로 했습니다.



새로운 여정의 시작, uv init

uv와 함께하는 프로젝트는 시작부터 달랐습니다. 더 이상 빈 폴더에서 어떤 파일을 만들어야 할지 고민할 필요가 없었습니다.


uv init


이 간단한 명령어 하나가 프로젝트에 필요한 뼈대를 완벽하게 만들어주었습니다.

pyproject.toml 설정 파일부터 .gitignore, 가상 환경을 위한 .venv 폴더까지, 마치 숙련된 개발자가 곁에서 도와주는 듯한 기분이었습니다.


제가 가장 감동했던 순간은 uv run을 사용했을 때입니다.


# hello.py 파일 실행
uv run hello.py


놀랍게도 uv는 현재 폴더에 가상 환경이 설정되어 있는지, 필요한 패키지는 모두 설치되었는지 스스로 확인하고, 만약 준비가 안 되었다면 모든 것을 자동으로 설정한 뒤에야 코드를 실행해 주었습니다.


실제로 가상 환경을 생성하고 모든 종속성을 설치한 다음 파일을 실행하는 것


이것은 단순한 편의성을 넘어, 개발자가 오롯이 '코드'에만 집중할 수 있도록 만들어주는 uv의 철학처럼 느껴졌습니다.

uv add pandas, uv remove sqlalchemy... 패키지를 추가하고 제거하는 모든 과정이 물 흐르듯 자연스럽고 빨랐습니다.

pyproject.toml 파일과 uv.lock 파일은 제 프로젝트의 의존성을 투명하고 견고하게 지켜주었습니다.


의존성 관계가 꼬여 머리가 아플 때면,

uv tree 명령어로 프로젝트의 의존성 지도를 한눈에 펼쳐볼 수 있었습니다. 마치 복잡한 가계도를 깔끔하게 정리해 보여주는 것처럼, 어떤 패키지가 다른 패키지를 필요로 하는지 명확하게 알 수 있었죠.



아직은 채워나갈 빈칸, 그리고 더 큰 기대

물론 uv가 모든 것을 해결해 주는 만능 도구는 아직 아닙니다. Node.js의 package.json처럼 uv test 나 uv start 같은 사용자 정의 스크립트를 만들어 쓸 수 없는 점은 아쉬움으로 남습니다. 테스트나 서버 실행을 위해 매번 긴 명령어를 입력해야 하는 것은 제가 uv에 너무 많은 것을 기대하게 되었기 때문일지도 모릅니다.

또한, 프로젝트를 빌드하고 패키지로 만들어 배포하는 기능은 아직 uv 자체에 내장되어 있지 않습니다. 다른 빌드 시스템의 도움을 받아야 하죠.


uv에 자체 빌드 백엔드가 포함되어 있으면 Python 프로젝트를 빌드하기 위해
다른 타사 도구를 설치할 필요가 없을 것입니다.


개발자의 이 아쉬움 섞인 목소리는 이미 깃허브에서 활발히 논의되고 있습니다. 언젠가 Rust로 만들어진 초고속 빌드 시스템이 uv에 통합될 그날을 상상하면, 벌써부터 가슴이 뜁니다.

uv build, uv publish 명령어로 제가 만든 파이썬 패키지를 세상에 내놓는 그 순간은, 지금보다 훨씬 더 빠르고 짜릿한 경험이 될 것입니다.

uv와의 만남은 저의 파이썬 개발 여정에 새로운 이정표가 되었습니다. 복잡함 속에서 길을 잃고 헤매던 저에게 '본질에 집중하라'는 명쾌한 가르침을 주었죠. 속도와 통합이라는 단순함이 오히려 개발의 더 큰 즐거움과 창의성을 이끌어낼 수 있다는 것을 깨닫게 해 주었습니다.

uv는 아직 성장하고 있는 도구입니다. 몇 가지 빈칸들이 남아있지만, 그 빈칸마저도 앞으로 채워질 멋진 기능들에 대한 기대감으로 저를 설레게 합니다.


혹시 당신도 파이썬 개발 환경의 복잡함에 지쳐있지는 않으신가요? 그렇다면 이제, uv의 세계로 한 걸음 내디뎌 보시는 것은 어떨까요. 아마 당신의 개발 인생도 저처럼, uv를 만나기 전과 후로 나뉘게 될지 모릅니다.


구독과좋아요.jpg


keyword
매거진의 이전글코드가 노래가 되던 순간, LangChain과의 만남