안녕하세요. 요번에 MiliSeconds to Seconds 처리하다 생긴 실수를 오답노트 삼아 글을 적어보려 합니다.
데이터의 time중에 Milliseconds형태로 들어오는 값이 있었습니다.
들어온 데이터를 들어온 데이터의 time값과 현재 시간을 비교하여 현재보다 과거인 경우 pass시키고, 현재보다 미래인 경우 처리합니다.
이게 무슨 말이냐면 현재 시간은 지금은 12시 24분 13초라고 가정했을 때 초 단위를 00초로 변경한 값을 말합니다.
즉 현재가 12시 24분 24초 일 때, 12시 24분 00초(현재시간)인 타임스탬프 값과 보다 미래인 값인 12시 24분 01초, 12시 24분 10초로 비교하는 것이죠.
00초로로 변경한 현재 시간 값은 seconds단위로 떨어지는 timestamp였고, 들어온 데이터는 Milliseconds단위였기 때문에 Seconds단위로 변경시켜주어야 했습니다.
그래서 저는 JS에서 썼던 방법으로 sudo 코드를 쓰면 이렇습니다.
long time = 0;
// 현재 들어온 데이터가 milseconds 단위일 때 second로 바꾸기.
long milsecond = 1000000000000L;
if (들어온 데이터 timestamp값 > milsecond) {
time = Math.round(들어온 데이터 timestamp 값 / 1000);
}
else {
time = 들어온 데이터 timestamp값;
}
저런식으로 Math.round(timestamp / 1000)을 해주었습니다.
그런데 여기서 문제가 생겨버립니다. 들어온 데이터의 초 단위가 고정이 되어버리는 것이였습니다.
그러니까
12시 24분 01초 ~ 12시 24분 59초에 들어온 데이터가 12시 24분 20초로 고정된 타임스탬프 값이 들어오게 된 것이죠.
분명 이 작업을 하기 전에는 초 단위로 데이터가 들어왔었다는 것을 뒤늦게 기억나서 혹시나 싶어 12시 50분 06초의 Milliseconds값과 12시 50분 07초의 Milliseconds값을 브라우저 콘솔창에 테스트를 해보니
같은 값이 나오는 것을 확인하였습니다. 그러니까 round로 반올림 처리를 해주다 보니 값이 고정 되어 있던 것이죠.
그래서 그 전에 버그가 생기지 않았던 것은 운이 좋게 반올림 한 값이 다음 초를 가리킬 땐 정상적으로 동작하는 것처럼 보였던 것이였구요.
이걸 알고 난 뒤 Java에선 어떻게 처리하는 지 다시 살펴보게 되었습니다.
검색하여 알게 된 사실은 Java에서 long타입은 소수점 자리가 있을 때 자동으로 소수점 뒤의 자리를 빼준다는 사실이였습니다.
그래서 아래와 같이 Math.round함수를 사용하지 않고 그냥 나누어 처리하였습니다.
long time = 0;
// 현재 들어온 데이터가 milseconds 단위일 때 second로 바꾸기.
long milsecond = 1000000000000L;
if (들어온 데이터 timestamp값 > milsecond) {
time = (들어온 데이터 timestamp 값 / 1000);
}
else {
time = 들어온 데이터 timestamp값;
}
이 글을 읽는 분들도 저와 같은 실수를 하지 않길 바라며 글을 마칩니다.
'프로그래밍(Web) > 업무관련' 카테고리의 다른 글
[바미] linux서버 용량 관리하기. (0) | 2023.04.07 |
---|---|
[바미] ON DUPLICATE KEY UPDATE문을 주의해서 사용하자. (0) | 2023.02.03 |
[바미] Java 스케줄러 삽질기. (0) | 2022.12.15 |
[바미] Java ConcurrentModificationException 에러 (0) | 2022.11.18 |
[바미] TypeORM 타임존 이슈 (0) | 2022.11.03 |