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 및 서버 구현에 대한 이해가 필요합니다.