본문 바로가기

Leafresh: 환경 챌린지 플랫폼

타임딜 목록 조회 시 상태값이 로컬과 서버에서 다르게 표시되는 문제 (UTC → KST) 트러블슈팅 로그

문제 요약

  • 타임딜 목록 API(/api/store/products/timedeals) 조회 시,
    • 로컬(KST) 환경에서는 상태값이 정상적으로 "ONGOING"으로 표시됨
    • Dev 서버(UTC)*에서는 같은 타임딜이 "UPCOMING"으로 잘못 표기됨
  • 예시 타임딜:
    • startTime = 2025-06-12T16:00:00
    • 조회 시점: 정확히 2025-06-12T16:00:00
    • 기대 상태: ONGOING
    • 실제 서버 응답 상태: UPCOMING

원인 분석

  1. 서버의 시스템 시간대가 UTC
    • LocalDateTime.now() 기준이 UTC로 계산됨
    • startTime이 16:00인데 서버 현재 시각은 07:00으로 인식되어 아직 시작되지 않은 것으로 판단됨
  2. Docker 컨테이너 시간도 UTC
    • JVM 내부 시간과 동일하게 잘못 계산됨
  3. application.yml의 Jackson 설정 누락
    • 응답 JSON에서 LocalDateTime 필드가 직렬화될 때 UTC 기준으로 변환됨
    • 클라이언트 화면에서도 9시간 밀린 시간이 표시됨

조치 내역

조치 항목 내용
서버 시스템 시간대 변경 sudo timedatectl set-timezone Asia/Seoul 로 OS 시간대 KST 설정
Docker 컨테이너 시간 반영 DockerfileENV TZ=Asia/Seoul 추가, localtime 심볼릭 링크 설정
JVM 타임존 설정 -Duser.timezone=Asia/Seoul JVM 실행 옵션 추가
Jackson 직렬화 기준 수정 application.ymlspring.jackson.time-zone: Asia/Seoul 설정 추가

확인 결과

  • 로컬과 dev 서버에서 동일한 startTime을 갖는 타임딜에 대해
  • 조회 시점이 startTime과 정확히 같을 경우
  • 정상적으로 "ONGOING"으로 판단됨
  • 응답에 포함된 시간들도 한국 시간 기준으로 직렬화되어 출력됨

교훈

  • 서버 시간, JVM 시간, JSON 직렬화 기준까지 모두 시간대 기준이 통일되어야 시간 민감한 기능이 정확하게 작동함
  • 특히 LocalDateTime.now() 기반 로직은 타임존 오차에 민감하므로 환경 일치 필수
  • 이후 신규 배포 시 시간대 통일 체크리스트 포함 필요