src/
├── api/
│ └── users.ts
├── components/
│ └── UserList.tsx
├── App.tsx
📄 src/api/users.ts
// 사용자 목록을 가져오는 함수 (GET 요청)
// axios를 사용하여 REST API 호출
import axios from 'axios';
// 사용자 데이터 타입 정의
export interface User {
id: number;
name: string;
email: string;
}
// 사용자 목록을 가져오는 비동기 함수
export const fetchUsers = async (): Promise<User[]> => {
const response = await axios.get('<https://jsonplaceholder.typicode.com/users>');
return response.data;
};
💡 User 타입을 미리 정의함으로써, 타입스크립트 환경에서 자동완성과 타입 체크가 가능해집니다.
📄 src/components/UserList.tsx
import React, { useEffect, useState } from 'react';
import { fetchUsers, User } from '../api/users';
const UserList: React.FC = () => {
// 사용자 목록 상태 선언
const [users, setUsers] = useState<User[]>([]);
const [loading, setLoading] = useState<boolean>(true); // 로딩 상태
const [error, setError] = useState<string | null>(null); // 에러 상태
// 컴포넌트가 마운트되면 사용자 목록 가져오기
useEffect(() => {
const loadUsers = async () => {
try {
const data = await fetchUsers(); // API 호출
setUsers(data); // 사용자 목록 상태에 저장
} catch (err) {
setError('사용자 정보를 불러오는데 실패했습니다.');
} finally {
setLoading(false); // 로딩 종료
}
};
loadUsers();
}, []);
if (loading) return <p>⏳ 로딩 중...</p>;
if (error) return <p>❌ {error}</p>;
return (
<div>
<h2>👥 사용자 목록</h2>
<ul>
{users.map((user) => (
<li key={user.id}>
<strong>{user.name}</strong> ({user.email})
</li>
))}
</ul>
</div>
);
};
export default UserList;
✅ useEffect를 사용해 컴포넌트가 처음 렌더링될 때만 fetchUsers를 실행합니다.
🧠 에러 처리, 로딩 처리 상태를 따로 관리해 사용자에게 UX를 제공합니다.
📄 src/App.tsx
import React from 'react';
import UserList from './components/UserList';
const App: React.FC = () => {
return (
<div style={{ padding: '20px' }}>
<h1>📦 React REST API 예제</h1>
<UserList />
</div>
);
};
export default App;
항목 | 내용 |
---|---|
요청 방식 | GET |
사용 API | https://jsonplaceholder.typicode.com/users |
주요 기능 | 사용자 목록 가져오기, 로딩 및 에러 상태 처리 |
라이브러리 | axios , useEffect , useState |