디버그로 감싸기

개요

중요함수에서 dev에서는 log를 찍고 prod 환경에서는 로그를 안찍을 수 있게하는 function 이후 해당 결과를 주기적으로 js객체에 저장해 주기적으로 서버를 보내면 front 단의 log도 서버에서 수집 가능하다.

HOC 로 로그를 출력하는 부분을 밖으로 뺀다 . 작성이후에는 꼭 PRODUCT 레벨에서는 콘솔을 찍지 않도록 해야한다. PRODUCT에서 로그제거

코드

export const wrapWithDebug = <T extends (...args: any[]) => any>(
  fn: T,
  functionName?: string,
  enableLogging: boolean = process.env.API_DOC_ENV !== "prod" //실제 운영환경에서는 result.finally 필요없음
): T => {
  return ((...args: Parameters<T>): ReturnType<T> => {
    const name = functionName || fn.name || "anonymousFunction";
    console.debug(`${name} start`);

    const result = fn(...args);

    if (result instanceof Promise && enableLogging) {
      return result.finally(() => console.debug(`${name} end`)) as ReturnType<T>;
    }

    console.debug(`${name} end`);
    return result;
  }) as T;
};