이번에 타이머 기능을 구현하면서 supabase DB에 있는 timestamp 타입의 데이터를 많이 다루게 되었는데, 그 과정에서 time zone에 대해 대수롭지 않게 여겼다가 황당한 오류로 하루를 날렸다.
테이블 컬럼 타입을 변경하면서 오류는 해결되었지만, 정확히 without time zone과 with time zone의 차이를 이해하고자 블로그를 작성해보려고 한다.
대충 차이는 알겠는데, DB 상에서 timestamp와 timestampz이 동일한 형식으로 출력이 되고 있어서 아예 눈치채지 못하고 있었다.
timestamp without time zone
- 시간대 정보를 포함하지 않는 타임스탬프 형식
- 입력한 시간 값이 그대로 저장
- 시간대 변환 없이 시간만 저장하고자 할 때 사용, 같은 데이터베이스를 다른 시간대에서 조회하더라도 동일한 시간 값으로 나타남
- ex) 2023-10-31 15:00:00
timestamp with time zone
- 시간대 정보를 포함한 타임스탬프 형식
- 입력한 시간 값이 UTC로 변환되어 저장
- 조회 시 클라이언트 세션의 시간대에 맞춰 자동 변환
- 글로벌 애플리케이션에서 각 사용자의 시간대에 맞는 시간 정보를 저장하거나 보여줄 때 유용
- ex) 2023-10-31 15:00:00+09 (한국 시간대에서 입력한 경우)
예시를 들어 설명하자면
한국 시간대(UTC+9)에서 2023-10-31 15:00:00을 저장한다고 할 때
timestamp without time zone : 2023-10-31 15:00:00
timestamp with time zone : UTC로 변환되어 2023-10-31 06:00:00으로 저장, 조회 시 자동 변환.
new Date()
자바스크립트의 new Date() 함수는 현재 사용자의 시간을 타임존을 포함하여 반환.
new Date().toISOString()
toISOString 메서드는 타임존 시간을 UTC 기준의 string으로 변환.
supabase에 timestampz타입에 데이터를 넣을 때 문자열 타입으로 넣어야해서 toISOString() 변환 후 insert 하면 불러올 때 자동으로 변환이 되어서 문제없이 사용할 수 있다.