[SpringBoot] 타임존 설정하기

smlee·2023년 3월 7일
0

SpringBoot - JPA

목록 보기
5/8
post-thumbnail

1. 문제 상황

외주 작업이 끝나고 작업물에 대한 QC를 진행하던 도중 다음과 같은 기능 오류 보고를 받았다.

사용자의 마이페이지에서 최근 접속 시간을 보여주어야 하는데, 마이페이지 API에서 최근 접속시간이 영국 표준시로 보내주어 예상 값보다 9시간 빠른 시간대가 앱 화면에 보여지게 된 것이다.

로컬 환경에서 테스트를 할 때는 한국 시간 대로 제대로 왔었는데 막상 EC2 테스트 서버에 배포를 하니 영국 시간대로 접속 시간이 노출되는 문제가 생겨 EC2 타임존을 변경하였지만, 여전히 테스트 서버에서는 영국 시간대로 접속 시간을 노출되었다.

2. 해결

@SpringBootApplication 어노테이션이 붙은 애플리케이션 클래스 내부에 @PostConstruct 어노테이션을 붙인 초기화 콜백 메서드를 만들어 스프링부트 프로젝트의 타임존을 설정해놓았다.

@PostConstruct
void started(){
    TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul"));
}

@PostConstruct

스프링 빈은 다음과 같은 생명 주기를 갖는다.

스프링 빈의 생명 주기
스프링 컨테이너 생성스프링 빈 생성의존성 주입초기화 콜백사용소멸 전 콜백소멸

이러한 스프링 빈의 생명 주기에서 의존성 주입이 이루어진 후 초기화를 수행하기 위해 @PostConstruct로 초기화를 실행한다. 이 메서드는 다른 리소스에서 호출되지 않는다고 해도 호출이 되는 메서드이다. (여기서는 중요하지 않지만, 소멸 전 콜백에서는 @PreDestroy 어노테이션을 사용한다.)

또한, @PostConstruct는 WAS가 뜰 때 bean 생성 후 딱 한 번만 실행된다. 따라서 기본 사용자라든가, 딱 한 번만 등록하면 되는 key 값들을 @PostConstruct로 등록하여 사용하는 편이다.

따라서 현재 애플리케이션에서 타임존 설정은 딱 한 번만 하면 되는것이므로 스프링 빈 라이프사이클에서 딱 한 번만 실행되는 @PostConstruct를 사용하여 타임존을 설정하였던 것이다.

0개의 댓글