반응형

이번에 진행하는 프로젝트에서는 학생들의 과제 제출시간을 한국시간으로 저장하고 체크하기 위해, 아래와 같은 테스트코드를 사용했었다.

 

    @Test
    fun testValidTime(){
        val koreaTime = LocalDateTime.now(ZoneId.of("Asia/Seoul"))
        val curTime = LocalDateTime.now()

        assertTrue(koreaTime.minusMinutes(5).isBefore(curTime))
        assertTrue(koreaTime.plusMinutes(5).isAfter(curTime))
    }

 

이렇게 Asia/Seoul의 시간과 현재 스프링부트의 시간을 가져온 후 앞뒤로 5분 차이가 나지 않는지 확인하는 것이다.

(만약 시간이 다르다면 무조건 1시간 이상 차이가 날 테니까)

 

당연히 로컬에서는 에러가 없었지만, DEV 서버에 올려 테스트를 해보니 통과하지 못하는 문제가 발생했다.

 

당연히 시간이 안 맞는 것일거고

 

로그를 찍어서 확인해보니

 

 

이렇게 스프링부트의 시간이 UTC로 설정이 되어 있었다.

 

처음에는 당연히 스프링부트가 우분투의 시간을 따른다고 생각하고 우분투의 시간을 한국시간으로 맞춰주었다.

 

sudo timedatectl set-timezone Asia/Seoul

timedatectl

 

이렇게 timedatectl로 한국시간이 나오는 것 까지 확인을 하고

 

테스트를 다시 해봤지만, 다시 에러가 발생했다.

 

찾아보니 스프링부트는 로컬이 아니면, UTC의 시간을 가져온다고 한다.

 

따라서 스프링부트 자체에 시간을 설정하는 코드를 추가해주거나, java를 실행할 때 시간을 환경변수로 설정해야 한다고 한다.

 

나는 이 중에서 시간을 설정해주는 코드를 추가했다.

 

@Configuration
class TimeConfig {

    @PostConstruct
    fun setTimeZone(){
        TimeZone.setDefault(TimeZone.getTimeZone("Asia/Seoul"))
    }
}

 

이렇게 TimeConfig를 추가해줬고, 시간은 Bean을 초기화하기 전에 설정해줘야 하기에 PostConstruct annotation을 사용했다.

 

이렇게 설정하고 테스트를 다시 해보니, 모두 성공했다.

+ Recent posts