코딩 AI에 의해 이른바 딸깍하면 대량의 코드가 생산되는데 굳이 언어를 배워야 하는걸까 하는 고민을 하면서도 여전히 코드를 읽고 쓰는 연습을 한다. 그 중에서도 내가 최근 많이 사용하는 언어는 파이썬인데, 언어도 재미있고 서드파티 모듈도 풍부하기 때문이다. 그런데 파이썬을 어느 정도 사용하느냐라는 질문을 받으면 내가 어느 정도로 잘 사용하는가에 대해 궁금함을 가지게 된다. 그 와중에 내가 본 파이썬 책 2권(이펙티브 파이썬과 파이썬 하우투)은 파이썬을 중급 수준에서 사용한다는 것이 어떤 의미인지를 알려준다.
<이펙티브 파이썬>과 <파이썬 하우투>는 기본적인 파이썬 문법을 다루는 책이 아니다. 기본 문법은 익힌 상태에서 모범사례를 통해 파이썬 다운 코드를 작성하는 사례를 살펴본다. <이펙티브 파이썬>의 경우 모범사례의 갯수도 판이 올라가면서 대폭 늘어났는데, 처음 1판에서는 59개, 2판에서는 90개, 3판에서는 125개로 늘어났다.(처음에 비해 2배 이상 늘어났네) 나는 모범사례를 살펴보는 것이 단순한 프로그래밍 언어 구문 학습보다는 의미가 크다고 생각한다. 결국 이런 책을 보고 공부하는 이유는 코드를 읽기 위함인데, 모범사례를 읽다보면 좋은 코드, 파이썬 다운 코드에 대해 감각이 생긴다.
개인적으로 파이썬 중급 수준이란 컴프리헨션기법, 각종 데코레이터, 클래스 및 예외 체계, 협업 환경 구축 등에서 동작 방식을 이해하고 코드에서 사용할 수 있는가에 달려있다고 생각한다. 그래서 <파이썬다운 코드를 개발하는 63가지 실용기법(인사이트)>와 <이펙티브 파이썬>은 비슷한 내용이 많다. 두 권 중 어떤 책을 읽어도 괜찮다고 생각한다. 둘다 읽은 입장에서는 서로 보완해 주는 부분이 있었다. 다만 편집 측면에서 <파이썬다운 코드를 개발하는 63가지 실용기법>이 좀 더 가독성이 좋았다. <이펙티브 파이썬>은 친절하게 본문 내에서 관련된 모범사례 항목의 번호와 제목을 모두 기재하고 있는데, 나에게는 과잉 친절 같아서 읽을 때 본문의 맥락이 자꾸 끊어지는 듯한 느낌이 들었다.
새로운 언어를 배우다 보면 기존에 사용하던 언어와 새로운 언어 문법의 유사점때문에 잘못된 인식으로 실제 동작과는 다른 코드를 작성할 수 있는데, 이 책은 실수하기 쉬운 부분을 잘 정리해 두었다. 늘 개발과정에서 가정(선입견)이 코드 오류의 원인이 된다.
<이펙티브 바이썬>에는 병렬처리에 관한 내용이 추가되었는데, 이 부분은 점점 처리량을 높여야 하는 애플리케이션 파이썬 개발자들에게 유용한 내용이 많다. GIL때문에 느려라는 불평을 듣곤 하는데 멀티프로세스, 난-블러킹 API, 쓰레드, 비동기IO 등 매번 파이썬으로 작성하면 파이썬으로도 충분히 괜찮은 성능을 뽑아내는 코드를 작성할 수 있겠다. 이 부분에 대한 내용은 <파이썬 하우투>에서는 없다.
최근 출간된 파이썬 중급서 두권을 비교해 보자면, 조금 정돈된 코스로 파이썬 중급 과정을 익히고 싶은 사람은 <파이썬다운 코드를 개발하는 63가지 실용기법>을, 기존 알고 있는 지식을 사례를 중심으로 실력을 레벨업하고 싶다면 <이펙티브 파이썬>이 적절하다고 생각한다. 두께도 비슷하다.
이제 두 책의 내용 정도는 충분히 이해하고 작성하고 있으니 파이썬 중급 정도는 쓴다고 말해도 되겠지... 내 업무 상황에서는 파이썬 고급서까지 읽을 필요가 있을까 하는 생각은 든다.
파이썬에는 다양한 패키지 관리 도구가 존재합니다. pip, venv, virtualenv, pipenv, poetry 등 각 도구들은 가상환경 생성, 패키지 설치, 의존성 관리 등의 역할을 분담합니다. 최근 이 모든 기능을 하나로 통합하면서도 빠른 속도를 자랑하는 새로운 도구가 등장했습니다. 바로 uv입니다.
uv
uv는 Astral에서 개발한 초고속 파이썬 패키지 관리 도구입니다. 러스트(Rust)로 개발되었기 때문에 네이티브 툴의 매우 빠른 속도와 러스트 메모리 모델이 제공하는 높은 안정성이 제공합니다. Astral은 uv뿐만 아니라 파이썬 코드 린터인 Ruff도 러스트로 개발하고 있습니다. uv는 여러 파이썬 도구들이 제공하던 다양한 기능을 하나로 통합한 스위스 군대 칼같은 멀티툴로, 단일 명령어를 사용하여 가상환경을 만들고 패키지를 설치하며, 프로젝트의 의존성을 관리할 수 있습니다.
특징
매우 빠른 속도: 러스트로 구현되었기 때문에 기존 도구보다 월등히 빠릅니다. pip보다 10배~100배 빠르다고 홍보하고 있죠.
올인원 도구: pip, venv, virtualenv, pip-tools, poetry의 기능을 모두 갖추고 있습니다.
자동 가상환경 생성: 패키지를 설치할 때 가상환경이 없으면 자동으로 생성합니다.
PEP 582 지원: .venv 없이도 프로젝트 로컬 디렉터리에 패키지를 설치할 수 있습니다.
Python과의 높은 호환성: 표준 파이썬 워크플로와 충돌 없이 동작할 수 있습니다.
무엇을 대체할 수 있을까?
uv는 아래 도구들을 모두 대체할 수 있습니다:
pip (패키지 설치/제거)
venv, virtualenv (가상환경 생성)
pip-tools, pipenv, poetry (의존성 관리 및 고정)
따라서 여러 도구를 설치하여 설정하지 않아도, uv 하나만으로 파이썬 프로젝트를 효율적으로 관리할 수 있습니다.
설치
uv는 다음 명령어만 실행하면 간편하게 설치됩니다.
curl -Ls https://astral.sh/uv/install.sh | sh
설치 후에는 터미널에서 uv 명령어가 동작하는지 확인해 봅니다:
uv --version
가상환경
파이썬에서 가상환경(Virtual Environment)은 서로 다른 프로젝트마다 독립적인 패키지 공간을 제공하는 기술입니다. 프로젝트마다 필요한 패키지 버전이 다를 수 있기 때문에, 시스템 전체에 영향을 주지 않고 프로젝트별로 격리된 환경을 만드는 것이 중요합니다.
가상환경이 필요한 이유
서로 다른 프로젝트가 서로 다른 패키지 버전을 필요로 할 수 있습니다.
전역 파이썬 환경에 설치된 패키지는 다른 프로젝트에 영향을 줄 수 있습니다.
개발과 배포 환경 간에 일관성을 유지하기 위해서도 중요합니다.
예를 들어, A 프로젝트는 Django 4.2, B 프로젝트는 Django 5.2.5를 사용한다고 가정해 봅시다. 전역 환경에서 패키지를 설치하면 의존성 충돌이 일어날 수 있지만, 따로 가상환경을 분리하여 패키지를 설치하면 이 문제가 일어나지 않습니다.
가상환경의 구조
보통 가상환경은 .venv 또는 env라는 폴더로 구성되어 있고, 내부에 아래와 같은 구조를 가집니다: