로직 변경 전
랭킹을 계산하는데 너무 오래걸림…
문제는 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개정도 있었으니,,, 당연히 오래 걸릴 수 밖에…
그래서 결과적으로 이정도로 줄임!!
그런데 이게 다가 아니었음…
newNotification객체에는 groupId라는 키가 없는데 newNotification.grouId로 접근하니 에러가 뜨고 있었다. 그런데, 만약 서버가 crash되었다면 이 문제를 빨리 알아차렸을 텐데 그게 아니라 어떻게 계속 프로그램이 돌아가고 있다보니 점차 느려지는 문제가 발생하였다. try-catch구문을 써서 나름 에러처리를 한다고 했는데 이런 타입에러를 못찾는 걸 보고 typescript나 java를 써야겠다고 결심했다.