-
Django 3.2 -> 4.2 변경 기록Programming 2024. 9. 11. 08:02
Django의 3.2LTS 버전이 2024년 4월에 끝나게 되었다.
회사 프로젝트가 django 3.2.12 를 사용하고 있었는데 당시 Readme 에 내가 적어놓은 프로젝트 환경이다.
굵은 글씨로 업데이트 필요라고 적어놓았는데 django 는 해당하는 시간이 지나고 나서 업데이트가 되었고
python 같은 경우는 그래도 지원 종료 시기보다는 그전에 업데이트를 완료했다.
해당 글은 그중에서 django 3.2 에서 4.2 로 변경하면서 겪었던 것들을 적으려고 한다.
겪었던 항목(자잘한 것 제외)
1. Django url Deprecated
Django 4.0 remove feature 여기 글을 보면 알 수 있는데 django.conf.urls.url 이 사라진 것을 알 수 있다.
Django 4.0 release notes | Django documentation
The web framework for perfectionists with deadlines.
docs.djangoproject.com
회사 프로젝트의 경우 url을 기본전제로 사용하고 있었고 당연히 3.2 에서 4.2로 업데이트를 하자마자 ide 에서 무수한 빨간 밑줄이 발견되었다.
뭐 다행히 url => re_path 로 변경했다.
참고로 django-restframework 를 사용하고 있고 거기에 있는 router 를 사용하고 있다면 여기에 대해서 이슈사항은 없을 것 같다.
django-restframework 를 확인해보니 내부적으로 re_path 를 이미 사용하고 있었고 회사 프로젝트가 특이해서 router 같은 거는 일체 안쓰고 오직 urls 로만 모든 경로를 설정했기에 변경하는데 이슈가 컸었다.
2. Django order by 에 있는 `model.id` 형식
이 부분은 많은 사람들이 안 겪을 것 같은데 일단 회사 프로젝트가 여러 사람의 손을 거치기도 했고 python과 특히 django 를 주로 했던 사람들이 처음에 작업했던 것이 아니다보니 예전 코드들을 보면 신기한 부분들이 많다.
이것도 그중에 하나인데 이전 버전 같은 경우에 `model.id` 이러한 방식으로 한다고 해서 문제는 일어나지 않았던 것 같다.
하지만 버전이 올라감에 따라서 validation 이 되어진 것인지 releated_query_name 으로 해야지만 오류가 발생하지 않는다.
그래서 약간의 궁금점이 들었다. 그러면 옛날 방식으로 했을 때 정렬이 정상적으로 동작한 것 인가?
https://stackoverflow.com/questions/2065863/django-order-by-related-field
Django order by related field
I want to sort a QuerySet of contacts by a related field. But I do not know how. I tried it like this, but it does not work. foundContacts.order_by("classification.kam") Actually in a template I ...
stackoverflow.com
위의 글을 보면 정상동작은 하지 않았던 것으로 보인다. 아마 에러만 안나서 정상동작의 여부에 대해서 판단을 하지 못했던 것으로 보인다.
그래서 해당방식을 아래와 같이 변경했다.
# 이전 방식 .order_by('product_content.id') # 변경 .order_by('product_contents_set__id')
3. ugettext_lazy Deprecated
ugettext_lazy 의 경우 django 에서 python2를 지원하기 위해서 만들어진 함수인데 django 가 더이상 python2 를 지원하지 않기에 자연스럽게 Deprecated 되었다.
문제는 우리 프로젝트는 한번도 python2 였던 적이 없다...
이말은 그냥 gettext_lazy를 사용했어도 되는 부분이다.
python2에서는 따로 유니코드 문자열을 처리해줘야하기에 사용하지만 python3은 그럴 필요가 없기 때문이다.
그래서 해당하는 부분을 변경해주고 나니 이슈는 없었다.
번외
해당 프로젝트를 진행하면서 pillow 도 버전을 업데이트 했는데 이때 발생했던 이슈가 총 두가지였다.
1. ImageDraw.Draw 의 textsize deprecated
기본적으로 user 의 기본 프로필 이미지를 생성할 때 닉네임의 앞 두글자를 따서 프로필 이미지를 만드는데 그때 쓰는 로직중
textsize 를 사용하고 있었다.
그런데 저 부분이 동작을 제대로 안하고 있었기에 확인해보니
textsize 는 deprecated 되었고 대신 textbbox를 사용하라고 되어있었다.
그래서 아래와 같이 변경되었는데
# 이전 방식 w, h = draw.textsize(msg, font=font) # 변경 _, _, w, h = draw.textbbox((0.0), msg, font=font) # return left, top, right, bottom
참고로 right 를 w, bottom 을 h 로 한것은 x, y 0,0 의 기준점이 상단 왼쪽이기 때문에 width 와 height 의 기준이 맞기에 저렇게 했다.
2. avif 파일 미지원
이 부분은 운영상에서 발생했는데
어드민에서 이미지를 올리려고 하니 avif 파일이 안올라간다는 이슈였다.
pillow 에서 지원을 하지 않기에 따로 라이브러리를 추가해서 사용하고 있었는데 그때 사용했던 라이브러리가 pillow-avif-plugin 이 었는데 이것도 1.3.1 을 사용하고 있었고 올라간 pillow 와는 대응이 안되어지는 버전이었던 것 같다.
그래서 해당 라이브러리만 1.4.3 으로 업데이트 해주니 이슈는 해결이 되었다.
후기
이렇게 한번 업데이트를 진행해보니 크게 느꼈던 것은 테스트코드가 최소한만으로 있었어도 업데이트가 쉬웠을텐데라는 생각이였다.
참고로 API 만 해도 셀 수 없이 있는데 그거를 하나하나 케이스별로 테스트를 손수했다. ㅠㅠ
이유는 테스트코드가 없었기에 보장을 하려면 결국 모든 케이스를 손수 테스트해야했기 때문이다.
그래서 이러한 부분이 매우 아쉬웠고 또, 하나는 이 부분을 너무 급하게 하지 않았나라는 생각이다.
시간의 여유를 두고 이전의 계획을 세워두고 했으면 좋았을텐데 다른 프로젝트의 연관성 때문에 버전업을 너무 급하게 한 경황이 없지않아 있었다.
그래서 오히려 시간을 두고 지원 시간이 끝나기전에 작업을 했었으면 좋았을 것이라는 사견이 있다.
지원시간이 끝나고 했기에 이미 늦은 시간이였다고 판단이 되어지기 때문이다.
'Programming' 카테고리의 다른 글
이미지의 Content-Type이 이상하게 올라가요.... (0) 2024.09.19 python 3.8 -> python 3.11 업데이트 경험기 (3) 2024.09.13 어쩌다 DB Index를 잡았는가? (0) 2024.09.10 FastAPI와 FFmpeg를 이용해서 동영상 자르는 프로그램을 만들어보자 (1) 2023.09.30 FFmpeg 프리징 현상 해결하기 (0) 2023.09.12