본문 바로가기
★ 프로젝트 + 트러블 슈팅 ★

Timezone 트러블슈팅 (만남의 광장)

by 리승우 2023. 3. 4.

- 문제상황

최근 프로젝트를 진행하던 중, localhost에서 실행했을 때 작성일자는 KST로 잘 나왔으나

실제 서비스 환경에 배포를 할 시에는 UTC기준의 시간으로 작성일자가 생성되고 있는 상황이 발생하였다.


- 이유

1. AWS를 이용한 배포환경으로 인해, 해당 Server의 Timezone이 반영되어 위 상황이 발생함

(모든 Entity들은 아래 BaseEntity를 상속받고 있음)

public abstract class BaseEntity {
    // Entity가 생성되어 저장될 때 시간이 자동 저장
    @CreatedDate
    @Column(name = "created_at", columnDefinition = "DATETIME(6)", updatable = false, nullable = false)
    private LocalDateTime createdAt;

    // 조회한 Entity 값을 변경할 때 시간이 자동 저장
    @LastModifiedDate
    @Column(name = "modified_at", columnDefinition = "DATETIME(6)", nullable = false)
    private LocalDateTime modifiedAt;
}

- 해결법

1. Ubuntu 서버에 직접 들어가서 시스템 전체의 Timezone을 변경하여 해당 서버에서 실행 중인 모든 애플리케이션의 Timezone 변경

-> Spring Boot 애플리케이션이 이전에 설정된 Timezone에서 벗어나, 새로운 Timezone을 사용

 

적용방법

시스템 시각을 KST기준으로 변경

$sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
$date
Mon Nov 28 19:47:12 KST 2022

2. Spring Boot 애플리케이션 내에서 "@PostConstruct" 어노테이션을 사용하여 해당 애플리케이션의 Timezone만 변경

-> 다른 애플리케이션과는 독립적으로 동작하며, 서버에서 실행 중인 다른 애플리케이션에 영향을 주지않음

 

적용방법

Bean 생명주기를 이용한 Timezone 자동설정 (초기화 콜백메소드 호출)

@SpringBootApplication
@EnableJpaAuditing
public class PlacemeetingApplication {

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

    public static void main(String[] args) {
        SpringApplication.run(PlacemeetingApplication.class, args);
    }
}

Bean이 완전히 초기화된 후, 해당 @PostContstruct가 부여된 메서드를 호출하여 애플리케이션 단에서 Timezone을 설정한다.

 

 

스프링 라이프사이클

스프링부트 실행 -> IOC 컨테이너 생성 -> 빈 객체 생성 -> 의존관계 주입 -> 초기화 콜백메소드 호출 -> 구동상태 -> 소멸 전 콜백메소드 호출 -> 스프링 종료


3. 수동 실행단계에서 Timezone 설정 진행 or 자동배포 환경 script에 Timezone 설정 진행

적용방법

Script단에

sudo java -jar -Duser.timezone=Asia/Seoul ...

입력하여 애플리케이션을 실행시키면 됨.

 

허나 수동으로 실행하는 환경일 시 수시로 기억하고 입력해야하므로 자동배포 환경이 아닐 시에는 그다지 권장하는 방법이 아님

 

 

 

참조링크

https://wildeveloperetrain.tistory.com/220

 

@Scheduled 동작 시 timezone 설정 관련하여 발생한 이슈 정리

spring boot 프로젝트에서 스케줄러 작업을 하던 중 발생한 이슈를 정리한 내용입니다. 이슈는 어플리케이션 기동 시 설정한 'TimeZone이 Scheduler 동작 시 적용되지 않는 것'에서 시작되었으며, 이슈에

wildeveloperetrain.tistory.com

 

댓글