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를 원하는 옵션으로 호출하도록 만들었습니다.

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