1. 문제
비드마켓 서비스에는 시간에 종속적인 로직이 존재한다.
- 기간에 따른 낙찰 종료 로직
- 현재시간과
Product
엔티티의expireAt
필드를 비교하여 1분마다 스프링 스케줄러가 함수를 호출한다. Product
엔티티의isProgressed
필드가true
인경우(경매가 진행중인 경우) 필드값을false
로 변경하며 종료 로직을 수행한다.- 낙찰 결과 응답을 반환한다.
비드마켓 어플리케이션의 timezone은 Asia/Seoul이 (KST) 기준이다.
그러나 AWS EC2 ubuntu의 서버시간은 default로 UTC가 설정이 되어있다.
백엔드 서버 시간과 프론트엔드 서버시간의 오차로 기능이 정상적으로 수행되지 않는 문제가 있었다.
2. 시도한 방법
1. EC2 서버 시간 변경 (실패)
루트 계정으로 ec2 접속 후 아래의 명령어들로 서버 시간을 변경했다.
$ date $ sudo date $ sudo cat /etc/localtime $ sudo rm /etc/localtime $ sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime $ date $ sudo date 출처: https://ora-sysdba.tistory.com/entry/Cloud-Computing-Amazon-EC2-인스턴스의-TIMEZONE-변경 [Welcome To Ora-SYSDBA:티스토리]
date
명령어 실행 후 
서버 시간은 정상적으로 변경 되었다.
그러나
어플리케이션을 실행하면 여전히 UTC TimeZone으로 설정되어 있어서 문제 해결에 실패했다.
2. AWS RDS Time zone 변경(실패)
AWS RDS timezone을 Asia/Seoul로 변경해봤다. 구체적인 방법은 아래 참고 링크에 있다.
하지만 마찬가지로 어플리케이션 실행시 UTC timezone으로 실행돼서 문제 해결에 실패했다.
3. Bean 생명주기를 이용한 TimeZone 자동설정 (실패)
public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } @PostConstruct public void started(){ TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul")); } }
application.java 파일에 스프링 부트 실행시 TimeZone을 “Asia/Seoul”로 설정하도록 코드를 추가해봤다.
해결되지 않았다.
4. jar파일 실행시 옵션 추가 (성공)
서버에서 비드마켓 어플리케이션 jar 파일을 실행할때 명령어에
-Duser.timezone=Asia/Seoul
옵션을 추가해주는 방법이다. 이 방법은 매번 서버에 배포시 실행할때 추가해주는 번거로움이 있지만 우리팀은 Githup Action을 이용한 배포 자동화로 쉘 스크립트 파일에 jar실행 명령어 + 해당 옵션을 추가해서 문제를 해결했다.sudo nohup java -jar -Duser.timezone=Asia/Seoul -Dspring.profiles.active=local $DEPLOY_JAR --server.port=8080 >> $APPLICATION_LOG_PATH 2> $DEPLOY_ERR_LOG_PATH