Projects/청하-청년을 위한 커뮤니티 서비스
[청하] 13. Spring Boot 서버 배포 시 타임존 문제 해결 (feat. @PostConstruct)
Lpromotion
2024. 10. 9. 20:07
로컬 환경에서 게시글 등록 API와 게시글 리스트 조회 API를 테스트했을 때는 문제가 없다고 생각해서 서버에 올렸다.
하지만 서버에 배포한 후, 안드로이드 팀원 분이 게시글을 등록하고 조회했을 때 현재 시간과 약 9시간의 차이가 나는 이슈가 발생했다.
1. 원인
- Spring Boot에서 별도의 설정이 없으면 시스템 타임존이 Default 값으로 설정된다.
- 로컬 환경에서는 내 컴퓨터의 타임존 환경에 따라 한국 시간이 사용되어 문제가 없었고, 서버 환경에는 다른 타임존이 설정되어 있어서 시간 차이가 발생했다.
- 현재 도커를 사용해 배포하고 있기 때문에 도커 컨테이너의 기본 타임존(UTC)이 적용되었다.
이 문제 해결을 위해 Spring Boot에서 타임존을 설정하기로 했다.
2. Spring Boot Application Timezone 설정
@SpringBootApplication
@EnableScheduling
public class WithpeaceServerApplication {
public static void main(String[] args) {
SpringApplication.run(WithpeaceServerApplication.class, args);
}
@PostConstruct
public void init(){
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul"));
}
}
SpringBootApplication에 `@PostConstruct` 를 이용해서 타임존을 설정한다.
`TimeZone.setDefault()` 메서드는 JVM의 기본 타임존을 설정한다. "Asia/Seoul" 타임존으로 설정해 한국 시간을 기준으로 동작하도록 설정했다.
@PostConstruct
`@PostConstruct` 어노테이션은 Java에서 객체가 생성되고 의존성 주입이 완료된 후 초기화 작업을 수행하기 위해 사용된다.
주로 Spring 프레임워크에서 빈(Bean)이 초기화될 때 실행할 메서드를 지정하는 데 사용된다.
주요 특징
- 빈 초기화 후 실행된다. 해당 메서드는 빈의 생성자 호출 및 모든 의존성 주입이 완료된 직후에 실행된다.
- 메서드에만 적용 가능하고, 해당 메서드는 매개변수를 가지지 않아야 하며 void 타입이어야 한다.
- 각 빈에 대해 한 번만 실행된다. (빈의 라이프사이클 동안)
Spring Bean 의 생명주기
스프링 컨테이너 생성 → 스프링 빈 생성 → 의존성 주입 → 초기화 콜백 → 사용 → 소멸 전 콜백 → 소멸
“초기화 콜백” 단계에서 `@PostConstruct` 어노테이션이 붙은 메서드가 호출된다.
타임존 설정은 애플리케이션 시작 시 한 번만 필요하기 때문에, `@PostConstruct` 를 사용해 Spring Bean 생명주기에서 한 번만 실행되도록 했다.
REF
https://umanking.github.io/2021/08/10/spring-boot-server-timezone/
https://isntyet.github.io/java/Spring-boot-Timezone-설정하기/
https://velog.io/@leesomyoung/SpringBoot-타임존-설정하기
반응형