로직 변경 전

랭킹-로직-변경-전.gif

랭킹을 계산하는데 너무 오래걸림…

문제는 db를 왔다갔다하는데 db에서 찾은 값으로 처리하는 것들은 await하는게 맞긴한데 하나 처리하고 그다음 또 await 하고 이런식으로 모든게 비동기 처리되어있다보니 문제가 계산하는데 엄청 오래걸렸음…

기존 코드

async function getRankingData(data, date) {
  const rankingData = [];
  for (const item of data) {
    const userInfo = await User.findOne({ where: { user_id: item.user_id } });
    const nickname = userInfo.nick_name;
    const user_profile_image_path = userInfo.image_path;
    const total_time = await Timer.find({ user_id: item.user_id, 'daily.date': date });
    const userData = {
      user_nickname: nickname,
      user_total_time: total_time.length > 0 ? total_time[0].total_time : 0,
      user_profile_image_path,
    };
    rankingData.push(userData);
  }
  rankingData.sort((a, b) => b.user_total_time - a.user_total_time);
  return rankingData.slice(0, 10);
}

그래서 db 왔다갔다 하는 작업은 Promise.all을 사용해서 동기적으로 처리함

async function getRankingData(data, date) {
  const rankingData = await Promise.all(
    data.map(async item => {
      const userInfo = await User.findOne({ where: { user_id: item.user_id } });
      const nickname = userInfo.nick_name;
      const user_profile_image_path = userInfo.image_path;
      const total_time = await Timer.find({ user_id: item.user_id, 'daily.date': date });
      return {
        user_nickname: nickname,
        user_total_time: total_time.length > 0 ? total_time[0].total_time : 0,
        user_profile_image_path,
      };
    })
  );

  return rankingData.sort((a, b) => b.user_total_time - a.user_total_time).slice(0, 10);
}

이런게 3개정도 있었으니,,, 당연히 오래 걸릴 수 밖에…

랭킹-로직-변경-후_1.gif

그래서 결과적으로 이정도로 줄임!!


그런데 이게 다가 아니었음…

newNotification객체에는 groupId라는 키가 없는데 newNotification.grouId로 접근하니 에러가 뜨고 있었다. 그런데, 만약 서버가 crash되었다면 이 문제를 빨리 알아차렸을 텐데 그게 아니라 어떻게 계속 프로그램이 돌아가고 있다보니 점차 느려지는 문제가 발생하였다. try-catch구문을 써서 나름 에러처리를 한다고 했는데 이런 타입에러를 못찾는 걸 보고 typescript나 java를 써야겠다고 결심했다.