간단한 curring 으로 시간 측정 함수 작성하기

3 minute read
2024-07-15

시간 측정하는 함수를 큰 생각없이 작성하면 아래와 같이 작성할 수 있다.


function fn() {
  const now = Date.now();
  
  // ...
 
  const end = Date.now();
  const elapsedTime = end - now;
  const elapsedTimeMS = (elapsedTime / 1000).toFixed(3);
  
  console.log('소요 시간 : ', elapsedTimeMS);
}


생각의 흐름대로 작성하면 대게 이렇게 작성해왔다. 이를 curring 기법으로 재작성하면 깔끔한 코드가 될 수 있다.


curring

export const createElapsedTimer = (startTime = Date.now()) => {
  const timer = (endTime = Date.now()): number => endTime - startTime;
  return timer;
};


시작 시간을 지정하고 호출 시점에서 걸린 시간을 계산하는 함수다. 이렇게 되면


사용하는 곳에선 호출한 시점에서 비교하기 좋아진다.


usage case
const handler = () => {
  // ...
  
  const timer = createElapsedTimer()
  if (timer() <= 300) {
    event.preventDefault();
  }
}


또한, 인자로 시간을 주입할 수 있도록 했기 때문에 시작 시간을 임의로 결정할 수 있다.


createElapsedTimer(Date.now() + 3000)
createElapsedTimer(defaultTime)


jsdoc 까지 붙이면 아래와 같이 작성 가능하다. 타입스크립트에서 타입을 담당하고 있기에 jsdoc 에서는 타입 정보는 생략했다.


/**
 * Creates a timer function that returns the elapsed time in milliseconds.
 *
 * @param startTime - The start time in milliseconds.
 */
export const createElapsedTimer = (startTime = Date.now()) => {
  /**
   * Calculates the elapsed time in milliseconds from the start time to the given end time.
   *
   * @param endTime - The end time in milliseconds.
   * @returns The elapsed time in milliseconds.
   */
  const timer = (endTime = Date.now()): number => endTime - startTime;
  return timer;
};


테스트 코드

시작, 종료 시간을 인자로 주입할 수 있는 구조이기 때문에 테스트하기 용이하다.


describe('createElapsedTimer', () => {
  test('함수를 반환해야 한다', () => {
    const timer = createElapsedTimer();
    expect(typeof timer).toBe('function');
  });
 
  test('시작 시간을 지정할 수 있다.', () => {
    const startTime = Date.now() - 1000; // 1초 전
    const timer = createElapsedTimer(startTime);
    const elapsed = timer();
    expect(elapsed).toBeGreaterThanOrEqual(1000); // 최소 1초 이상 경과해야 함
  });
 
  test('종료 시간을 지정할 수 있다.', () => {
    const startTime = Date.now() - 2000; // 2초 전
    const endTime = Date.now() - 1000; // 1초 전
    const timer = createElapsedTimer(startTime);
    const elapsed = timer(endTime);
    expect(elapsed).toBeCloseTo(1000, -2); // 대략 1초 경과해야 함
  });
});