@JsonFormat 과 TimeZone 설정

0_0_yoon·2024년 2월 13일
0

문제상황: DB 에 저장된 시간대가 UTC 기준으로 저장되고 조회됨.

해결방법: application.yml 파일에 spring.jpa.properties.hibernate.jdbc.time_zone = Asia/Seoul 설정하면 된다.

  • 역할: 데이터베이스에 날짜와 시간을 저장하거나 조회할 때 해당 시간대를 기준으로 적용된다.

또 다른 문제상황 : 서버를 클라우드 환경에 배포한뒤 시간을 조회할 경우 UTC 기준으로 조회됨

원인: JPA 가 DB 에서 조회해온 시간값을 LocalDateTime 으로 변환시키는 과정에서 LocalDateTime 의 기준 시간이 UTC 로 설정되어 있었기 때문이다.

해결방법: 도커 파일에 해당 명령어를 `-Duser.timezone=Asia/Seoul` 추가함

해결과정:

문제 상황시 BaseEntity의 코드

@MappedSuperclass
@EntityListeners(AuditingEntityListener::class)
abstract class BaseEntity {
    @CreatedDate
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
    lateinit var createdAt: LocalDateTime

    @LastModifiedDate
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
    lateinit var modifiedAt: LocalDateTime
}

@JsonFormat 의 인자로 timezone = "Asia/Seoul" 설정을 해줬기 때문에 정상 동작을 예상했지만

@JsonFormat 의 경우 MessageConverter 에 의해 직렬화 및 역직렬화가 될 때 (Jackson 라이브러리가 사용될때) 사용되는 어노테이션이다. 즉 서버와 데이터베이스 사이에서 데이터를 주고 받을때는 사용되지 않는다.

때문에 다른 방법을 찾았다.

  1. JVM 환경에 종속적인 LocalDateTime 대신 ZonedDateTime 사용하기
    1. JPA 는 LocalDateTime 과는 다르게 ZonedDateTime 의 직렬화 및 역직렬화 지원을 하지 않기 때문에 직접 AttributeConverter 를 구현해야 한다.
  2. jar 실행시 JVM의 시간대 설정 옵션 커맨드 추가(-Duser.timezone=Asia/Seoul)

간편한 2 번 방법을 선택.

profile
꾸준하게 쌓아가자

0개의 댓글