글로벌 서비스를 개발하다 보면, 사용자마다 접속 지역이 달라 시간이 서로 다르게 표시될 수 있습니다.

특히 다국어·다국가 관리자 시스템의 경우, 단순히 브라우저 로컬 시간대로 시간을 보여주는 것은 한계가 있습니다.

예를들어 시스템은 utc 기준이고 java의 Date타입을 그대로 클라이언트로 전송할 경우 클라이언트의 지역 시간대로 자동변환되어 사용자에게 혼란을 줄 수 있습니다.

혼란을 줄수 있는 상황 재현
1. Oracle → Java
•Oracle의 DATE 필드는 Java에서 java.util.Date 또는 LocalDateTime으로 받아 사용
•서버는 기본적으로 UTC 타임존에서 동작하도록 설정

2. Java → JavaScript
•서버는 클라이언트로 시간 정보를 timestamp (long) 형태로 전달 (date.getTime())
•예: 2025-05-29 12:00:00 UTC → 1748510400000

3. JavaScript 클라이언트 처리
const date = new Date(1748510400000);
console.log(date.toString());
•한국(UTC+9): Thu May 29 2025 21:00:00
•인도네시아(UTC+7): Thu May 29 2025 19:00:00

동일한 시간 정보라도, 클라이언트의 시간대 설정에 따라 자동으로 다르게 보입니다.
만약 한국시간으로 설정된 pc를 사용하여 한국사람이 인도네시아 서버를 관리하는 경우 시간이 자동으로 한국시간으로 노출되어 인도네시아에서 접속한 사람과의 혼란이 발생합니다.

문제가 되는 상황
예약 기능, 마감일 등지역에 따라 시각이 달라져 예약 시간 오류 발생
날짜 비교 로직타임존 차이로 하루 차이 등 오작동 발생
날짜 포맷 표시같은 데이터라도 사용자에 따라 시간 표시가 달라져 혼란 초래


이를 해결하기 위해 DB와 서버는 UTC 기준, 사용자 계정에 설정된 국가의 타임존으로 시간 변환, 클라이언트에서는 변환된 문자열을 그대로 표시하는 구조를 설명합니다.

1. DB는 UTC 기준으로 저장

•모든 DATE, TIMESTAMP는 UTC 기준으로 저장
•SYSTIMESTAMP AT TIME ZONE 'UTC' 등을 활용

2. Java 서버에서 시간대 변환

•각 사용자 계정에 맞는 타임존 정보 사용 (예: "Asia/Seoul", "Asia/Jakarta")
•시간 변환 후 String 형식으로 변환하여 반환

ZonedDateTime utcZoned = instant.atZone(ZoneId.of("UTC"));
ZonedDateTime localTime = utcZoned.withZoneSameInstant(ZoneId.of(userTimeZone));
String formatted = localTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));

3. 클라이언트에서는 문자열 그대로 표시
<span>2025-05-29 21:00:00</span>

•프론트에서는 JS Date 객체로 다시 변환하지 않음
•시각적으로 오해 없이 “국가 기준 시간”으로 고정됨

주의할 점

•타임존 변경 시 서버에서 매번 ZonedDateTime 변환이 필요
•사용자별 타임존 설정이 누락되지 않도록 유효성 검증 필요
•서버에서 포맷된 문자열은 반드시 일관된 포맷으로 제공 (yyyy-MM-dd HH:mm:ss 등)


다국가, 다시간대 사용자를 지원하는 시스템에서는 단순한 시간 처리로는 문제를 피할 수 없습니다.
“UTC로 저장 → 사용자 기준 타임존으로 변환 → 문자열 반환” 전략을 적용하였지만 사실 다른 방법도 많습니다.

무엇보다 중요한 것은 ‘시간 처리 방식의 통일성’입니다.
여러 계층(클라이언트, 서버, DB)에서 중복되거나 서로 다른 방식으로 시간을 처리하게 되면, 유지보수가 어려워지고 오류 가능성도 커집니다.
하나의 일관된 기준을 정하고, 그에 따라 시간을 저장하고 변환하는 구조를 갖추는 것이 안정적인 시스템 운영의 핵심입니다.

+ Recent posts