-
타임존을 맞추는 방법에 대해서 알아보자
문제 상황
1차 MVP를 위해서 사용자 이벤트 로그를 쌓는 도중에 DB에 시간이 이상한 것을 확인하였다..
분명 지금은 새벽 2시인데 점심으로 표시되는 것..!
알고보니 서버 시간을 맞춰주지 않은 것이다
Java, Kotiln에서 `LocalDateTime.now()`를 하게되면 기본적으로 서버(시스템)에서 설정된 시간대를 반환한다
Docker Container는 아무런 설정을 하지 않았을 경우, UTC로 설정된다.
때문에, 내가 이벤트 발생날짜를 저장했을 때 UTC로 저장된 것이다.
해결 방법
1. 서버 시간대 설정
그래서 아래와 같이 `Dockerfile`에 타임존 설정을 추가하였다.
FROM eclipse-temurin:17-jdk-alpine AS build WORKDIR /workspace/app COPY . . RUN chmod 777 ./gradlew && ./gradlew build -x test --parallel RUN mkdir -p build/extracted && (java -Djarmode=tools -jar build/libs/flownews.jar extract --layers --launcher --destination build/extracted) FROM eclipse-temurin:17-jdk-alpine VOLUME /tmp ARG EXTRACTED=/workspace/app/build/extracted RUN apk update RUN apk --no-cache add curl RUN apk --no-cache add tzdata # 타임존 설정 추가 ENV TZ=Asia/Seoul RUN cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime && \ echo "Asia/Seoul" > /etc/timezone ENV SERVER_PORT=80 COPY --from=build ${EXTRACTED}/dependencies/ ./ COPY --from=build ${EXTRACTED}/spring-boot-loader/ ./ COPY --from=build ${EXTRACTED}/snapshot-dependencies/ ./ COPY --from=build ${EXTRACTED}/application/ ./ ENTRYPOINT ["java","org.springframework.boot.loader.launch.JarLauncher"]실제로 배포된 서버에서 확인해보니 바뀌어있는 모습!!

cat /etc/timezone 2. DB 시간대 설정
RDS를 사용할 때 영구적으로 타임존을 변경하려면 `Parameter Group`을 사용해야한다.
- 파라미터 그룹 신규 생성
- `time_zone` 변경
- RDS 재시작

파라미터 그룹 다른 방법은 없을까?
팀원들이 제안하는 방법은 `timestamp`로 저장하는 방법이다.
timestamp?
- 1970년 1월 1일 0시 0분 0초(UTC)부터 경과한 초나 밀리초 등의 정수 값
- UTC를 기준으로 저장되며 서버 타임존에 따라 다르게 보여질 수 있음
- datetime 4byte, timestamp 4/8byte
- 여러 타임존에 유연하게 변환이 가능하지만 특정 시간대까지만 저장할 수 있음 (1970-01-01 ~ 3001-01-18)
나도 여러 타임존에 대응할 수 있다는 것은 동의하면서도
- 아직은 외국에 서비스를 제공하지 않는점
- 타임스탬프의 저장방식이 직관적이지 않다는 점 ex) 172319327192
때문에 서버, DB의 타임존을 일치시키는 것으로 해결했다.
추후 글로벌 서비스로 가면 마이그레이션은 필요할 것같다.
'SW 마에스트로' 카테고리의 다른 글
내가 사용한 애자일(2/2) (0) 2025.12.17 내가 사용한 애자일(1/2) (0) 2025.12.15 쿠폰 서비스 만들기 (3/3) (0) 2025.06.22 쿠폰 서비스 만들기 (2/3) (0) 2025.06.04 쿠폰 서비스 만들기 (1/3) (0) 2025.05.30