SSAFY 공통 프로젝트에서 웹 기술을 주제로 WebRTC를 활용한 多:多 미팅 서비스를 개발하였다.
개발 및 배포 과정에서 Local 환경과 배포 서버 환경에서 시간이 상이한 문제가 발생하여 문제 해결 과정을 작성해보고자 한다.
이번 프로젝트에선 Amazon EC2 서버를 SSH 클라이언트로 MobaXterm에 접속시켰다.
처음엔 Linux 환경에 시간 설정이 Asia/Seoul이 아닌 UTC로 설정으로 되어있어, Frontend의 React환경에서 new Date() 로 생성된 시간과 KST의 시간이 달라, 생성된 시간을 기준으로 00:00
세팅이 되어야 하는데 540:00
인 KST와 UTC의 9시간 시차가 난 채로 시작이 되었다.
그리하여, EC2의 Timezone을 변경시켜 주었다.
## 기존 UTC 0 으로 설정되어있는 localtime 삭제
sudo rm /etc/localtime
## Asia/Seoul (KST) Timezone 세팅 파일을 기존 localtime 파일을
## 대체하는 심볼릭 링크로 생성
sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
이렇게 EC2 서버의 Timezone을 KST로 바꾸고, 배포 환경에 시간 체크 확인용으로 new Date()를 Console로 출력하게 했고, 출력 결과를 확인 했을 때, 시간이 제대로 출력됨을 확인할 수 있었다.
리눅스에서 $ date
를 찍으면 UTC 0이 아닌 KST로 잘 나오는 것을 확인하였고, 앞서 Frontend 단에서도 Console을 출력했을 때, 잘 나왔었다.
그럼에도 불구하고 배포 환경에선 시간이 계속 9시간씩 엇나가는 문제가 발생하였다.
팀원들과 무엇이 문제일까 고민하며 검색해본 결과, 비슷한 문제를 경험하여 해결 방법을 작성한 블로그가 있어 참고하였다.
자동 배포 환경이 구축되었다면
배포스크립트에서 nohup java -jar 실행시에
-Duser.timezone=Asia/Seoul
를 추가해주기만 하면 된다.
하지만 자동 배포 환경이 구축되지 않았다면
Spring Boot의 Bean 생명 주기를 활용하여 시간 설정을 해주어야한다.
@PostConstruct
라는 Bean이 완전히 초기화 된 후, 단 한번만 호출되는 어노테이션을 이용한다.
예를 들어 @SpringBootApplication
어노테이션이 적용된 Class에서
@PostConstruct
public void changeTimeKST() {
TimeZone.setDefault(Timezone.getTimeZone("Asia/Seoul"));
// System.out.println("현재시각 : " + new Date());
}
식으로 활용하면 된다.
예 잘 봤습니다.