[Spring] DB에 시간 KST로 저장하는 법

icebox127·2026년 6월 5일

DB에 기본으로 현재 시각을 저장하면 UTC로 나와 한국 시간과 차이가 있었다.

설정 추가

DB 설정: Asia/Seoul로 변경

  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    properties:
      hibernate:
        format_sql: true
        jdbc:
          time_zone: Asia/Seoul // 추가

이렇게 하니 KST로 저장되었다.

배포 서버에서 적용 안 되는 문제

KST 설정 했으니 이제 된 줄 알았는데 프론트에서 아직도 UTC라는 연락을 받았다,,,

  • db
    KST로 오후 11:46분

  • 로컬 서버
    KST로 오후 11:46분

  • 배포 서버
    UTC로 오후 2:46분

??

DB에는 2026-06-02 23:46:24로 정상 저장되고 있었으며, 로컬 환경에서도 동일한 시간이 응답되었다.

반면 배포 환경에서는 같은 데이터가 2026-06-02 14:46:24으로 반환되어 9시간 차이가 발생했다.

=> 배포 서버 응답에서만 KST가 적용 안 되고 있었다.

DB에 저장된 LocalDateTime 데이터를 가져오는 것 뿐인데 어떻게 UTC로 반환된 것일까?

원인

Jackson: Java 객체 ↔ JSON 변환 라이브러리

현재 서비스의 데이터 흐름은 다음과 같다.

MySQL
↓
JPA
↓
Entity
↓
DTO
↓
Jackson
↓
JSON 응답

이중 MySQL(DB)과 Entity, DTO에는 문제가 없는데(로컬 서버 기준) 배포 응답에서만 달라지는걸로 보아 Jackson에서 JSON으로 변환할 때 문제인걸로 추측했다.

실제로, LocalDateTime은 타임존 정보를 포함하지 않는 객체라고 한다.
따라서 Jackson이 JSON으로 직렬화할 때, JVM 타임존을 기준으로 시각을 해석한다.

로컬에선 내 운영체제에 맞게 Asia/Seoul을 기준으로 하지만, 배포 서버는 AWS 기준이므로 UTC 기준이었던 것이다.

hibernate.jdbc.time_zone
→ DB 저장/조회 시점에만 적용

JVM TimeZone
→ 애플리케이션 내부 시간 처리 및 JSON 직렬화에 영향

즉 위의 hibernate.jdbc.time_zone=Asia/Seoul 설정은 JDBC와 DB 간의 시간 처리에만 적용되며, JSON 응답 직렬화에는 영향을 주지 않아, 배포 응답을 KST로 직렬화하기 위해서 Jackson 추가 설정이 필요했다.

해결

  1. application.yml에 Jackson 설정 추가
spring:
  jackson:
    time-zone: Asia/Seoul
  1. Dockerfile에 TimeZone 추가
FROM eclipse-temurin:21-jdk
WORKDIR /app
RUN apt-get update && apt-get install -y git
ENV TZ=Asia/Seoul // 추가
COPY build/libs/app.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]


같은 게시글을 배포 서버로 조회했을 때, 이제 KST로 2026-06-02 23:46:24이 응답된다.

참고

Spring-Boot-Docker-환경에서-DB-시간-KST로-고정하기-TZAsiaSeoul

[Spring] 로컬에서는 KST, 서버에서는 UTC. Spring Boot 시간대/타임존 문제 해결

profile
감자의 공부기록🥔

0개의 댓글