Timezone 설정을 위한 여정

AWS EC2, MySQL, Spring 시간 설정하기

서버 시간을 UTC → KST로 바꿔야 한다. 목적은 아래와 같다.

  1. 우리 서비스에서 한 상품에 대한 리뷰는 인당 하루에 하나만 가능하다. 자정을 기준으로 초기화할 것이기 때문에 리뷰의 createdAt 컬럼이 제대로 표시되어야 한다.
  2. AWS EC2에 쌓이는 로그 파일을 일정 시간마다 AWS S3로 전송하여 보관할 것이다. 마찬가지로 자정을 기준으로 옮길 것이므로 정확한 확인을 위해 시간대를 설정할 필요가 있다.

AWS EC2 서버 시간 동기화하기

AWS는 기본적으로 Amazon Time Sync Service를 지원한다.

ubuntu ec2는 NTP(Network Time Protocol로 시간이 설정되어 있다.

💡 NTP와 Chrony
NTP의 단점을 보완한 네트워크 프로토콜이 Chrony (a versatile implementation of the Network Time Protocol)이다.
NTP는 정기적인 폴링이 필요하기 때문에 영구적으로 유지되는 시스템 혹은 브로드캐스트나 멀티캐스트 IP를 사용하는 환경에 적합하다.
Chrony는 네트워크가 자주 중단되는 경우에 주로 사용한다.

(참고1, 참고2)

AWS 문서를 참고 하여 chrony를 사용해 서버 시간을 동기화할 수 있다.

Timezone 설정 변경하기

위의 방법은 UTC가 기본이다. KST로 바꾸려면 추가 작업이 필요하다.

$ date

현재 서버 시간을 확인할 수 있다.

$ sudo cat /etc/localtime

어디에 시간이 맞춰져있는지 본다. 지금 현재 나는 UTC로 설정되어 있고, KST로 바꿀 것이다.

$ ls /usr/share/zoneinfo

위 명령어로 검색하면 타임존을 확인할 수 있다. Asia/Seoul 은 저 경로 아래 Asia 에서 확인이 가능하다.

현지 시간을 참조할 때 표준 시간대 파일을 찾아볼 수 있도록 심볼 링크 설정을 해준다.

$ sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

(참고1, 참고2)

MySQL 설정 변경하기

select @@system_time_zone;
select @@global.time_zone;
select now();

여러 시간 확인 방법들.

set @@global.time_zone = 'Asia/Seoul'

이렇게 설정할 수 있다.

SpringApplication에 설정하기

위의 방법들을 다 시도해도 서비스에서는 UTC로 반영된다.

(참고1, 참고2, 참고3, 참고4)

1. jar 실행할 때 옵션 주기

$ java -jar -Duser.timezone=Asia/Seoul

2. 빈 초기화 될 때 설정하기

timezone_spring_img

@PostContruct 는 의존성 주입이 이루어진 후 빈을 초기화하는 메서드를 선언한다. 이 메서드는 WAS가 실행될 때 호출하므로, 빈이 생성될 때 딱 한 번만 초기화한다.


© 2017. All rights reserved.

Powered by Hydejack v7.5.2