- 문제상황
최근 프로젝트를 진행하던 중, 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
'★ 프로젝트 + 트러블 슈팅 ★' 카테고리의 다른 글
쿼리 실행계획 (Query Plan)이란? (2) | 2023.12.06 |
---|---|
토이 프로젝트 시작 (23.09.10) (0) | 2023.09.10 |
[Route 53 + ALB활용] http 프로토콜 사용으로 인한 HTML5 Geolocation API 제한 트러블 슈팅 (만남의 광장) (0) | 2023.03.01 |
[Reverse Geocoing] RestTemplate 활용 네이버 API 사용법 (만남의 광장) (0) | 2023.02.15 |
WAS 최대 쓰레드의 의미 (2) | 2022.12.16 |
댓글