1 Python 개발 & 배포 생태계 개요
1.1 3단계 라이프사이클
Python 프로젝트는 개발 단계 → 배포 단계 → 운영 단계의 3단계를 거친다.
| 단계 | 도구 | 목적 | 특징 |
|---|---|---|---|
| 개발 | venv / pyenv / Poetry / Conda | 로컬에서 안전하게 코드 작성 & 테스트 | 의존성 격리, 버전 관리 |
| 배포 | Docker | 개발 환경 전체를 컨테이너로 패킹 | 재현성 100%, 어디서나 동일 실행 |
| 운영 | Kubernetes (또는 Docker Compose/ECS) | 수백/수천 개 컨테이너 자동 관리 | 자동 스케일링, 무중단 배포, 자가 치유 |
1.2 전체 생태계 계층
1.2.1 3단계 도구 스택
1.2.1.1 개발 단계: venv → pyenv → Poetry → Conda
로컬 머신에서 코드 작성 & 테스트
1.2.1.1.1 Conda (가장 포괄적)
- 언어 무관 + Python 버전 관리 + 이진 파일
- 추천: Data Science / 과학 계산
1.2.1.1.2 pyenv + Poetry (권장)
- Python 의존성 + 패키징 + 가상환경
- 추천: 순수 Python 개발 / 팀 협업
1.2.1.1.3 pyenv + pip (비권장)
- pyenv: Python 버전 관리
- pip: 패키지 설치 (수동 관리)
- 권장하지 않음
1.2.1.1.4 venv + pip (기본 학습용)
- 가상환경 + 수동 패키지 설치
- 추천: Python 학습 초기 단계만
1.2.1.1.5 venv (가장 기본)
- 가상환경 생성만
- 실무에서는 권장하지 않음
1.2.1.2 배포 단계: Docker (환경 캡슐화)
- 개발 환경 전체를 컨테이너로 패킹
- macOS/Linux/Windows 어디서나 동일 실행
- OS 부터 Python, 라이브러리까지 모두 포함
- 재현성 100% (언제 어디서나 같은 결과)
- 언제: 팀 협업, 클라우드 배포, CI/CD
- 추천: 권장
1.2.1.3 운영 단계: Kubernetes (대규모 자동화)
- 수백 개 컨테이너 동시 관리
- 자동 스케일링 (트래픽 많으면 자동 복사본 증가)
- 무중단 배포 (한두 개씩 교체하며 업데이트)
- 로드밸런싱 (여러 복사본 사이에 트래픽 분산)
- 자동 복구 (컨테이너 죽으면 자동 재시작)
- 언제: 대규모 서비스 (마이크로서비스, 엔터프라이즈)
- PoC/개인 프로젝트는 오버킬
1.3 개발 단계: 도구별 상세 분석
1.3.1 도구 비교표 (기본 → 포괄적)
| 항목 | venv | pyenv | Poetry | Conda |
|---|---|---|---|---|
| 역할 | 가상환경만 | 여러 Python 버전 병렬 관리 | 의존성 + 패키징 + 환경 | 언어 무관 패키지 관리 |
| 관리 대상 | 패키지 격리 | Python 인터프리터 버전 | 패키지 + Python 버전 | 모든 언어 패키지 + 이진 파일 |
| 지원 언어 | Python만 | Python만 | Python만 | Python, R, C++, Java 등 |
| 설정 파일 | 없음 (수동) | 버전 파일만 (.python-version) |
pyproject.toml, poetry.lock |
environment.yml, conda.lock |
| 저장소 | PyPI (pip) | 없음 (Python.org) | PyPI | Conda-forge, Anaconda |
| 설치 명령 | python -m venv |
brew install pyenv (또는 git clone) |
pip install poetry |
conda install |
| 가상환경 | ✓ 생성 | △ 조합 필요 (다른 도구와) | ✓ 자동 생성 | ✓ 생성 (이름 지정) |
| 의존성 관리 | ✗ 수동 (pip) | ✗ 없음 | ✓ 자동 + 잠금 | ✓ 자동 + 잠금 |
| 버전 해석 | PEP 440 (pip) | N/A | PEP 440 + Semantic Versioning | Conda 규칙 (유연함) |
| 패키징/배포 | ✗ 불가능 | ✗ 불가능 | ✓ 자동화 | △ 가능 (복잡) |
| 의존성 잠금 | ✗ 수동 | N/A | ✓ poetry.lock 자동 |
✓ 자동 (conda-lock 포함) |
| 재현성 | 50% (수동 관리) | 100% (버전 파일) | 100% | 100% |
| 학습곡선 | 극저 (1~2줄) | 낮음 (직관적) | 낮음 (직관적) | 중간~높음 |
| 엔터프라이즈 | 최소 (레거시) | 중간 (증가 중) | 높음 (표준화 추세) | 높음 (데이터 과학) |
1.3.2 버전관리 도구 선택 기준
1.3.2.1 1단계: venv (가장 기본)
- 정의: Python 표준 라이브러리의 가상환경 도구
- 교육/단순한 스크립트
- Python 학습 초기 단계
- 매우 간단한 일회성 스크립트
- 의존성 추적이 불필요한 경우
- 한계
- 패키지 버전 관리 수동
- lock file 없음 (재현 불가)
- 배포 불가능
- 패키지 버전 관리 수동
python -m venv venv # 가상환경 생성 (빈 상자)
source venv/bin/activate # 활성화
pip install pandas # 수동으로 패키지 설치
# 문제: 누가 어떤 버전 설치했는지 추적 불가능 1.3.2.2 2단계: pyenv (Python 버전 관리 추가)
- 정의: 시스템에 여러 Python 버전을 설치/관리하는 도구
- 언제 사용:
- 여러 프로젝트가 다른 Python 버전 필요
- 신 버전과 구 버전을 동시 테스트 필요
- 프로젝트별 Python 버전 격리 필요
- 여러 프로젝트가 다른 Python 버전 필요
- 특징
- Python 인터프리터 버전만 관리
- 패키지 관리는 별도 도구 필요
- venv와 함께 사용 가능
- Python 인터프리터 버전만 관리
pyenv install 3.11 # Python 3.11 설치
pyenv install 3.9 # Python 3.9 설치
pyenv global 3.11 # 기본 버전을 3.11로 설정
pyenv local 3.9 # 프로젝트 폴더에서는 3.9 사용
python --version # 자동으로 설정된 버전 사용 # pyenv + venv 조합
pyenv global 3.11 # Python 3.11 선택
python -m venv project_env # 가상환경 생성
source project_env/bin/activate
pip install pandaspyenv의 동작 원리: shim
pyenv는 시스템 Python을 수정하지 않는다. ~/.pyenv/shims/ 디렉토리에 shim(중간 스크립트)을 두고, PATH 앞에서 명령을 가로채는 방식이다.
python3 입력
|
v
PATH 순서: ~/.pyenv/shims/ → /usr/bin/ → ...
|
v
~/.pyenv/shims/python3 발견 (pyenv가 가로챔)
|
v
현재 설정된 버전(예: 3.11.9)의 실제 바이너리 실행
--> ~/.pyenv/versions/3.11.9/bin/python3
이 구조 덕분에 pip install도 시스템이 아닌 ~/.pyenv/versions/<버전>/lib/에 패키지를 설치한다. pyenv가 없다면 /usr/bin/python3(시스템 Python)이 실행된다.
1.3.2.3 3단계: Poetry (Python 버전 + 의존성 + 패키징)
- 정의: Python 프로젝트의 의존성 관리, 가상환경, 패키징을 통합 관리
- 언제 사용:
- 최신 개발자/팀 협업
- 순수 Python 프로젝트
- PyPI에 배포할 계획
- 팀 협업 (재현성이 중요할 때)
- 프로젝트 템플릿 필요
- 최신 개발자/팀 협업
- 장점:
- 선언적 문법 (직관적)
- 자동 하위 의존성 관리
poetry.lock으로 100% 재현성
- 배포까지 통합 지원
- 선언적 문법 (직관적)
- 한계:
- Python 언어만 지원
- 별도 설치 필요
- Python 언어만 지원
1.3.2.4 4단계: Conda (가장 포괄적)
- 정의: 모든 프로그래밍 언어의 패키지를 관리하는 생태계
- 언제 사용:
- 데이터 사이언스 (NumPy, Pandas, SciPy, Pytorch, sklearn, etc.)
- 다국어 환경 (Python + R + C++)
- 과학 계산 커뮤니티 (Anaconda 생태계)
- 복잡한 바이너리 의존성
- 회사에서 라이센스 지원
- 특수 라이브러리가 PyPI에 없을 때
- 데이터 사이언스 (NumPy, Pandas, SciPy, Pytorch, sklearn, etc.)
- 장점:
- 언어 무관 (Python, R, Julia, C++ 등)
- 바이너리 사전 컴파일 (과학 패키지 최적화)
- 거대한 커뮤니티 (특히 데이터 과학)
- 채널 시스템 (더 유연한 버전 관리)
- 언어 무관 (Python, R, Julia, C++ 등)
- 한계:
- 학습곡선이 높음 (옵션 많음)
- 디스크 용량 큼
- 배포 어려움
- 학습곡선이 높음 (옵션 많음)
1.4 배포 단계: Docker
1.4.1 Docker란?
- 정의: 시스템 포함 개발 환경 전체를 컨테이너(가상 상자)로 패킹하여 어디서나 동일하게 실행하는 도구
- 특징:
- OS 부터 언어(Python, R), 라이브러리까지 모두 포함
- macOS, Linux, Windows에서 100% 동일하게 실행
- “내 컴퓨터에선 되는데, 서버에선 왜 안 돼?” 문제 해결
- OS 부터 언어(Python, R), 라이브러리까지 모두 포함
- 언제 사용:
- 팀 협업 (개발자마다 다른 환경)
- 클라우드 배포 (AWS, GCP, Azure)
- CI/CD 파이프라인 (자동화 테스트)
- 마이크로서비스 아키텍처
- 팀 협업 (개발자마다 다른 환경)
- 한계:
- 이미지 크기가 큼 (수백 MB ~ GB)
- 초기 학습곡선이 있음
- 오버헤드가 있음 (가상 OS 실행)
- 이미지 크기가 큼 (수백 MB ~ GB)
# Dockerfile: 실행 환경 정의
FROM python:3.11 # Python 3.11 설치
WORKDIR /app # 작업 폴더 설정
COPY requirements.txt . # 의존성 파일 복사
RUN pip install -r requirements.txt # 패키지 설치
COPY . . # 코드 복사
CMD ["python", "main.py"] # 실행 명령 실행:
1.4.2 venv/Poetry vs Docker 선택 기준
| 상황 | 도구 | 이유 |
|---|---|---|
| 혼자 개발, 로컬 테스트만 | venv / Poetry | 간단, 빠름 |
| 팀 협업 (같은 환경 필요) | Docker | 재현성 100%, 환경 일관성 |
| 클라우드 배포 | Docker | 필수 (서버 환경 캡슐화) |
| 프로토타입 PoC | pyenv / Poetry | 빠른 개발 |
| 프로덕션 서비스 | Docker | 안정성, 버전 관리 |
1.5 운영 단계: Kubernetes
1.5.1 Kubernetes란?
정의: 수백/수천 개의 Docker 컨테이너를 자동으로 관리, 배포, 스케일링하는 오케스트레이션 도구
기능:
- 자동 스케일링: 트래픽 많으면 자동으로 복사본 증가
- 무중단 배포: 한두 개씩 교체하며 업데이트 (사용자 영향 0)
- 로드밸런싱: 여러 복사본 사이에 트래픽 분산
- 자동 복구: 컨테이너 죽으면 자동 재시작
- 버전 관리: 이전 버전으로 빠르게 롤백 가능
- 자동 스케일링: 트래픽 많으면 자동으로 복사본 증가
예시:
트래픽 100 req/s → 3개 복사본 (각 33 req/s) 트래픽 500 req/s → 자동으로 10개 복사본 (각 50 req/s) 배포 중 → 5개 → 8개 → 10개 순차적 교체 (무중단) 컨테이너 1개 죽음 → 자동 재시작 (사용자는 모름)언제 사용:
- 대규모 서비스 (Netflix, Google 등)
- 마이크로서비스 아키텍처
- 트래픽이 불규칙한 서비스
- 엔터프라이즈 환경
- 대규모 서비스 (Netflix, Google 등)
한계:
- ⚠️ PoC/개인 프로젝트: 오버킬
- 학습곡선이 가파름
- 클러스터 운영 복잡도 높음
- 비용 증가
- ⚠️ PoC/개인 프로젝트: 오버킬
1.5.2 배포 흐름 (개발 → 배포 → 운영)
로컬 개발 (venv/Poetry/Conda)
↓
코드 작성 & 테스트
↓
Git에 커밋
↓
Docker 빌드 (자동)
↓
Docker 이미지 생성
↓
Docker 레지스트리에 푸시 (Docker Hub, ECR)
↓
운영 서버 (AWS/GCP/Azure)
↓
Kubernetes 배포 (대규모만)
또는
Docker Compose (소규모) / ECS (AWS 중규모)
↓
사용자 접근