코드를 저장한 뒤 NewsList 컴포넌트에서 usePromise를 사용해 보세요.

    components/NewsList.js

    import React from 'react';
    import styled from 'styled-components';
    import NewsItem from './NewsItem';
    import axios from 'axios';
    import usePromise from '../lib/usePromise';
     
    const NewsListBlock = styled.div`
      (...)
    `;
     
    const NewsList = ({ category }) => {
      const [loading, response, error] = usePromise(() => {
        const query = category === 'all' ? '' : `&category=${category}`;
        return axios.get(
          `https://newsapi.org/v2/top-headlines?country=kr${query}&apiKey=0a8c4202385d4ec1bb93b7e277b3c51f`,
        );
      }, [category]);
     
      // 대기 중일 
      if (loading) {
        return <NewsListBlock>대기 ...</NewsListBlock>;
      }
     
      // 아직 response 값이 설정되지 않았을 
      if (!response) {
        return null;
      }
      // 에러가 발생했을 
      if (error) {
        return <NewsListBlock>에러 발생!</NewsListBlock>;
      }
     
      // response 값이 유효할 
      const { articles } = response.data;
      return (
        <NewsListBlock>
          {articles.map(article => (
            <NewsItem key={article.url} article={article} />
          ))}
        </NewsListBlock>
      );
    };
     
    export default NewsList;

     

    usePromise를 사용하면 NewsList에서 대기 중 상태 관리와 useEffect 설정을 직접 하지 않아도 되므로 코드가 훨씬 간결해집니다. 요청 상태를 관리할 때 무조건 커스텀 Hook을 만들어서 사용해야 하는 것은 아니지만, 상황에 따라 적절히 사용하면 좋은 코드를 만들어 갈 수 있습니다.

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