이번 주차에 진행한 노션 클론 챌린지에서는, 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,
});
'항해99_10기 > 105일의 TIL & WIL' 카테고리의 다른 글
[8주차] [20221231] 실전 프로젝트 기획 (0) | 2023.01.01 |
---|---|
[7주차] [20221229] 1주일 notion clone 챌린지 회고 (0) | 2022.12.30 |
[7주차] [20221227] Redis Node.js에서 활용하기 (0) | 2022.12.28 |
[7주차] [20221226] Notion clone 프로젝트 DB 설계 (1) | 2022.12.27 |
[WIL] [6주차] 2022.12.19 ~ 2022.12.25 회고 (feat. 미니프로젝트 완료 후기) (0) | 2022.12.26 |