본 문서는 댓글 작성 시각이 실제 시각과 약 8~9시간 차이가 발생한 문제에 대해
원인 분석부터 해결까지의 전 과정을 구조적으로 정리한 기술 문서입니다.
시간대 문제는 서버·DB·컨테이너 환경의 시간대 불일치에서 비롯된 것으로 분석되었으며,
각 레이어의 시간대를 한국 표준시로 통일하여 문제를 해결하였습니다.

createdAt 값의 차이를 검증한 결과, 응답 데이터의 시간 자체가 실제 값보다 약 9시간 늦게 저장 또는 직렬화되고 있음이 확인됨.시간 표시 함수나 화면 출력 로직과 무관하게,
서버에서 내려오는 날짜·시간 값 자체가 이미 UTC 기준으로 기록되고 있었던 문제로 판단되었다.
초기 application.yml 구조를 확인하던 중,
일부 설정이 잘못된 계층 아래 배치되어 있어 Spring이 이를 인식하지 못하고 있는 상황이 발견되었다.
예시:
spring:
application:
name: backend
jackson:
time-zone: Asia/Seoul
위 구조는 다음과 같은 문제를 가지고 있었다.
jackson 및 datasource 관련 설정이 spring.application 아래 잘못 배치되어 있었고,spring.jackson.time-zone 키로 등록되지 않기 때문에application.yml은 다음과 같이 수정되었다.
spring:
application:
name: backend
jackson:
time-zone: Asia/Seoul
datasource:
url: jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3308}/${DB_NAME:codenemsy}?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
username: ${DB_USERNAME:root}
password: ${DB_PASSWORD:1234}
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
data-source-properties:
serverTimezone: Asia/Seoul
이 설정을 통해 다음 사항이 보장된다.
Asia/Seoul 기준 적용Asia/Seoul로 해석그러나 이 수정만으로도 시간 차이는 지속되었고,
문제는 Spring이나 애플리케이션 레이어가 아니라 DB 또는 Docker 환경에서 비롯된 것으로 보였다.
MySQL은 다음 쿼리를 통해 현재 시간대 설정을 확인할 수 있다.
SELECT @@global.time_zone, @@session.time_zone;
실제 출력:
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM | SYSTEM |
+--------------------+---------------------+
이는 다음을 의미한다.
따라서 정확한 문제를 파악하기 위해 MySQL 컨테이너의 OS 시간대를 점검하였다.
MySQL 컨테이너 내부로 진입하여 OS의 시간을 확인하였다.
docker exec -it mysql8 bash
date
이때 출력되는 시간이 한국 표준시(KST)가 아닌 경우,
다음과 같은 결론을 얻을 수 있다.
SYSTEM 시간대를 사용 중이므로,created_at 값이 실제 한국 시간보다 9시간 느리게 기록된다.이는 API 응답에서도 동일하게 반영되어
작성한 지 얼마 되지 않은 데이터가 9시간 전으로 표시되는 현상을 발생시킨다.
컨테이너 내에서 다음 명령을 실행하여 OS 시간대를 KST로 변경하였다.
ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
echo "Asia/Seoul" > /etc/timezone
이후 MySQL 서버를 재시작하였다.
docker restart mysql8
MySQL 프로세스는 재시작 후에도 시스템 시간을 따라가지만,
보다 확실한 일관성을 위해 MySQL 내부에서도 time_zone을 명시적으로 설정하였다.
SET GLOBAL time_zone = 'Asia/Seoul';
SET time_zone = 'Asia/Seoul';
이후 다시 확인:
SELECT @@global.time_zone, @@session.time_zone;
이제 이상적으로 다음과 같은 결과를 얻을 수 있다.
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| Asia/Seoul | Asia/Seoul |
+--------------------+---------------------+
이 상태에서는
모두 Asia/Seoul 기준으로 일치하게 된다.

이 중 하나라도 UTC 또는 잘못된 값으로 설정되어 있으면
전체 파이프라인에서 시간 차이가 누적될 수 있다.
spring.jackson이나 spring.datasource.hikari가 잘못된 위치에 존재하면
설정이 정상적으로 반영되지 않으며,
결과적으로 예상치 못한 시간대 처리 문제를 초래할 수 있다.
SYSTEM은 컨테이너 OS를 의미한다MySQL에서 time_zone이 SYSTEM으로 보인다고 해서 정상이라는 의미가 아니며,
컨테이너 OS의 시간대가 한국 기준인지 반드시 확인해야 한다.