더북(TheBook)

9.5.2 포스트 조회 함수 리팩토링하기

이렇게 마무리해도 기능상에 문제는 없지만, 반복되는 코드가 상당히 많지요? 이를 한번 리팩토링해보겠습니다(반드시 해야 하는 작업은 아닙니다).

lib/posts.js - getPosts, getOlderPosts, getNewerPosts

export async function getPosts({userId, mode, id} = {}) {
  let query = postsCollection.orderBy('createdAt', 'desc').limit(PAGE_SIZE);
  if (userId) {
    query = query.where('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.get();

  const posts = snapshot.docs.map(doc => ({
    id: doc.id,
    ...doc.data(),
  }));

  return posts;
}

export async function getOlderPosts(id, userId) {
  return getPosts({
    id,
    mode: 'older',
    userId,
  });
}

export async function getNewerPosts(id, userId) {
  return getPosts({
    id,
    mode: 'newer',
    userId,
  });
}

getPosts 함수는 파라미터로 객체를 받아오도록 설정하고, default parameter 문법을 사용해 만약 파라미터가 주어지지 않았다면 기본값으로 빈 객체 {}를 사용하도록 했습니다. 이렇게 기본값을 설정하지 않으면 구조 분해 과정에서 오류가 발생합니다.

파라미터 객체에는 userId, id, mode가 있습니다. 여기서 mode 값은 'older' 또는 'newer'를 받을 수 있고 이에 따라 오래된 포스트, 새로운 포스트를 불러올 수 있지요. 만약 mode 값이 주어지지 않는다면 그냥 초기 목록을 조회합니다.

getOlderPostsgetNewerPosts는 기존 코드를 다 지우고 getPosts를 원하는 옵션으로 호출하도록 만들었습니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.