로컬에서는 작성 시간이 정확히 저장되고 표시되는데, 운영 서버에서는 현재시간에서 9시간 적게 표시되는 문제가 있었다. 예전에도 비슷한 문제가 있었는데 timezone 설정이 원인이었어서 하나씩 체크해보았다.
1. 소스 코드 확인
2. 운영 서버 DB timezone 설정 및 저장된 데이터 확인
3. 운영 서버 시간대 설정 확인
java 날짜 및 시간 유형 차이
원래 현재 시간을 측정할 때 LocalDateTime
클래스를 사용했는데 다른 팀원분이 찾아본 결과 LocalDateTime
은 시간대를 나타내는 데 주로 사용하고, Instant
라는 클래스는 특정 시각을 나타내는 데 주로 사용한다는 것을 알려주셨다.
LocalDateTime을 찾아서 Instant로 단순치환해서 실행해봤는데 에러 없이 돌아가는 것을 보니 메소드 명 등 사용법은 같은 듯하다.
하지만 처음 찾으려고 했던 시간대 문제는 운영에서만 일어나고 로컬 서버에서는 시간 문제가 없어서 운영서버 환경의 문제라는 생각이 들었다.
mysql timezone 설정 확인 및 변경
운영서버 환경 문제라고 생각하고 처음 확인한 것은 운영서버의 mysql DB의 timezone 설정이다. mysql에서 시간을 저장하는 데이터 타입은 여러가지가 있는데, 그 중 자주 사용하는 것이 Datetime
과 timestamp
이다. 두 개의 차이점을 잘 몰랐는데, timezone 정보를 포함하고 있는지 여부가 다르다고 한다.
혹시 DB에 시간이 다르게 저장되고 있는지 데이터를 확인해봤는데, timezone을 저장하지 않는 datetime 타입이고 데이터도 현재 한국시간 기준으로 잘 저장되고 있었다.
운영서버의 DB에도 시간은 한국시간으로 잘 저장되는 것을 보니 결국 DB 저장까지도 문제없고, 화면에서 보여줄 때 시간을 변환한다는 것을 알 수 있었다.
마지막으로 혹시 서버 시간대가 다르게 설정되어있는지 확인해보았다.
homey 프로젝트의 운영서버는 사내 서버자원을 일부 빌려서 운영되는 형태였는데, 사실 서버 환경설정을 직접 해보지는 못했기 때문에 시간대가 다를 수 있다는 생각을 못했다.
혹시나 해서 검색해보니 잘 정리된 글을 발견해서 우분투 서버의 시간대를 확인해보았더니 역시! Asia/Seoul
이 아닌 UTC~
로 되어있는 것을 볼 수 있었다.
ubuntu timezone 확인 및 변경하기
글에서 설명하는 대로 시간대를 원하는 것으로 바꾸어 주니 소스코드나 DB 설정, 데이터를 변경하지 않아도 알아서 웹사이트에서 정확한 시간대로 출력되었다.