프로그래밍-학습기록

현재 시각은 기기마다 미묘하게 다르다

leesche 2024. 2. 4. 15:59

우리는 모두 똑같은 시간 속에서 살고 있…지 않나?

시간은 우리 모두에게 동일하게 흐르는 것처럼 보입니다. 우리 모두 같이 늙어가잖아요?! (그렇지 않을 수도 있겠죠…) 하지만 기술의 세계에서, 특히 데이터를 다루는 작업에서 시간은 예상치 못한 복잡성을 드러냅니다. 이 글에서는 웹프론트엔드 개발자로서 광고 및 전환 추적 데이터 수집 작업을 하면서 겪은 시간 관련 문제와 그 해결 과정을 공유하고자 합니다.

사례

문제의 시작

플랫폼 회사의 웹프론트엔드 개발자로서, 저의 주요 업무 중 하나는 사용자가 우리 플랫폼의 특정 페이지에 진입하거나 UI의 특정 부분을 충분히 오래 인지했을 경우 이를 임프레션 이벤트로 기록하는 것이었습니다. 이 데이터는 사용자가 언제 해당 페이지나 UI를 인지했는지에 대한 시간 정보를 포함하여 서버로 전송되었습니다.

모든 것이 순조롭게 진행되는 듯했습니다. 그러나 어느 순간부터, 특정 기기에서만 발생하는 이상한 에러가 우리의 서버 로그를 채우기 시작했습니다. 이 에러의 원인은 바로 시간에 관련된 것이었습니다. 클라이언트에서 데이터를 만든 시점이 서버에서 해당 데이터를 처리하는 시간 보다 미래였습니다. 즉, 서버는 미래에서 온 데이터를 저장할 수 없다는 에러를 내뱉은 것이었죠.

시간의 상대성(?) 발견

처음에는 이 문제가 일관되게 발생하지 않는 이유에 대해 궁금했습니다. 만약 시간 차이가 문제라면, 모든 기기와 상황에서 일관되게 문제가 발생해야만 했습니다. 하지만 실제로는 특정 기기에서만 문제가 발생했습니다. 이는 기기마다 시간을 다르게 측정하고 있다는 사실을 발견하게 되는 계기가 되었죠. 아, 나는 왜 모든 기기의 시간이 같다고 생각했는지 원! 예를 들어 스마트폰과 랩탑은 아래 방식으로 시간을 측정하고 있었습니다.

대부분의 전자 기기는 내부적으로 실시간 클록(Real-Time Clock, RTC)을 사용하여 시간을 측정하고, 이는 보통 석영 발진기를 사용하여 매우 정확한 시간을 유지합니다. 하지만, 이 시계는 기기가 꺼져 있을 때도 시간을 추적하기 위해 설계되었고, 매우 소량의 전력을 사용합니다. 또한, 스마트폰과 랩탑 같은 인터넷에 연결된 기기는 네트워크 시간 프로토콜(Network Time Protocol, NTP)을 사용하여 시간을 정기적으로 동기화합니다. 이러한 동기화는 기기의 시간을 전 세계의 다른 시계와 몇 밀리초 이내의 정확도로 맞추기 위해 수행됩니다. 그러나 모든 기기가 동일한 빈도로 NTP 서버에 접속하거나, 내부 클록의 정확도가 같지 않기 때문에, 시간에 미묘한 차이가 발생할 수 있습니다.

해결 방안

이 문제를 해결하기 위해, 우리 팀은 이벤트 수집 시간 검증에 일정 수준의 Buffer를 설정했습니다. 서버 시간 보다 미래에 만들어진 이벤트도 허용하도록요. 기기 간의 시간 차이를 일정 부분 용인한 것이죠. 이는 시간의 상대성을 기술적으로 관리하는 방법을 개발한 것이었습니다. 참 쉽죠?! 언제든 일어날 수 있었던, 마주쳐야 했던 문제였습니다.

결론

시간은 기술적 문제를 해결하는 과정에서 예상치 못한 복잡성을 드러낼 수 있습니다. 우리의 경험은 기기 간의 시간 차이가 데이터 처리에 어떠한 영향을 미칠 수 있는지를 보여주었고, 이를 해결하기 위한 간단하지만 일종의 창의적인 접근 방식을 필요로 했습니다. 이 사례는 기술적 문제에 직면했을 때 유연하게 생각하고 해결책을 찾는 중요성을 강조합니다.