모던 Python 개발 도구#

이 글은 Django Ninja 입문 가이드의 5번째 글이에요.
현대 소프트웨어 개발에서 도구는 개발 효율성을 높일 뿐만 아니라 코드 품질을 개선하여 프로젝트 관리와 유지 보수를 훨씬 수월하게 해줘요.
이 글에서는 몇 가지 중요한 Python 개발 도구를 소개하고, 프로젝트에서의 활용 방법을 살펴보며 독자들이 각 도구의 역할과 가치를 빠르게 이해할 수 있도록 할 거예요.
제 블로그를 보셨다면, 제가 이러한 현대적인 개발 도구를 강력히 추천하고, 이를 위해 상세한 튜토리얼을 여러 편 작성하는 데 많은 지면을 할애했다는 것을 아실 거예요.
따라서 우리는 이러한 도구의 작동 세부 사항에 깊이 들어가지 않고 개념과 개발 중의 어려움을 어떻게 해결하는지에 중점을 둘 거예요. 관심 있는 분들이 더 배울 수 있도록 관련 튜토리얼 링크를 첨부할게요.
참고로 이 Python 현대 개발 실무는 제가 개발자 Wei Lee(이웨이)의 'Python Table Manners' 시리즈를 보고 나서야 하나씩 배우고 실천한 것들이에요. 개인적으로 이 시리즈를 강력히 추천해요!
GitHub 예제 프로젝트#
이 프로젝트는 Python 3.12.5, Django 4.2 LTS 및 Django Ninja 1.3.0을 사용하며, 이 부분은 알고 계시면 돼요.
이제 각 도구의 소개로 들어갈게요.
pyenv: Python 버전 관리#
pyenv (네, p는 소문자예요, pytest와 같아요)는 여러 Python 버전을 관리하는 강력한 도구로, 서로 다른 프로젝트에서 충돌 없이 다양한 버전의 Python을 사용할 수 있게 해줘요.
이것이 프로젝트에 .python-version 파일이 있는 이유예요. 이 파일은 프로젝트에서 사용하는 Python 버전을 pyenv에 선언해요.
pyenv는 서로 다른 Python 버전을 사용하는 여러 프로젝트를 다룰 때 특히 유용하며, 일부 프로젝트가 이전 버전의 Python을 사용해야 할 때 더욱 그래요.
pyenv를 통해 Python 버전을 쉽게 설치하고 전환하여, 각 프로젝트가 올바른 환경에서 실행되도록 할 수 있어요.
자세한 pyenv 튜토리얼은 제가 이전에 쓴 글을 참고해 주세요:
- Ubuntu에서 pyenv + pyenv-virtualenv 설치 및 사용 (Linux)
- Anaconda와 작별하기: macOS에서 pyenv를 사용하여 Python 개발 환경 구축 (macOS)
Poetry: 가상 환경 및 패키지 관리#
Poetry는 현재 매우 인기 있는 Python 패키지 관리 도구예요. 패키지 관리, 특히 패키지 간의 '의존성' 문제는 Python 개발에서 항상 큰 골칫거리였죠.
Poetry가 주로 해결하는 것은 패키지 간 의존성 패키지의 다른 버전 범위로 인한 충돌 문제예요.
이러한 세부 사항은 한마디로 설명하기 어려우니, 제 글 〈Python 패키지 관리자——Poetry 완전 입문 가이드〉를 참고해 주세요. 특히 그중 '용어 설명' 부분을 보세요.
또한 Poetry는 가상 환경 관리와 관련이 있기 때문에 pyenv와 함께 사용하여 가상 환경이 올바른 Python 버전을 선택하도록 하는 방법도 자주 묻는 질문이에요. 이는 〈Poetry + pyenv 튜토리얼: 자주 사용하는 명령어 및 주의 사항〉 글의 소개를 참고해 주세요.
Ruff: Linter 및 Formatter#
시대가 변하고 있어요. 예전에는 항상 Flake8 + isort + Black을 사용했지만, 지금은 Ruff만 써요.
Ruff는 Rust로 작성된 초고속 Python Linter 및 Formatter로, 코드의 포맷팅 문제를 빠르게 확인하고 수정하는 데 사용돼요.

Ruff는 개발자가 통일된 코드 스타일을 유지(주로 PEP8 준수)하도록 도와줘요. 고성능 덕분에 Ruff는 특히 대규모 프로젝트에 적합해요.
그 외에도 Ruff는 수많은 Flake8 플러그인을 통합하여 올인원 솔루션이 될 수 있어요. 저에게는 이것이 속도 이외의 또 다른 큰 장점이에요.
Ruff에 대한 더 자세한 소개는 제 글을 참고해 주세요:
pre-commit: Git Hooks 관리 도구#
속담에 "CI가 없다면 최소한 pre-commit이라도 있어야 한다"고 했죠. 제가 지어낸 말이에요.
pre-commit (맞아요, p도 소문자예요)은 Python으로 작성된 Git Hooks 관리 도구로, 다양한 프로그래밍 언어 프로젝트에 적용돼요. 사용자가 필요에 따라 관련된 Git Hooks를 설정할 수 있게 해줘요.
일반적인 'pre-commit hook'을 예로 들면, git commit을 실행할 때 다양한 검사 및 포맷팅 도구(설정한 hook)를 자동으로 실행하여 제출된 코드가 규범에 맞는지 확인해요.
이는 코드 품질을 유지할 뿐만 아니라 코드 리뷰에서의 사소한 문제들을 줄여, 리뷰어가 로직과 아키텍처 검토에 집중할 수 있게 해줘요.
예제 프로젝트에서 pre-commit은 코드 스타일의 일관성을 보장하기 위해 Ruff와 몇 가지 기본적인 포맷 확인을 실행하도록 설정되어 있어요.
관련 글: Python 개발: pre-commit으로 Git Hooks 설정 튜토리얼
Mypy: 정적 타입 검사#
사용 중인 Python 프로젝트에는 type hints가 있나요?
시리즈의 첫 번째 글에서 언급했듯이 Django Ninja는 type hints를 배우기 위한 아주 좋은 시작점이에요.
프로젝트에 type hints를 추가하려면 정적 타입 검사기(static type checker)가 필수적이에요. 그리고 그중 가장 일반적인 선택이 Mypy죠.
Mypy는 강력한 도구로, 타입 오류를 검사할 뿐만 아니라 프로그램이 실행되기 전에 많은 잠재적인 문제를 잡아낼 수 있어요. 제가 보기에 그것이 실제로 미치는 영향은 타입 범주를 넘어서요.
Mypy는 대규모 프로젝트와 팀 협업에 필수적인 도구예요. 하지만 소규모 프로젝트에서도 Mypy가 분명한 이점을 가져다준다는 점을 강조하고 싶어요.
Type hints의 비용과 효용은 다음 그림으로 설명할 수 있어요 (《Robust Python》에서 다시 그림):

장기적으로 type hints와 Mypy를 사용하면 지속적인 이점을 얻을 수 있어요. 사실 이는 이번 글에서 소개한 모든 도구에 적용돼요😎. 초기에는 배우고 적응하는 데 시간이 좀 걸리지만, 그만한 가치가 있어요.
Mypy와 Python type hints에 대한 더 자세한 소개는 제 'Mypy 3부작' 시리즈를 참고해 주세요:
맺음말#
pyenv는 Python 버전을 유연하게 관리하도록 돕고, Poetry는 패키지 관리 문제를 해결하며, Ruff, pre-commit, Mypy 등의 도구는 코드의 깔끔함과 일관성을 보장해요. 이 도구들은 서로 보완하며 효율적인 개발 환경을 함께 만들어 줘요.
이들을 잘 활용하는 것은 현대 개발자로서 우리의 필수 소양이며 팀 협업의 중요한 초석이에요. 배우는 데 어느 정도 시간이 들지만 익숙해지면 이 도구들이 개발 과정에서 없어서는 안 될 조력자가 될 것이라고 믿어요.