99클럽 6일차 TIL: Unix Time (nanoseconds)

2024. 4. 9. 19:1799클럽/TIL

728x90
반응형

#1. 오늘의 학습 키워드

자바스프링에서의 unix 시간을 나노초 단위로 구하고 싶을 때:

  • 이전글인 Loki 에 로깅 정보를 API POST request 로 보낼 때 로그 라인에 앞 부분은 nanoseconds( 나노초 ) 단위로 찍힌 timestamp이다.
    • 이 timestamp 를 보낼 때 자바 스프링에서 제공하는 나노초 단위의 현재 시각을 반환하는 메서드가 있다.
      • System.nanoTime()
    • 그런데 이로는 loki 에서 400 에러를 리턴하였다.
    • 그래서 밀리초 단위의 현재 시각을 반환하는 메서드를 통해 나노초로 변환하여 log를 보냈더니, 오류가 나질 않았다.
      • System.currentTimeMillis()
    • 이 두 메서드를 통한 값을 디버깅 툴을 사용해 비교해보니 숫자의 자리수가 큰 차이가 없었다.
      • 1 밀리초 = 1,000,000 나노초
      • 이기에, 원래 의도대로면 백만 자리수 차이가 났어야했다.
    • 이 두 메서드는 단순히 단위의 차이 뿐만 아니라, 값자체에서 차이가 있었던 것이다.
  • System.nanoTime() 디버깅 상 값
String nanosecond = String.valueOf(System.nanoTime());

 

  • System.currentTimeMillis() 디버깅 상 값
String nanosecond = String.valueOf(System.currentTimeMillis());

 

  • Loki API 호출 시 timeStamp 이슈로 400 에러가 리턴되는 모습

#2. 공부한 내용

  • Unix Time
    • Unix 시간은 1970년 1월 1일 00:00:00 UTC 부터 현재까지 센 밀리초 단위의 시간이다.
  • System.currentTimeMillis()
    • unix 시간을 반환한다.
    • 즉 1970년 1월 1일 00:00:00 UTC 부터 현재 시각까지 흘러간 밀리초 단위의 시간을 반환한다.
  • System.nanoTime()
    • 마찬 가지로 현재 시간을 반환하고, 나노초 단위의 시간을 반환한다.
    • 그러나 위 메서드랑 시작점이 다르다.
    • 해당 메서드는 시간을 세는 시작점이 시스템의 시작시점이다.
      • 이 값은 프로그램이 실행되는 시스템의 하드웨어 타이머에 기반하기 때문이다.
  • Loki 에서 요구하는 것은 나노초 단위의 Unix Time이다.
    • 그렇기에 System.currentTimeMillis() 메서드의 결과 값을 나노초 단위로 아래와 같이 변환하면 된다.
String nanosecond = String.valueOf(Duration.ofMillis(System.currentTimeMillis()).toNanos());

#3. 오늘의 회고

  • 위 두 메서드를 사용해보면서, 같은 시간의 개념을 내포하고 있는 클래스 또는 메서드여도, 표현 방식에 따라서 그 의미는 정말 많이 달라질 수 있다라는 것을 다시 한 번 깨달았다.
    • 자바가 자체적으로 제공하는 시간 관련 클래스도 정말 많다.
      • Date
      • Calendar
      • java.time.Duration
        • 위에서 Unix Time 을 나노초 단위로 변환할 때 쓰였다.
      • 등등..
  • 위 메서드로 국한해서 설명하자면
    • System.currentTimeMillis() 은 전통적인 Unix 시간의 개념을 따르고, 시간의 절대적인 흐름을 나타내는 반면
    • Sysmte.nanoTime() 은 상대적인 시간을 측정하며, 더 낮은 단위의 시간을 나타내는 만큼, 성능 분석 등에 요긴하게 쓰일 수 있겠다.
  • 자바에서 제공하는 라이브러리에서 어떤 메서드들이 있고, 각 메서드들이 어떤 역할을 수행하는 지 전부 외울 수는 없겠지만, 이 차이를 빨리 파악하고, 각 메서드들을 적절한 상황에 적절히 활용하는 능력을 키우는 것이 프로그래밍 스킬 향상에 큰 도움이 될 거라 생각한다.
728x90
반응형