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 추가 설정이 필요했다.
spring:
jackson:
time-zone: Asia/Seoul
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이 응답된다.