Data Fetching

Data Fetching

목록 내 필터링 구현에는 두가지 방법이 있다.

1. 컴포넌트 내에서 필터링

전체 목록 데이터를 불러오고 목록을 검색어로 filter하는 방법
import { useEffect, useState } from "react"; import "./styles.css"; import { getProverbs } from "./storageUtil"; export default function App() { const [proverbs, setProverbs] = useState([]); const [filter, setFilter] = useState(""); useEffect(() => { console.log("언제 effect 함수가 불릴까요?"); const result = getProverbs(); setProverbs(result); }, [filter]); const handleChange = (e) => { setFilter(e.target.value); }; return ( <div className="App"> 필터 <input type="text" value={filter} onChange={handleChange} /> <ul> {proverbs .filter((prvb) => { return prvb.toLowerCase().includes(filter.toLowerCase()); }) .map((prvb, i) => ( <Proverb saying={prvb} key={i} /> ))} </ul> </div> ); } function Proverb({ saying }) { return <li>{saying}</li>; }
JavaScript
복사
장점 : HTTP 요청의 빈도를 줄일 수 있음
단점 : 브라우저의 메모리 상에 많은 데이터를 갖게 되므로 클라이언트의 부담이 늘어남

2. 컴포넌트 외부에서 필터링

외부로 API요청을 할 때, 필터링한 결과를 받아오는 방법
import { useEffect, useState } from "react"; import "./styles.css"; import { getProverbs } from "./storageUtil"; export default function App() { const [proverbs, setProverbs] = useState([]); const [filter, setFilter] = useState(""); const [count, setCount] = useState(0); useEffect(() => { console.log("언제 effect 함수가 불릴까요?"); const result = getProverbs(filter); setProverbs(result); }, [filter]); const handleChange = (e) => { setFilter(e.target.value); }; const handleCounterClick = () => { setCount(count + 1); }; return ( <div className="App"> 필터 <input type="text" value={filter} onChange={handleChange} /> <ul> {proverbs.map((prvb, i) => ( <Proverb saying={prvb} key={i} /> ))} </ul> <button onClick={handleCounterClick}>카운터 값: {count}</button> </div> ); } function Proverb({ saying }) { return <li>{saying}</li>; }
JavaScript
복사
장점 : 클라이언트가 필터링 구현을 생각하지 않아도 된다.
단점 : 빈번한 HTTP 요청이 일어나게 되며, 서버가 필터링을 처리하므로 서버가 부담을 가짐

AJAX 요청

useEffect(() => { fetch(`http://서버주소/proverbs?q=${filter}`) .then(resp => resp.json()) .then(result => { setProverbs(result); }); }, [filter]);
JavaScript
복사
외부 API 접속이 느릴경우 사용자들이 로딩중임을 알 수 있도록 로딩 화면을 구현해야한다.
기다리는 동안 로딩화면 띄우기
const [isLoading, setIsLoading] = useState(true); // 생략, LoadingIndicator 컴포넌트는 별도로 구현했음을 가정합니다 return {isLoading ? <LoadingIndicator /> : <div>로딩 완료 화면</div>}
JavaScript
복사
useEffect(() => { setIsLoading(true); fetch(`http://서버주소/proverbs?q=${filter}`) .then(resp => resp.json()) .then(result => { setProverbs(result); setIsLoading(false); }); }, [filter]);
JavaScript
복사

서버가 클라이언트에게 돌려줄 응답을 캐싱하는 방법

HTTP 및 서버 구현에 대한 이해가 필요합니다.