시간에 의존적인 로직을 처리할 때 일관성과 테스트 가능성(Testability)을 보장하기 위해 핵심적으로 사용됩니다. 단순히 Instant.now()나 LocalDateTime.now()를 사용하는 것보다 강력한 장점이 있습니다.
서버가 전 세계 어디에 있든 항상 UTC 기준으로 만료 시간을 계산합니다.
A. 글로벌 서비스의 시간 표준화 (UTC 고정)
- 서버가 여러 지역(KST, PST, UTC 등)에 분산되어 있거나, 사용자가 전 세계에 있을 때 서버의 로컬 시간(systemDefaultZone)을 사용하면 시간대(Time Zone) 혼선이 발생합니다.
- Clock.systemUTC()는 어떤 서버 환경에서 실행되든 항상 UTC 기준으로 시간을 반환하여 데이터 일관성을 유지합니다.
B. 테스트 가능성 향상 (Mocking/Stubbing)
- LocalDateTime.now()를 코드에 직접 기술하면, 테스트 시점에 따라 결과가 달라져서(테스트 불확실성) 단위 테스트가 어렵습니다.
- Clock 객체를 빈(Bean)으로 주입받아 사용하면, 운영 환경에서는 Clock.systemUTC()를, 테스트 환경에서는 Clock.fixed()를 사용하여 특정 시점으로 시간을 고정하여 테스트할 수 있습니다.
C. 스레드 안전성 및 불변성
- Clock.systemUTC()가 반환하는 Clock 인스턴스는 불변(Immutable)이며 스레드 안전(Thread-safe)합니다. 고성능 멀티스레드 환경에서도 안전하게 시간 정보를 가져올 수 있습니다.