커스텀 Hook은 함수 컴포넌트랑 비슷한데, 차이점은 JSX를 반환하지 않는다는 것입니다. 컴포넌트를 만들 때처럼 다른 Hook 함수를 마음껏 사용하고, 여기서 만들어진 상태나 함수들을 반환하면 됩니다. 그리고 이 Hook의 useEffect는 이전에 작성한 것과 조금 다릅니다. 가장 처음 조회한 포스트의 수가 PAGE_SIZE보다 작으면 noMorePost의 값을 true로 변경시키는 로직을 추가했습니다.

    이렇게 커스텀 Hook을 만든 다음에는 원하는 곳에 사용해주면 됩니다. 먼저 FeedScreen에서 기존 로직을 다 날려버리고 방금 만든 Hook을 사용해볼까요?

    screens/FeedScreen.js

    (...)
    import usePosts from '../hooks/usePosts';
    
    function FeedScreen() {
      const {posts, noMorePost, refreshing, onLoadMore, onRefresh} = usePosts();
      return (
        <FlatList
          data={posts}
          renderItem={renderItem}
          keyExtractor={(item) => item.id}
          contentContainerStyle={styles.container}
          onEndReached={onLoadMore}
          onEndReachedThreshold={0.75}
          ListFooterComponent={
            !noMorePost && (
              <ActivityIndicator style={styles.spinner} size={32} color="#6200ee" />
            )
          }
          refreshControl={
            <RefreshControl onRefresh={onRefresh} refreshing={refreshing} />
          }
        />
      );
    }
    
    (...)
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.