SW개발/Django

[Django]TIME_ZONE, USE_TZ 설정 (feat. 글로벌 서비스)

오롯이 한국에서만 서비스를 한다면 타임존 설정(DB포함)은 전부 Asia/Seoul 로 통일하면 됩니다.

하지만, 글로벌 서비스를 염두하고 있거나, 추후에 글로벌 진출을 고려한다면 타임존 문제는 사전에 해결하고 가는 것이 좋습니다. 이미 정해버린 타임존을 되돌리는 것은 생각보다 많이 어렵습니다.

 

글로벌 서비스를 하고있는 프로덕트를 개발하다가 타임존에 대해서 항상 헷갈리는 부분이 있어 공부하는 차원에서 포스팅하게 되었습니다.

 

대부분의 내용은 장고의 공식 문서를 참고하였습니다.

https://docs.djangoproject.com/en/3.2/topics/i18n/timezones/

 

Django

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

Naive and aware datetime objects

장고의 타임존에 대해 이해하려면 먼저 파이썬에서 지원하는 datetime의 특징에 대해서 알아야 합니다. 파이썬의 datetime 객체에는 두가지 형식이 존재합니다.

  1. Naive datetime 객체 - 타임존에 대한 정보는 없고 시간정보만 담겨있음
  2. Aware datetime 객체 - 타임존에 대한 정보인 tzinfo가 시간정보와 함께 담겨있음
>>> from datetime import datetime
>>> import pytz
>>> asia_timezone = pytz.timezone('Asia/Seoul')
>>>
>>> naive_datetime = datetime.now()
>>> naive_datetime
datetime.datetime(2022, 11, 15, 22, 5, 51, 260128)
>>> aware_datetime = datetime.now().replace(tzinfo=asia_timezone)
>>> aware_datetime
datetime.datetime(2022, 11, 15, 22, 6, 31, 476527,
                  tzinfo=<DstTzInfo 'Asia/Seoul' LMT+8:28:00 STD>)

위처럼 tzinfo, 타임존에 대한 정보가 담겨있는 것을 Aware datetime 객체라고 부릅니다.

 

USE_TZ 설정

USE_TZ는 장고 내부적으로 aware 객체를 사용할지 말지에 대한 설정값입니다. 기본적으로 False이며, True로 활성화 하게되면 장고는 내부적으로 tzinfo가 담긴 timezone을 사용하게 됩니다.

from django.utils import timezone

# USE_TZ=True -> aware datetime
now = timezone.now()
# USE_TZ=False -> naive datetime
now = timezone.now()

USE_TZ=True 옵션을 설정하면, datetime 관련 코드는 전부 django에서 제공하는 timezone을 사용하는 것을 추천드립니다. 파이썬 내장 datetime의 경우는 tzinfo가 존재하지 않습니다.

 

TIME_ZONE 설정

TIME_ZONE 값은 장고 서버(코드 베이스)에서 인식하는 시간대를 말합니다.

 

Django 프로젝트를 새로 생성하는경우, TIME_ZONE의 deafult 값은 'UTC' 입니다. TIME_ZONE의 값을 'Asia/Seoul' 로 변경하고, USE_TZ 옵션을 True로 주게되면, DB에서 값을 읽어오는 경우 자동으로 한국 시간대로 변경이 됩니다.

 

추천하는 설정값

글로벌 프로덕트를 만드는 한국 개발팀의 경우에는 TIME_ZONE = 'Asia/Seoul', USE_TZ=True로 설정하시는 것을 추천 드립니다.

이렇게 설정하게 되면 DB에는 UTC시간으로 저장되고(Postgresql의 타임존이 UTC일 경우), 값을 읽어올 때는 한국 시간으로 변환되어 집니다. 또한, aware 객체를 사용하기에 타임존 정보를 포함하여 프론트로 데이터를 전달해주면, 유저의 타임존에 맞는 시간으로 변환하기에도 용이합니다.

 

만약, 글로벌 프로덕트를 만드는 글로벌 개발팀이라면 TIME_ZONE = 'UTC', USE_TZ=True로 설정하시면 될 것 같습니다. 코드 베이스 내에서도 UTC의 타임존을 이용하는 것이 각국의 개발자들이 이해하기에 용이할테니까요.

 

 

장고 공식 문서를 바탕으로 주요 내용을 정리해보고, 제가 추천하는 타임존 설정값에 대한 포스팅을 해보았습니다.  잘못 이해하여 틀린 내용이 있을 수 있습니다. 만약 발견 하신다면 댓글로 남겨주시면 수정하도록 하겠습니다!

 

읽어주셔서 감사합니다 :)

 

728x90