9.5.2 포스트 조회 함수 리팩토링하기
이렇게 마무리해도 기능상에 문제는 없지만, 반복되는 코드가 상당히 많지요? 이를 한번 리팩토링해보겠습니다(반드시 해야 하는 작업은 아닙니다).
lib/posts.js - getPosts, getOlderPosts, getNewerPosts
export async function ({userId, mode, id} = {}) { let query postsCollection. ('createdAt', 'desc'). (PAGE_SIZE); if (userId) { query query. ('user.id', '==', userId); } if (id) { const cursorDoc = await postsCollection.doc(id).get(); query = mode === 'older' ? query.startAfter(cursorDoc) : query.endBefore(cursorDoc); } const snapshot await query. (); const posts snapshot.docs. (doc => ({ id: doc.id, doc. (), })); return posts; } export async function (id, userId) { return getPosts({ id, mode: 'older', userId, }); } export async function (id, userId) { return getPosts({ id, mode: 'newer', userId, }); }
getPosts 함수는 파라미터로 객체를 받아오도록 설정하고, default parameter 문법을 사용해 만약 파라미터가 주어지지 않았다면 기본값으로 빈 객체 {}를 사용하도록 했습니다. 이렇게 기본값을 설정하지 않으면 구조 분해 과정에서 오류가 발생합니다.
파라미터 객체에는 userId, id, mode가 있습니다. 여기서 mode 값은 'older' 또는 'newer'를 받을 수 있고 이에 따라 오래된 포스트, 새로운 포스트를 불러올 수 있지요. 만약 mode 값이 주어지지 않는다면 그냥 초기 목록을 조회합니다.
getOlderPosts와 getNewerPosts는 기존 코드를 다 지우고 getPosts를 원하는 옵션으로 호출하도록 만들었습니다.