2to3 converter를 활용한 django 프로젝트 python 버전업 삽질기

슬라이드


https://www.slideshare.net/ssuser6fe086/pycon-korea-2018-2to3-converter-django-python-110386412

발표 동영상


https://www.youtube.com/watch?v=ODcdWWfj9cc

설명


대상 청중
Python의 버전별 인코딩 문제에 대해 깔끔히 이해되지 않은 개발자
Python2로 개발하다가 버전 문제 때문에 더 이상 원활한 개발이 힘들어진 개발자
여러 버전의 Python을 사용하면서 생긴 기술부채 및 관리 코스트를 정리해야 하는 팀장님

하이퍼커넥트에서는 회사 전체 서비스들의 data infra와 back office를 django를 통해 구현하고 관리해오고 있습니다. 이 django 프로젝트는 python 2.7로 개발을 시작했고 초기에는 문제가 없었으나 최근들어 python3만 지원하는 라이브러리를 사용하고 싶은 상황을 심심찮게 마주하고 있습니다. 또한 기존에 사용하던 모듈들조차 최신버전에 이르러서는 python 2.7에 대한 지원이 끊기기 시작하면서 언제 어디서 version dependent한 문제가 발생할지 모르는 상황이 되었습니다.

좀 더 구체적으로 이야기 하자면 python3으로 업데이트를 해야 하는 이유는 다음과 같습니다.
django 2.0부터는 python 2.7을 지원하지 않는다. 따라서 django 2.0으로 올려야 하는 상황에 직면하기 전에 우선 python부터 버전업을 해야 한다.
현재 사용중인 command들 중에서 crontab으로 돌리고 있는 일부 command는 python2에서는 에러가 나서 python3로만 돌리고 있었다. 앞으로 추가될 기능중에도 점점 python3로만 만들 수 있는 것들이 늘어날 것이다.
현재 사용하는 라이브러리들이 최신버전에서 python3 밖에 지원하지 않는 경우가 생겼다.
python 2.7을 계속 사용하는 것은 개발자 구인과 유지에 있어서 매우 좋지 않다.

그래서 일부는 python2로 일부 코드는 python3로 돌리던 기존의 상황에서 벗어나, django의 모든 코드를 Python 3.6.3 interpreter로 돌리는 것을 목표로 코드를 대대적으로 수정하는 작업을 진행하였습니다.


python3로의 버전업 과정의 요점은 다음의 13가지 이슈로 분류할 수 있겠습니다.
(코드 수정) 2to3 converter를 사용해서 무작정 갈아엎기
(코드 수정) 새로운 migration 생성하고 fake 처리할 것과 적용할 것 구분하기
(코드 수정) urllib, unirest 라이브러리 관련 에러 처리
(코드 수정) Unicode와 Bytes간 encode, decode 에러 처리
(코드 수정) 기타 python2와 python3에서 차이가 나는 feature들에 의해 발생하는 에러 처리
(스택 변경) uwsgi 대신 gunicorn으로 django 돌리기
(스택 변경) supervisord 대신 circusd로 django 돌리기
(라이브러리) python manage.py runserver를 하지 못하게 만드는 각종 library 버전업
(라이브러리) 손수 테스트해보며 에러를 발생시키는 각종 library 버전업
(시스템 관리) 위 과정들을 각 단계별로 git branch 잘 나누어서 관리하는 방법
(시스템 관리) 테스트용으로 새로운 서버를 띄워 놓고 live 작업 (master 브랜치가 아닌 branch로 돌리고 + 새로운 migration 적용해 보고 + live 테스트)
(시스템 관리) 배포 과정 python3에 맞게 수정하고 배포하기
(시스템 관리) 모니터링 및 트러블 슈팅에서 주의 깊게 볼 점들

이 13가지 작업의 경위를 상세히 정리하였고 시행착오 끝에 best practice라고 생각할만한 부분들을 여러가지 제안합니다. 이 과정에서 파이썬의 encoding과 urllib에 대한 개념과 그의 python 버전별 차이에 대해서 자세하게 이해하게 되었고 이를 정리하여 전달할 계획입니다. 그리고 django와 관련된 python 버전 문제(장고 내의 library문제, migration 문제)에 대해서도 설명하고, 이와 관련된 django의 기능에 대해 소개합니다. 또 2to3 케이스 경험을 토대로 python2와 python3의 지엽적인 차이점들도 추가적으로 정리해보고자 합니다. 마지막으로 처음부터 python2와 python3를 호환가능하게 만들기 위해서 상황별로 숙지해야할 점들과 future, six 등 라이브러리에 대한 사용법을 소개하고자 합니다.


댓글

blog comments powered by Disqus

후원사 목록

다이아몬드

사파이어

플래티넘

골드

실버

커뮤니티

미디어