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()로 일괄 변경했다.

마이그레이션 전략

  1. 2to3 도구로 자동 변환 시도 → 참고용으로만 활용
  2. six 라이브러리로 호환성 레이어 구축
  3. 단위 테스트 커버리지 확보 (기존 60% → 85%)
  4. 스테이징 환경에서 2주간 검증

결과

총 3주 소요. Python 3.6의 f-string, type hints 등을 점진적으로 도입할 계획이다.