본문 바로가기
프로그래밍 개발/IT 서비스 개발 운영

확장 가능 글로벌 서비스 멀티 타임존 도입기

by Jinseok Kim 2023. 8. 28.
반응형

글로벌 서비스 멀티 타임존 적용기

인도네시아 국가의 땅의 넓이는 타임존이 나뉠만큼 의외로 크다.

 

 

MyVenus - Aplikasi Perawatan Kecantikan Terlengkap & Terpecaya #1 di Indonesia

Bergabunglah dengan komunitas kami untuk menemukan solusi dari berbagai masalah seputar dunia kecantikan, melihat real review hingga mencari tahu segala hal yang berhubungan dengan treatment kecantikan maupun operasi plastik!

myvenus.io

현재 제가 운영 중인 서비스 MyVenus는 인도네시아 로컬 중심의 서비스입니다. 처음 서비스 초기에는 자카르타라는 수도 중심으로 서비스를 진행하였는데 사업 확장이 필요하게 된 것과 앞으로 인도네시아 국가를 넘어 베트남까지 확장할 수 있는 확장 글로벌 서비스로 업데이트가 필요하게 되었습니다.

특히 국가를 뛰어넘지 않더라도 바로 앞단계 계획인 인도네시아 전역 서비스 확장 또한 타임존 확장을 고려해야 했습니다. 인도네시아 국가 자체가 워낙 넓은 범위의 국가의 땅이었기에 국가 내에서도 타임존이 나뉘고 있었습니다.

 

수도 자카르타를 넘어서, 3개의 시간대 타임존을 가지고 있는 인도네시아에 걸맞게, 멀티 타임존을 지원할 수 있게 개선하는 것을 목표로 잡고 확장 멀티 타임존을 도입하게 되었습니다.

 

 

 

 

 

 

정책 Policy


 

타임존 확장을 위해서는 UTC의 개념과 활용이 필수입니다.

UTC는 "국제적인 표준 시간"이라고 볼 수 있습니다.

UTC 시간은 하루에 대략 나노초(10억분의 1초)의 정확도를 갖습니다. UTC는 현재 그레고리안 연도를 기준으로 하며 위도 0도, 본초 자오선에 위치합니다.

대부분의 시간 라이브러리는 UTC를 기준으로 만들어져있습니다. 따라서, 여러 다른 시간대로 변환 및 관리하기 매우 편리합니다.

 

 

미국(워싱턴) UTC-5 28일 오후 7시
영국 UTC+0 29일 오전 12시 (자정)
중국 UTC+8 29일 오전 8시
대한민국 UTC+9 29일 오전 9시

이렇게 국가별로 UTC +0(현재 그레고리안 연도를 기준으로 하며 위도 0) 기준으로 수치가 정의되어있습니다.

 

참고

 

협정 세계시(UTC)

협정 세계시(UTC)는 전 세계 시간 연구소가 보유하는 시간의 척도이며, 매우 정확한 원자 시계로 판별됩니다. UTC 시간은 하루에 대략 나노초(10억분의 1초)의 정확도를 갖습니다.UTC는 현재 그레고

www.ibm.com

 

 

 

 

 

인도네시아 시간대

 

아래와 같이 대표 비즈니스 지역별로 나눠 표로 정리하여 설계를 시작했습니다.

구분 시간대 대표 도시 시간대 같은 국가 offset timezone
서부 인도네시아 GMT +7 자카르타 태국 +7 Asia/Jakarta, Asia/Pontianak
중부 인도네시아 GMT +8 발리 싱가폴,대만,홍콩,중국 +8 Asia/Makassa
동부 인도네시아 GMT +9 자야푸라 한국 +9 Asia/Jayapura

 

 

 

APP

  • 보이는 병원의 모든 dateTime 은 병원의 timezone을 적용합니다.
  • 병원 정보 이외의 앱에 나타나는 시간대는 사용자의 timezone을 적용합니다.

 

 

CMS of Partners

  • 각자의 병원의 timezone 을 적용합니다.
  • Partners CMS 사용은 각자의 병원에서 직접 운영하는 것이므로 각 병원의 지역 timezone을 적용합니다.

 

 

CMS of Operations

  • 자카르타, 즉 서부 인도네시아 (GMT+7) 기준으로 적용합니다.
  • Operations CMS 사용은 사내 운영팀이 사용하고 운영팀이 자카르타(서부 인도네시아)에 위치하기 때문입니다.

 

 

 

Server

  • 서버에서는 ISO 8601 포맷 문자열을 사용합니다.
  • ISO 포맷 및 UTC+0으로 정립해두면 서버에서 요청하고 응답하는 등 주고받을 때 프론트 입장에서는 기준 통일성과 활용도가 매우 좋다고 판단했습니다.
구분 요청시 to Server 응답시 from Server
date ISOString UTC+0
offset 양수 (한국 +9)  
ISO는 데이터 교환을 다루는 국제 표준 방식입니다.

2021-08-10T 17:40:00+09:00처럼 시간 뒤에 timezone offset 이 표시되어 있기 때문에 커뮤니케이션 미스 등으로 인한 실수의 염려가 적은 게 특징입니다. 사람이 읽기 쉽다는 점이 가독성 또한 좋습니다.

 

 

 

 

Database

  • UTC를 포함한 timestamptz로 저장합니다.
TIMESTAMPTZ는 TIMESTAMP WITH TIME ZONE의 별칭입니다. TIMESTAMPTZ 데이터 형식은 날짜, 시간 및 시간대가 모두 포함된 완전한 타임스탬프 값을 입력하는 데 사용됩니다.

입력 값에 시간대가 포함되어 있으면 Amazon Redshift가 해당 시간대를 사용하여 값을 UTC로 변환하여 UTC 값을 저장합니다.

 

 

 

 

 

Timezone 기준 결정과 실제 서비스 적용


 

구분 Table 컬럼 추가 목록  
유저 timezone account  
병원 timezone hospital  
운영 timezone   default : Asia/Jakarta (+7)
option : +8, +9

위의 표와 정리한 것처럼 각자 구분된 상황에 따라 타임존을 나눠보았습니다. 그리고 추가적으로 timezone이 필요한 곳에 데이터 테이블 칼럼 또한 추가하였습니다.

 

 

유저 timezone: 유저는 당연히 각자 서비스를 사용하고 있는 위치에 따라 달라지며 더 나아가 동적으로 변할 수도 있습니다.
병원 timezone: 병원은 큰 이변이 없는 한 병원 건물이 위치하고 있는 곳이 타임존 기준입니다.
운영 timezone: 사내 운영팀은 인도네시아 자카르타에 있기에 Asia/Jakarta (+7)로 고정입니다.

 

 

이렇게 3가지 타임존 기준에 따라 서비스 내에서 광고배너, 예매, 쿠폰, 유효기간, 광고 푸시 알림 시간 등등 모든 기능 이벤트의 시간 기준을 고려하면서 글로벌 확장 타임존 기능을 실현하였습니다.

 

 

 

활용 예를 들자면 병원은 로컬 타임존이 고정이니 해당 병원 시술/수술 상품을 결제 예약 하려는 병원 위치 타임존과 유저가 사용하는 기기의 위치 타임존이 다르면 "병원 기준 시각 GMT+N"이라고 View단에 등장시켜 예약 관련 기능과 페이지에 명시해 주었습니다.

 

 

 

 

 

위의 과정을 통해 확장 타임존을 업데이트하다가 App에서 앱을 실행할 때마다 유저 timezone을 동적으로 체크하고 가져와서 업데이트하는 기능이 필요하게 되었는데 App을 사용하고 있는 기기 기능과 서버와의 조합을 통해 설계하고 기능을 구현하였습니다.

 

 

react-native-localize

A toolbox for your React Native app localization.. Latest version: 3.0.2, last published: 2 months ago. Start using react-native-localize in your project by running `npm i react-native-localize`. There are 170 other projects in the npm registry using react

www.npmjs.com

유저가 사용하는 기기 시간대 설정 가져오기 위하여 위의 라이브러리를 사용했습니다.

React Native로 만들어진 서비스 프로젝트니 참고해주세요. RN이 아니어도 비슷한 기능의 라이브러리는 직접 구현도 가능하다고 생각합니다.

 

 

 

react natvue localize 라이브러리의 기능을 사용하여 Axios request interceptors을 통해 API headers에 현재 유저가 기기를 사용하고 있는 위치 timezone과 타임존 offset을 넣어서 서버에 보내주었습니다.

 

import RNLocalize from 'react-native-localize';



...



const timezone = RNLocalize.getTimeZone();
const offset = (new Date().getTimezoneOffset() / 60) * -1;



....



// 요청시 interceptors
restApi.interceptors.request.use(
    async request => {
      try {
      
		...

        if (timezone) {
          request.headers.common.timezone = timezone;
        }

        if (offset) {
          request.headers.common['timezone-offset'] = offset;
        }

        return request;
      } catch (error) {
        return Promise.reject(error);
      }
    },
    async error => {
      return Promise.reject(error);
    },
 );

이렇게 앱이 실행 및 호출할 때마다인터셉터를 통해 API header에 유저 위치의 타임존을 담아 보내어 서버단에서 동적으로 업데이트해주었습니다.

서버에서는 API header에서 받은 타임존 데이터를 토대로 공통적으로 사용하고 있는 유저 Info 정보 데이터의 타임존을 업데이트하고 프론트단에서는 서버에서 업데이트된 최신 타임존 데이터를 뽑아와 전역으로 타임존 체크가 필요한 부분에 잘 활용할 수 있게 되었습니다.

 

 

 

 

 

 

마무리하며...


 

이렇게 위와 같은 과정들을 통해 앞으로 국경을 넘어 더 넓은 범위의 지역을 확장해도 대응할 수 있는 멀티 타임존 환경과 시스템을 구축하였습니다.

 

더 좋은 방법과 개선할 방법을 알아낸다면 계속 지속적인 업데이트를 하고 있는 중입니다.


감사합니다.

 

반응형

댓글