Python 2.7에서 3.6으로 마이그레이션 작업 정리
배경
회사 레거시 API 서버가 Python 2.7로 돌아가고 있었는데, 2020년 지원 종료 전에 미리 마이그레이션하기로 결정됐다. Django 1.8 기반 프로젝트로 약 15만 라인 규모였다.
주요 변경 사항
1. print 문법
가장 단순하지만 가장 많이 바꿔야 했던 부분.
# Before
print "Hello", name
# After
print("Hello", name)
2. unicode 처리
Python 3에서는 모든 문자열이 기본적으로 unicode라 u'' 프리픽스가 불필요해졌다. 반대로 bytes 타입을 명시적으로 다뤄야 했다.
# Python 2
response = urllib2.urlopen(url).read()
# Python 3
response = urllib.request.urlopen(url).read().decode('utf-8')
3. dictionary 메서드
.iteritems(), .iterkeys() 같은 메서드들이 사라지고 기본 .items(), .keys()가 iterator를 반환하게 변경됐다.
# Before
for key, value in data.iteritems():
process(key, value)
# After
for key, value in data.items():
process(key, value)
4. 라이브러리 호환성
MySQL-python이 Python 3를 지원하지 않아서 mysqlclient로 교체했다. Celery, requests, boto는 다행히 문제없었다.
마이그레이션 전략
2to3도구로 자동 변환 먼저 실행- 테스트 커버리지 확보 (기존 70% → 85%)
- 스테이징 환경에서 2주간 검증
- 롤링 배포로 점진적 전환
결과
약 3주 작업 끝에 무사히 마이그레이션 완료했다. f-string 같은 Python 3.6 신기능은 아직 사용하지 않기로 했다. 일단 동작하게 만드는 게 우선이었다.
성능은 거의 비슷했고, 메모리 사용량이 약간 줄어든 정도였다.