Python 2에서 Python 3으로 마이그레이션

발행: (2025년 12월 10일 오전 01:44 GMT+9)
6 min read
원문: Dev.to

Source: Dev.to

Python 2는 2020년 1월에 수명이 종료되었지만, 많은 레거시 프로젝트가 아직도 사용하고 있습니다. Python 3로 마이그레이션하는 것은 최신 기능 활용, 성능 향상, 보안 업데이트, 장기 지원을 위해 필수적입니다. 하지만 마이그레이션 과정이 항상 쉬운 것은 아닙니다. 아래에서는 주요 과제, 실용적인 전략, 그리고 원활한 전환을 위한 코드 예시를 소개합니다.

1. 핵심 차이점 이해하기

  • print가 이제 함수

    # Python 2
    print "Hello"
    # Python 3
    print("Hello")
  • 정수 나눗셈 동작

    # Python 2
    5 / 2   # → 2 (버림 나눗셈)
    # Python 3
    5 / 2   # → 2.5
    # 정수 나눗셈은 // 사용
    5 // 2  # → 2
  • 기본적으로 유니코드 문자열
    Python 3 문자열은 Unicode(str)이며, Python 2는 str(바이트)와 unicode를 구분합니다.

  • 내장 함수가 리스트 대신 이터레이터 반환
    range(), map(), filter(), zip() 등은 이제 리스트가 아니라 이터레이터를 반환합니다.

  • 예외 구문

    # Python 2
    except Exception, e:
        ...
    
    # Python 3
    except Exception as e:
        ...

2. 마이그레이션 준비하기

코드베이스 감사

Python 2 전용 문법, 라이브러리, 의존성을 식별합니다.

의존성 확인

모든 서드파티 패키지가 Python 3을 지원하는지 확인합니다. pip list를 사용하고 호환성을 검증하세요.

가상 환경 설정

기존 환경에 영향을 주지 않도록 Python 3 가상 환경을 만들어 테스트합니다:

python3 -m venv py3env
source py3env/bin/activate

3. 자동화 도구 활용

2to3 도구

코드를 스캔하고 Python 3 문법으로의 변경을 제안합니다.

2to3 -w myproject/

-w 옵션은 파일을 제자리에서 수정합니다. 복잡한 코드는 특히 수정 내용을 꼼꼼히 검토하세요.

futurize / modernize

점진적인 마이그레이션 동안 Python 2와 3 모두에서 동작하도록 코드를 도와주는 라이브러리입니다.

pip install future
futurize -w myproject/

4. 흔히 발생하는 수동 수정

문자열 처리

# Python 2
s = u"Hello"
print type(s)  # 

# Python 3
s = "Hello"
print(type(s))  # 

딕셔너리 순회

# Python 2
for key in mydict.iterkeys():
    print(key)

# Python 3
for key in mydict.keys():
    print(key)

xrange 처리

Python 3에서는 xrange()range()로 교체합니다.

5. 테스트 및 검증

단위 테스트

Python 3 환경에서 기존 테스트를 실행하고 실패하는 테스트를 하나씩 고칩니다.

CI/CD 파이프라인

병합하기 전에 별도 브랜치나 파이프라인에서 Python 3 코드를 테스트합니다.

점진적 마이그레이션

코드베이스가 크다면 모듈 단위로 순차적으로 마이그레이션합니다.

6. 서드파티 라이브러리 다루기

일부 라이브러리는 Python 3과 호환되지 않을 수 있습니다. 해결 방안은 다음과 같습니다:

  • 가능한 최신 버전으로 업그레이드
  • 현대적인 대체 라이브러리로 교체
  • 전환 기간 동안 six와 같은 호환 레이어 사용하여 Python 2와 3을 동시에 지원

7. 마이그레이션 후 모범 사례

  • 매치‑케이스 문, 타입 힌트, 성능 개선을 활용하려면 Python 3.10 이상을 사용하세요.

  • 복잡성을 줄이기 위해 Python 2 호환 코드를 제거합니다.

  • 깔끔한 문자열 포맷팅을 위해 f‑string을 적극 활용합니다:

    name = "Alice"
    age = 30
    print(f"{name} is {age} years old")

결론

Python 2에서 Python 3로의 마이그레이션은 벅차 보일 수 있지만, 적절한 계획, 자동화 도구, 그리고 철저한 테스트만 있다면 충분히 해낼 수 있습니다. 코드 품질, 의존성 호환성, 포괄적인 테스트에 집중하여 원활한 전환을 이루세요.

핵심 요점

  • 코드베이스를 감사하고 준비한다.
  • 2to3 또는 futurize로 문법 변환을 자동화한다.
  • 광범위하게 테스트하고 점진적으로 마이그레이션한다.
  • Python 3의 기능을 활용해 더 깔끔하고 안전하며 효율적인 코드를 만든다.
Back to Blog

관련 글

더 보기 »

Part 2: 첫 번째 Django 프로젝트 설정

이것은 “Learn Backend Development by Building a Social Media App” 시리즈의 파트 2입니다. 다시 오신 것을 환영합니다! 이전 파트에서는 백엔드가 실제로 무엇인지 배웠습니다.