ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • # DB time zone 다루기
    개발메모 2025. 4. 1. 12:16

    회사에서 생성한 postgresql의 timestamp timezone이 UTC (국제표준시)로 되어있다.

     

    하지만 사용자는 한국에서 데이터를 등록 및 조회하기 때문에 UTC로 보이게 되면 많은 혼동이 생기게 된다.
    사실 DB 생성 시에 time zone을 바꾸면 되기는 하지만,

    모종의 이유로 할 수 없을 경우를 대비해 UTC -> KST로 변경하는 법을 알아보자.
    (이걸 하게 되면 다른 시간대도 OK)

     

    우선 JVM 전역에서 동작할 TimeZone을 다루는 컴포넌트를 만들자.

    import jakarta.annotation.PostConstruct
    import org.springframework.stereotype.Component
    import java.util.TimeZone
    
    @Component
    class TimeZoneConfig {
    
        @PostConstruct
        fun init() {
            TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul"))
        }
    }

     

    TimeZone의 Id 문자열은 필요한 값으로 세팅해도 무관하다.

     

    그리고 application.yml (또는 properties) 파일에 아래 항목 추가

    spring:
      jpa:
        properties:
          hibernate:
            jdbc:
              time_zone: UTC

     

    hibernate jdbc의 시간대를 명확히 지정해줘야 위에 적용한 TimeZoneConfig 컴포넌트의 시간대 설정이 문제없이 적용될 수 있다.
    일반적인 JPA Repository에서는 굳이 하지 않아도 문제 없을 수 있으나, QueryDSL에서 DTO에 Projections로 객체 매핑을 하는 경우에는 전역 변수 적용이 무시되는 경우가 간간히 있다고 한다.

    무튼, 이번에는 위의 코드로 클라우드 환경에서도 문제 없이 UTC로 저장된 시간대를 KST로 변경해서 사용하고 있다.

     

Designed by Tistory.