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-타임존-설정하기
반응형