Python 2에서 3으로 마이그레이션하며 겪은 문제들
배경
회사 내부 관리 시스템이 Python 2.7 + Django 1.8로 운영 중이었다. Python 2의 공식 지원 종료가 2020년으로 예정되어 있고, Django 2.0도 Python 3만 지원할 예정이라 마이그레이션을 시작했다.
주요 이슈
1. unicode와 str 처리
Python 2에서는 암묵적으로 잘 동작하던 코드들이 문제가 됐다.
# Python 2에서는 문제없었으나
data = some_api_call() # bytes 반환
if data.startswith('SUCCESS'):
process(data)
# Python 3에서는 명시적 디코딩 필요
data = some_api_call()
if data.decode('utf-8').startswith('SUCCESS'):
process(data)
2. print 문법
__future__ import로 해결 가능했지만, 일부 동적 로깅 코드에서 문제가 있었다.
from __future__ import print_function
3. 서드파티 라이브러리
MySQL-python이 Python 3를 지원하지 않아 mysqlclient로 교체했다. requirements.txt와 import 구문 수정이 필요했다.
4. dict 메서드
.iteritems(), .iterkeys() 등이 제거되어 .items(), .keys()로 일괄 변경했다.
마이그레이션 전략
2to3도구로 자동 변환 시도 → 참고용으로만 활용six라이브러리로 호환성 레이어 구축- 단위 테스트 커버리지 확보 (기존 60% → 85%)
- 스테이징 환경에서 2주간 검증
결과
총 3주 소요. Python 3.6의 f-string, type hints 등을 점진적으로 도입할 계획이다.