코드를 저장한 뒤 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을 만들어서 사용해야 하는 것은 아니지만, 상황에 따라 적절히 사용하면 좋은 코드를 만들어 갈 수 있습니다.