Skip to content

유동적인 데이터의 위험: LocalDateTime.now() 대신 사용할 수 있는 접근법

taehyun edited this page Sep 8, 2024 · 1 revision

도현님의 피드백에서 테스트에서 LocalDateTime.now()을 사용하는 것은 위험하다는 피드백을 보게 되었습니다. 이에 대해서 왜 위험한지, 그리고 어떻게 이를 구성해야하는지에 대해서 간단하게 소개해 드리겠습니다.

LocalDateTime.now()로 인한 유동적인 데이터를 통한 테스트에 대해서 고려해야할 부분

테스트라는 것은 여러 유명 개발자 분들의 말에 의거하면 고정된 데이터를 통해 언제든지 동일한 결과를 만들어 내야합니다. 이는 테스트의 신뢰성과도 큰 연관이 있습니다.

이는 더 명확하게 말하게 되면, 유동적인 데이터는 테스트의 예상치 못한 결과를 나타낼 수도 있습니다. 전혀 이상한게 없는 테스트 코드에서도, 어떨 때는 성공, 어떨 때는 실패하는 경우가 생길 수도 있다는 것 입니다.

간단히 말하면, 시스템의 시간 동기화 문제나 다른 시스템 의존성으로도 전혀 다른 결과가 나올 수 있습니다.

해결책(1) : LocalDateTime.of()를 통한 정적인 날짜를 설정하여 테스트를 진행

이는 생각보다 매우 단순하게 해결할 수 있습니다. now 를 통해서 가지고 오는 것이 아닌, of를 통해서 특정한 날짜에 대한 설정을 해줄 수 있습니다. 이러한 형태로 테스트를 하게되면, 기본 테스트의 의미에 맞게 언제든지 동일한 결과를 내는 테스트코드를 작성할 수 있게 됩니다.

해결책(2) : Clock을 이용한 시간 제어

테스트 환경에서 시간을 고정하거나 제어하는 또 다른 방법은 Clock 클래스를 활용하는 것입니다. Clock을 사용하면 LocalDateTime.now() 대신 Clock으로 시간을 조작할 수 있습니다. 이를 통해 더 유연하고 테스트 가능한 코드를 작성할 수 있습니다.

Clock fixedClock = Clock.fixed(Instant.parse("2023-09-08T12:00:00Z"), ZoneId.of("UTC"));
LocalDateTime now = LocalDateTime.now(fixedClock);

이 방식은 특히, 다양한 시간대를 테스트하거나 특정 시간 흐름을 시뮬레이션하는 경우에 유용합니다.