Programming

Django 3.2 -> 4.2 변경 기록

True or False 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 만 해도 셀 수 없이 있는데 그거를 하나하나 케이스별로 테스트를 손수했다. ㅠㅠ

이유는 테스트코드가 없었기에 보장을 하려면 결국 모든 케이스를 손수 테스트해야했기 때문이다.

 

그래서 이러한 부분이 매우 아쉬웠고 또, 하나는 이 부분을 너무 급하게 하지 않았나라는 생각이다.

 

시간의 여유를 두고 이전의 계획을 세워두고 했으면 좋았을텐데 다른 프로젝트의 연관성 때문에 버전업을 너무 급하게 한 경황이 없지않아 있었다.

 

그래서 오히려 시간을 두고 지원 시간이 끝나기전에 작업을 했었으면 좋았을 것이라는 사견이 있다.

 

지원시간이 끝나고 했기에 이미 늦은 시간이였다고 판단이 되어지기 때문이다.