pile·
백엔드·8퍼센트8퍼센트·

Django timezone 문제 파헤치기

Django에서 날짜와 시간을 다룰 때 생기는 timezone 문제와 그 해결법을 정리한 글이다. USE_TZ와 TIME_ZONE을 켠 한국향 서비스에서 naive와 aware datetime이 섞이며 생기는 증상을 세 갈래로 나눠 짚는다. Python 3.5, Django 1.9, PostgreSQL 기준이다.

핵심 포인트
  • settings에 USE_TZ를 True로, TIME_ZONE을 Asia/Seoul로 두는 것이 출발점이다.
  • datetime.now()는 설정에 따라 +9 기준 값을 주지만 timezone 정보가 없는 naive 객체다.
  • 그 값을 저장하면 DB에는 UTC 기준으로 들어가고 모델로 읽으면 UTC 기준의 aware 객체가 나온다.
  • 읽은 값에 date()를 호출하면 UTC 기준 날짜라 한국 시간으로 오전 9시 이전이면 하루 전이 된다.
  • naive와 aware 객체를 비교하면 예외가 난다.
  • DateTimeField와 달리 DateField는 UTC가 아니라 한국 날짜로 저장되고 읽힌다.
상세 정리
  • 전제 환경: Python 3.5, Django 1.9, PostgreSQL 조합을 기준으로 설명한다.
  • 설정: 한국 시간을 쓰려면 settings에서 USE_TZ를 켜고 TIME_ZONE에 Asia/Seoul을 지정한다.
  • 영향 1: datetime.now()나 today()로 현재 시각을 얻으면 TIME_ZONE 설정에 따라 +9 기준 값이 나오지만 타임존 정보가 붙지 않은 naive 객체다.
  • 영향 2: 그 값을 그대로 DB에 저장하면 UTC 기준 시간값으로 저장된다.
  • 영향 3: 모델을 통해 읽은 DateTimeField 값은 타임존이 UTC인 aware 객체다.
  • 문제 1 날짜 어긋남: 읽은 값에 date()를 붙이면 UTC 기준 날짜가 나와 한국 시간 기준 날짜와 맞지 않는다. 한국 시간으로 오전 9시 이전이면 UTC 기준으로는 전날이 된다.
  • 문제 2 비교 예외: strptime으로 문자열을 파싱하거나 datetime.now()로 얻은 naive 객체를 aware 객체와 비교하면 예외가 발생한다.
  • 문제 3 필드별 차이: DateField는 UTC 기준이 아니라 한국 날짜로 저장되고 읽혀 DateTimeField와 동작이 갈린다.
  • 해결 1: datetime.now() 대신 django.utils.timezone의 now를 써서 처음부터 aware 객체를 다룬다.
  • 해결 2: 한국 시간 표현이 필요하면 timezone의 localtime으로 변환한다.
  • 해결 3: naive 객체를 쓸 수밖에 없다면 make_aware로 변환한 뒤 비교한다. 상환 예정 시각 문자열을 파싱해 투자 생성 시각과 비교하는 예제를 든다.
  • 마무리: 전 세계 기준 시간대가 한국이 아닌 이상 한국향 서비스는 이 문제를 피할 수 없으므로 처음부터 aware 객체로 다루는 편이 낫다는 취지로 맺는다.
왜 읽나Django 서비스에서 날짜가 하루씩 어긋나거나 datetime 비교에서 예외가 난 적이 있다면 원인 세 갈래와 대응 함수가 바로 정리된다.
8퍼센트
8퍼센트 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 백엔드·twilio-engTwilio Engineering·

    Programmable Messaging에서 Verify API로 마이그레이션하기

    Twilio의 Programmable Messaging API로 자체 OTP 솔루션을 운영하던 서비스가 Verify API로 전환하는 방법을 코드 예시와 함께 설명한다. Verify는 OTP 전송·검증을 위한 전용 API로, 전화번호 구매, 토큰 생성, DB 저장·만료 관리를 내부에서 처리해 개발자가 직접 구현할 코드를 크게 줄인다.

    요약 이어보기
    #authentication#twilio#sms+2
  2. 백엔드·포스타입포스타입·

    포스타입이 개인화 추천을 하는 방법 2부

    포스타입 백엔드 엔지니어가 벡터 기반 개인화 추천 시스템을 실제 운영하며 맞닥뜨린 성능 장애와 용량 문제를 해결한 과정을 담은 2부다. 수백만 개의 벡터 KNN 검색이 피크 시간대에 전체 Elasticsearch 검색 성능을 흔드는 문제부터 클러스터 OOM 사태까지, 쿼리 최적화와 인프라 분리 두 가지 경로로 근본 해결에 이른다.

    요약 이어보기
    #elasticsearch#vector-search#recommendation-system+2
  3. 백엔드·포스타입포스타입·

    포스타입이 개인화 추천을 하는 방법 1부

    포스타입이 태그 기반 추천의 한계를 극복하고 벡터 임베딩 기반 개인화 추천 시스템을 구축한 과정을 담은 1부다. 유사한 콘텐츠가 다른 용어를 쓰거나 동일한 태그가 전혀 다른 톤의 콘텐츠를 가리키는 문제를 임베딩 벡터로 해결하고, OpenSearch의 HNSW ANN 검색으로 수백만 벡터를 실시간 검색하는 시스템을 구축해 구매율 15% 향상을 달성했다.

    요약 이어보기
    #opensearch#vector-search#recommendation-system+2