본문 바로가기

항해99_10기/105일의 TIL & WIL

[7주차] [20221228] queue 자료구조를 이용하여 autoSave 구현

이번 주차에 진행한 노션 클론 챌린지에서는, 1시간 단위로 페이지에 있는 글을 자동 저장하고, 이후 6시간 동안만 조회가 가능하도록 구현하기로 했다.

 

db에는 항상 총 6개의 페이지가 저장되고, 1시간이 지날때마다, 가장 오래 된 페이지를 삭제하고 새로운 페이지를 저장하는 식이다.

 

Fist In Firts Out의 queue 형태로 구현을 하였다.

 

// app.js에서 setInterval이 발동될 때, date 객체를 생성하고 이를 ISO string으로 변환하여 저장
  const currentDate = new Date();
  const createdAt = currentDate.toISOString();
  // db에서 pageData 조회
  const pageData = await redisClient.json.get('pageData', {
    path: '.pages',
  });
  // db에 저장된 pageData가 없다면, 생성
  if (!pageData) {
    await redisClient.json.set('pageData', '$', {
      pages: [{ pageId: 0, createdAt, document }],
    });
    return;
  }
  // db에서 조회한 pageData의 length가 6보다 작다면, 6이 될때까지 데이터 밀어 넣어 주기
  if (pageData.length < 6) {
    pageData.push({ createdAt, document, pageId: pageData.length });
    await redisClient.json.set('pageData', '$', {
      pages: pageData,
    });
    return;
  }
  // [queue 구현]
  pageData.shift(); // db에서 불러온 pageData 배열에서 첫번째 obj 삭제
  pageData.push({ createdAt, document }); // db에서 불러온 pageData 배열 맨 뒤에 obj 추가
  // for 문을 돌면서, 수정된 pageData의 pageId 값을 갱신
  for (let i = 0; i < pageData.length; i++) {
    pageData[i].pageId = i;
  }
  // 갱신된 pageData를 cache db에 저장
  await redisClient.json.set('pageData', '$', {
    pages: pageData,
  });