만족

[사이퍼즈 서포터] 전적검색 버그 픽스 본문

[사이퍼즈 서포터] 전적검색 버그 픽스

Project/사이퍼즈 서포터 Satisfaction 2020. 4. 24. 19:46

플레이어의 플레이 정보를 얻어오는 API(/cy/players/{MATCH_ID}/matches)에서 간혹 400 에러가 발생하는 오류가 꽤 오랬동안 있었습니다.

 

테스트 환경에서는 재현이 불가능해 꽤 오랫동안 방치되었던 원인인데,

해결을 위해 로그를 수집하니, 20일만에 1000개의 오류 로그가 찍혔습니다.

 

몇몇분들께만 발생하는 줄 알았으나, 꽤 많은 분들께서 해당 오류로 이용에 불편을 겪고 있었네요...

 

그런데 원인은 의외로 간단했습니다.

 

createDate는 로그가 찍힌 시간(서버 시간 기준)이고, description에는 요청 url 정보가 기록되어 있습니다.

 

createDate를 보면 거의 00초 부근(분 단위가 바뀌기 직전 혹은 직후)이고

description의 endDate쿼리에는 전부 분 단위가 바뀐 후의 값이 들어가 있습니다.

(가령 createDate가 16:00:59이면 endDate에는 16:01으로 설정됨)

 

createDate는 서버가 요청을 완전히 받아들이고 난 후의 시간이 기록되므로 (실제 디바이스에서 요청을 한 후 몇 초가 지나서 기록됨)

이 오류의 원인은 '사용자 디바이스의 시간이 몇 초 정도 빠르게 설정되어 있을 때, 미래의 시간을 기준으로 검색하려 해서 잘못된 요청으로 취급됨'으로 볼 수 있습니다.

 

실제 시간은 3시 59분인데, 서버에 "4시 00분까지의 게임 결과를 가져오라"를 요청하니,

OPEN API에서 잘못된 매개변수 오류로 400코드를 리턴하는 것이죠.

 

실제로 앱 코드에서도 디바이스의 시간을 가져와서 쓰니, 디바이스 시계가 안 맞는다면 문제가 발생할 수 있겠죠.

(물론 시간이 느리게 설정되어 있다면, 단지 전적이 덜 보일 뿐 요청 자체가 실패하지는 않습니다)

 

단순히 땜빵? 느낌으로 해결하려 한다면

현재 시간에서 -1~2분정도 빼 준 다음 endDate에 적용하는 방법도 있을 수 있겠으나,

비교적 시간이 많이 어긋나 있는 디바이스의 경우에는 먹히지 않습니다.

 

이를 보완하겠다고 뺴는 양을 크게 하면 오히려 정상적으로 시계가 도는 유저들이 불편할 수 있겠죠.

 

조금 번거롭지만 서버에 API를 하나 만들어서

현재 시간을 불러오게끔 하겠습니다.

 

네이버시계와 비교해보니 서버가 1초정도 느리군요.

(위에서 말씀드렸듯이, 느린건 문제되지 않습니다. 게다가 그 간격도 매우 좁기 때문에 더더욱...)

 

간단하게 엔드포인트 하나 파주고

 

앱에서 해당 엔드포인트를 호출하고, 예외가 발생할 경우 종류에 관계없이 디바이스 시간을 쓰도록 합니다.

이렇게 하면 디바이스 시간이 아닌 서버에서 받아온 시간을 우선적으로 고려하게 됩니다.

 

거의 일년 반 가까이 된 문제였는데, 기록된 로그를 보고 해결에는 한시간도 안걸리는 걸 보니

로깅이 참 중요한 습관이란걸 깨닫습니다.



Comments