현재 Voca-World라고 하는 언어 학습 웹 서비스를 운영중이다. 최근에 AWS와 Docker를 이용하여 서버를 배포했는데 저장한 영어 단어가 조회되지 않는 현상이 발생했다. 이 문제를 해결한 과정을 기록하려고 한다.
🔍 문제 해결 과정
문제의 원인을 살펴보기 위해 서버의 로그 파일을 확인해 보았다. 단어 저장시 문제가 생겼을 수 있기 때문에 단어 저장 -> 단어 조회 순서로 로그를 확인해봤다.
저장한 시간보다 9시간 늦은 시간으로 표기되었지만 타임존이 다른걸 생각해보면 문제는 없어보였다. 하지만 로그를 편하게 보기 위해 로그의 시간 기록도 한국 시간으로 바꿔주었다.
[logback-variables.properties]
LOG_PATTERN=[%-5level] %d{yyyy-MM-dd HH:mm:ss, ${logback.timezone:-Asia/Seoul}} [%thread] [%logger{0}:%line] - %msg%n
[logback-spring-prod.xml]
Logback 설정 이후 다시 로그를 확인해보았다.
이번엔 로그 기록 시간과 TIMESTAMP 기록 시간이 다르게 나왔다. 파라미터 첫 번째는 craeted_at이라는 컬럼으로 JPA Auditing 기능을 이용해 자동 삽입되는 컬럼이다.
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdAt;
}
이 로그를 보고 스프링의 Timezone 설정도 필요한가라는 생각이 들었고 검색해보았다.
스프링 타임존 Default값은 실행중인 컴퓨터의 시스템 타임존 설정과 맞춰진다. 여긴 한국이니까 Asia/Seoul로 설정된다.
하지만 배포 서버의 경우 UTC+9로 설정되어 있다.
이를 해결하기 위해 스프링 프로젝트에 타임존 설정을 해주었다.
@SpringBootApplication
public class VocaBeApplication {
public static void main(String[] args) {
SpringApplication.run(VocaBeApplication.class, args);
}
@PostConstruct
void started(){
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul"));
}
}
이것으로 타임존으로 인한 데이터 조회 문제를 해결할 수 있었다.
여기까지 디버깅하면서 서로 다른 타임존을 가진 유저에게 데이터를 전달할 때는 어떻게 해야하는가에 대한 의문이 들었다. 이 부분은 다음 포스팅에서 이어서 작성하도록 하겠다.