(지금은 리팩토링 됨 : [UniLetter] 서버 페이징 리팩토링 (TypeScript + TypeORM) )
로딩 시간이 오래걸리는 문제가 발생했다..
기존에 있는 이벤트를 모두 내리는 API는 이전 버전에서도 계속 있어야 하기에
그대로 두고 새로운 API를 만들었다ㅏ.
routes/events/getEventsbyPage.ts
export default defineRoute('get', '/events-by-page', schema, async (req, res) => {
const {userId} = req;
const {pageNum, pageSize} = req.query;
const eventInformation = await EventService.getEventsbyPage(userId, pageNum, pageSize);
const totalEvent = await EventService.getTotalEvent();
const eventPageInformation = { maxPage: Math.floor(totalEvent / pageSize) ,
totalEvent: totalEvent,
event: eventInformation,
}
return res.json(eventPageInformation);
});
query: {
pageNum: stringAsInt, // 페이지 넘버 (0부터 시작)
pageSize:stringAsInt // 한 페이지에 내려줄 이벤트 개수
},
export const EventPageResponseScheme = {
maxPage: z.number(),
totalEvent: z.number(),
event: z.object(EventResponseScheme),
};
maxPage
: 최대 페이지 수 (totalEvent
/pageSize
올림값)totalEvent
: 총 내려줘야 할 이벤트 갯수 // 페이지 별로 이벤트 가져옴 (NEW) TODO
async getEventsbyPage(userId?: number, pageNum?:number, pageSize?:number ): Promise<Event[]> {
if(pageNum != null && pageSize != null){
// 일단은 회원 비회원 구분 X
return await this.getEventsRegardlessBlockingsbyPage(pageNum, pageSize);
}else {
return await this.getEventsRegardlessBlockings();
}
}
pageNum != null && pageSize != null
두 항목 모두 비어있지 않을 경우만 페이징 적용한다. private async getEventsRegardlessBlockingsbyPage(pageNum:number, pageSize:number): Promise<Event[]> {
const offset = pageSize * pageNum;
return await Event.find(
{order: {id: 'DESC'},
skip: offset,
take: pageSize,});
}
// 전체 이벤트 수 가져오기
async getTotalEvent(): Promise<number> {
return await Event.count();
}