Syw.Frontend

✅ React 기초 강좌

6단계. 보너스 챕터

B-2. 외부 데이터 패칭 – 간단한 API 가져오기

🎯 학습 목표

항목 설명
fetch 사용법 외부 API 호출 및 JSON 파싱
useEffect 컴포넌트가 마운트될 때 한 번만 호출
상태 처리 loading, data, error 3단계 관리

🧪 우리가 사용할 예시 API

JSONPlaceholder의 간단한 더미 API:

https://jsonplaceholder.typicode.com/posts?_limit=5

👉 게시글 5개를 JSON 형식으로 반환합니다.


📁 구성 예시

src/
├── components/
│   └── PostList.jsx
├── App.jsx

📄 1. PostList.jsx

import { useEffect, useState } from 'react';

function PostList() {
  const [posts, setPosts] = useState([]);        // 데이터
  const [loading, setLoading] = useState(true);  // 로딩 상태
  const [error, setError] = useState(null);      // 에러 처리

  useEffect(() => {
    fetch('https://jsonplaceholder.typicode.com/posts?_limit=5')
      .then((res) => {
        if (!res.ok) throw new Error('네트워크 오류 발생');
        return res.json();
      })
      .then((data) => setPosts(data))
      .catch((err) => setError(err.message))
      .finally(() => setLoading(false));
  }, []);

  if (loading) return <p>로딩 중...</p>;
  if (error) return <p>에러: {error}</p>;

  return (
    <ul>
      {posts.map((post) => (
        <li key={post.id}>
          <strong>{post.title}</strong>
          <p>{post.body}</p>
        </li>
      ))}
    </ul>
  );
}

export default PostList;

📄 2. App.jsx

import PostList from './components/PostList';

function App() {
  return (
    <div style={{ padding: '2rem' }}>
      <h1>📰 외부 데이터 패칭 예제</h1>
      <PostList />
    </div>
  );
}

export default App;

✅ 실행 결과

  • 앱이 처음 로드될 때 fetch()로 게시글 5개를 불러옴
  • 로딩 중에는 로딩 중... 표시
  • 데이터가 도착하면 ul 목록으로 출력

📌 확장 아이디어

기능 설명
검색창 쿼리스트링에 따라 데이터 가져오기
버튼 클릭 시 패칭 useEffect 대신 수동으로 fetch 실행
axios 적용 fetch 대신 axios로 리팩토링 가능
리팩토링 useFetch 커스텀 훅으로 분리 가능

✍️ 과제

  1. API 주소를 바꿔서 사용자 목록 (/users) 또는 댓글 목록 (/comments) 불러오기
  2. useFetch라는 커스텀 훅을 만들어 재사용 가능하게 만들기
  3. 버튼 클릭 시 API를 호출하고 결과를 표시하는 방식으로 바꿔보기

💬 댓글

    ※ 로그인 후 댓글을 작성할 수 있습니다.