ABOUT ME

-

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

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

     

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

     

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

     

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

     

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

     

Designed by Tistory.