문제상황
로컬 환경에서는 현재 시간대로 DB에 잘 저장이 돼다가, dev 서버에 배포 시 LocalDateTime.now() 가 현재 시각과 9시간 차이가 나는 현상이 발생함
AWS region 을 ap-northeast-2 로 설정하였기에, 거기서도 똑같이 동작할 것이라고 생각했음
왜 다르게 동작할까?
소스코드를 보자.
public static LocalDateTime now() {
return now(Clock.systemDefaultZone());
}
public static LocalDateTime now(Clock clock) {
Objects.requireNonNull(clock, "clock");
final Instant now = clock.instant(); // called once
ZoneOffset offset = clock.getZone().getRules().getOffset(now);
return ofEpochSecond(now.getEpochSecond(), now.getNano(), offset);
}
LocalDateTime.now() 는 systemDefaultZone 이라는 것을 사용하는데, 해당 시스템의 설정을 따르는 것으로 보임
내가 사용하는 Amazon Linux 2 AMI 는 환경설정을 모르기때문에 거기서 차이가 발생할 것이라고 생각함
확인해보니 Amazon Linux 는 UTC 를 기본적으로 사용, 따라서 UTC+9 인 서울과는 9시간의 차이가 발생하게 된 것
해결 방법
타임존을 서울로 설정
@SpringBootApplication
public class InforumApplication {
@PostConstruct
public void started() {
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul"));
}
public static void main(String[] args) {
SpringApplication.run(InforumApplication.class, args);
}
}
SprinBootApplication을 실행하기 전, @PostConstruct 을 사용해 default time zone을 설정함
Timezone 에 설정된 defaultTimeZone 은 ZoneId 에서 default 로 사용하고, ZoneId의 default 는 Clock에서 사용하며, Clock의 default를 LocalDateTime에서 사용하게되어 정상적으로 동작하는 것을 이해할 수 있음