docker를 활용해서 application을 실행하는데 등록 api 요청시 createdAt과 modifiedAt 속성이 모두 9시간 전으로 나왔다. 이것은 TimeZone이 Asia/Seoul로 설정되지 않아서 발생하는 문제이다. 이를 해결해야 한다
sql에 저장해야 하므로 sql의 시간을 대한민국 서울 표준시로 설정이 되야 할 것이다. 이를 해보자
mysql에서 timezone을 설정할 수 있다. 나는 인스턴스에서 docker-compose를 활용하고 있으므로 이를 활용해 timezone을 설정해보자
# application.yml
sql-db:
image: mysql:8.0
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: ~~~~~~
MYSQL_DATABASE: ~~~~~~
TZ: Asia/Seoul
volumes:
- db_data:/var/lib/mysql
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
sql-db라는 컨테이너에 image를 mysql를 사용한다. 이 때 environment에서 TZ가 있는데 이것은 timezone을 설정하는 곳이다. 이를 Asia/Seoul로 설정한 후 docker-compose를 실행해주면 된다.
docker-compose exec -it sql-db bash
해당 명령어를 사용하면
다음과 같이 창 좌측에 bash라고 뜨며 sql 컨테이너와 상호작용할 수 있다.
여기서 date를 입력하면
KST로 성공적으로 적용됬음을 알 수 있다.
java를 실행할 때 timeZone을 주는 것이다. 이를 활용하면 java application 실행시 default로 time zone이 Asia/Seoul로 설정되어 db에 저장할 때 시간이 정확하게 반영 될 수 있다.
우리가 원하는 자바 어플리케이션 컨테이너를 얻기 위해서는 필요한 image를 빌드해야 한다.
FROM openjdk:11-jdk-slim
WORKDIR /app
COPY build/libs/meca-0.0.1-SNAPSHOT.jar app.jar
ENV SERVER_MODE default
ENV PORT 8000
ENV LOCATION "/"
ENTRYPOINT ["java","-Dserver.port=${PORT}","-Dspring.profiles.active=${SERVER_MODE}", "-jar", "app.jar", "--spring.config.location=${LOCATION}", "-Duser.timezone=${TZ}"]
ENTRYPOINT를 정의함으로써 image의 env를 통해 jar를 실행 옵션을 컨테이너에서 활용할 수 있다.
"-Duser.timezone=${TZ}" 와 같이 설정해두면 docker에서 env에 TZ=Asia/Seoul를 설정하면 java application의 time zone은 KST로 설정될 것이다.
java-api-server:
image: limhyeongyu/meca
ports:
- "~~~~:~~~~"
environment:
PORT: ~~~~
LOCATION: /app/config/application.yml
TZ: Asia/Seoul
depends_on:
- sql-db
volumes:
- /home/ubuntu/config:/app/config
여기서 TZ를 Asia/Seoul로 설정하면 시간이 TimeZone으로 설정된다.
현재 윈도우에 표시된 시간과 postman에서 저장 요청에 대한 응답의 생성 시간과 일치한다면 정확하게 잘 설정된 것이다. 이를 테스트 해보자
응답 결과 23-04-20 그리고 오전 12:36 == 00:36으로 일치함을 알 수 있다.