wms's Programming&Study

프로젝트 어플리케이션 전체 서버 시간 UTC-> KOR로 설정하기 본문

Programming/JAVA

프로젝트 어플리케이션 전체 서버 시간 UTC-> KOR로 설정하기

wms2275 2022. 12. 24. 18:42

이슈사항

이슈가 되었던 문제를 정리하자면 우리 어플리케이션 서버와 DB는 insert, update, delete 할 경우 time이 UTC로 되어 있다.
근데 우리가 고객사에서 받는 데이터는 한국시간으로 되어 있어서 시간대를 하나의 시간대로 통일 시켜 줘야했다.
고객사에서 받는 데이터는 어플리케이션에서 제어할 수 없는 엑셀이나 CSV 파일에 날짜가 들어가 있어서 통제가 불가능한 상황이었다.

1. 어플리케이션과 DB 서버 시간은 UTC
2. 고객사에서 받는 데이터는 KOR 한국시간
3. 하나의 시간대로 통일 시켜서 관리 필요성 대두

해결방안

1. 고객사에서 받는 데이터를 고객사에 UTC 데이터로 넣어서 전달 요청하여 UTC 시간대로 맞춘다.
2. 어플리케이션에서 데이터 저장시 KOR 시간대로 강제하여 통일시킨다.

과정

처음에는 시간대 설정을 하기에 표준시간대인 UTC로 통일시키는게 맞다고 생각하였다.
그래서 고객사에 UTC 시간대로 요청으로 하려고 했으나
SDK에서 수집하는 클릭이벤트 데이터들도 한국시간대로 들어오고 있는 상황이었다.

엑셀에서 수집하는 데이터, 어플리케이션에서 들어오는 데이터, SDK 수집 데이터를 통합할 때 모두 UTC 시간대로 통일 하려 했으나
그렇게 했을 때 문제는 통계를 생성할 때 이슈가 발생하였다.
통계 생성시 UTC 시간대로 하면 한국시간대랑 9시간이 차이나게 통계가 생성되고
화면에 표출시 원하는 통계가 나오지 않는 이슈가 발생하였다.

실장님께 여쭤보고 같이 이슈를 논의하여 결론은 KOR 한국시간대로 모든 시간을 통일하기로 하였다.

해결

어플리케이션과 DB 서버의 시간대가 UTC로 설정해줘야 해서 dev ops팀에 요청하여 시스템 설정에 박아둘까하다가
그렇게 되면 관리 포인트가 우리팀 뿐만 아니라 다른 팀에도 영향이 있을 것 같아
우리팀 내에서 해결할 수 있는 방법을 찾아보았다.

우선 timezone 설정을 한국시간대로 바꾸려했다

나 말고 다른 개발자가 유지운영을 해야할 때를 고려하여
LocalDateTime.now()를 뜯어보니 해당 메소드가 가져오는 값이 TimeZone getDefault() 메소드를 호출하는 것을 확인하였다.

public static LocalDateTime now() {
    return now(Clock.systemDefaultZone());
}
public static Clock systemDefaultZone() {
    return new SystemClock(ZoneId.systemDefault());
}
public static ZoneId systemDefault() {
    return TimeZone.getDefault().toZoneId();
}

 

그래서 TimeZone.setDefault 메소드를 살펴보았다.

    /**
     * Sets the {@code TimeZone} that is returned by the {@code getDefault}
     * method. {@code zone} is cached. If {@code zone} is null, the cached
     * default {@code TimeZone} is cleared. This method doesn't change the value
     * of the {@code user.timezone} property.
     *
     * @param zone the new default {@code TimeZone}, or null
     * @throws SecurityException if the security manager's {@code checkPermission}
     *                           denies {@code PropertyPermission("user.timezone",
     *                           "write")}
     * @see #getDefault
     * @see PropertyPermission
     */
    public static void setDefault(TimeZone zone)
    {
        @SuppressWarnings("removal")
        SecurityManager sm = System.getSecurityManager();
        if (sm != null) {
            sm.checkPermission(new PropertyPermission
                               ("user.timezone", "write"));
        }
        // by saving a defensive clone and returning a clone in getDefault() too,
        // the defaultTimeZone instance is isolated from user code which makes it
        // effectively immutable. This is important to avoid races when the
        // following is evaluated in ZoneId.systemDefault():
        // TimeZone.getDefault().toZoneId().
        defaultTimeZone = (zone == null) ? null : (TimeZone) zone.clone();
    }

 

해당 메서드가 user.timezone 속성의 값을 변경하지 않고 getDefault 메서드에서 반환되는 TimeZone을 설정한다고 하여
application에 아래 코드를 추가해보았다.

TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul"));


이렇게하니 DB 서버 시간대가 UTC 여도
어플리케이션에서 데이터를 insert, update, delete 할 때 날짜가 한국시간대로 들어가는 것을 확인하였다.



참고 사이트

https://sas-study.tistory.com/391