TIL/etc.
[TIL] API
Dong _ hwa
2023. 5. 18. 20:05
๐จ๐ป React HTTP ์์ฒญ ๋ณด๋ด๊ธฐ
- ํด๋ผ์ด์ธํธ์ ์ง์ ์ ์ผ๋ก ์๋ฒ๋ฅผ ์ฐ๊ฒฐํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ ๋๊ตฌ๋ ํ์ธํ ์ ์๊ธฐ ๋๋ฌธ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ ธ์ถ์ํค๋ ํ์์ด๋ฉฐ ๋ณด์์ ์ทจ์ฝํด์ง๋ค.
- HTTP ์์ฒญ์ ๋ํ API๋ฅผ ๋งํ ๋๋ ๋ณดํต REST ๋๋ GraphQL API๋ฅผ ๋งํ๋ฉฐ ์ด ๋ ๊ฐ๋ ์๋ฒ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ ธ์ถํ๋ ๋ฐฉ์์ ๋ํ ์๋ก ๋ค๋ฅธ ํ์ค์ด๋ค.
- Fetch API๋ ๋ธ๋ผ์ฐ์ ๋ด์ฅํ์ด๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ณ ์ด๋ฆ๊ณผ๋ ๋ค๋ฅด๊ฒ ์ ์ก๋ ๊ฐ๋ฅํ๋ค.
์ฌ์ฉํ API์ฃผ์ : https://swapi.dev/
API ์ค๋ช
: ์ํ์ ๋ํ ์ ๋ณด๋ฅผ JSONํ์์ผ๋ก ๋ณด์ฌ์ค
์ํ์ ๋ํ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์ ๊ทธ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฐ๋จํ ํจ์
const [movies, setMovies] = useState([]);
// ์ด์ ์ด ํจ์๊ฐ ํธ์ถ๋ ๋ ๋ง๋ค ๋งค ๋ฒ HTTP ์์ฒญ์ด ์ ์ก๋จ
function fetchMoviesHandler () {
// fetch๋ฅผ ํตํด ํ๋ก๋ฏธ์ค ๊ฐ์ฒด๋ฅผ ๋ฐํํจ
fetch('https://swapi.dev/api/films/')
// *์ค์* ์? then์ ์ฌ์ฉํด์ผ ํ๋? - HTTP ์์ฒญ์ ์ฆ๊ฐ ๋๋๋ ์์
์ด ์๋๊ธฐ์ ๋ฏธ๋์ ์ด๋ ์์ ์์ ํ์ธํ ์ ์์
// ์ด ๋ง์ ์ฆ, ๋๋๋ ์์ ์ ๋ง์ถฐ then์ ์ด์ฉํ์ฌ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํด์ผํจ
// ์์ฒญ ๋ฐ์ ๋ฐ์ดํฐ๋ JSON ํ์์ด๋ฏ๋ก ์ฝ๋์์ ์ฌ์ฉํ ์ ์๋ ๊ฐ์ฒด๋ก ๋ฐํํจ
.then(response => response.json())
// ๊ทธ ๋ณํ๋ ๋ฐ์ดํฐ๋ฅผ useState๋ก movies์ ๋ฃ์ด์ค
.then((data) => {
setMovies(data.results);
}
}
์ ์ฒ๋ผ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ก ๋ฃ์ด์ค ์ ์๊ฒ ์ง๋ง ์ค์ ๋ก ์ง์ฌ์ง ์ฝ๋์ ๋ถ๋ฌ์ค๋ ๋ฐ์ดํฐ์์ ํค ๊ฐ์ ์ฐจ์ด๊ฐ ์์ ์ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก map์ ์ด์ฉํ์ฌ ์๋ ์ง์ฌ์ง ํค ๊ฐ์ ๋ง์ถฐ์ฃผ๋ ๊ฒ ์ข๋ค.
(๋ฌผ๋ก , ๋ฐ์์ค๋ ๋ฐ์ดํฐ์ ํค ๊ฐ์ ๋ง๊ฒ ์ฝ๋๋ฅผ ์์ ํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.)
const [movies, setMovies] = useState([]);
function fetchMoviesHandler () {
fetch('https://swapi.dev/api/films/')
.then(response => response.json())
.then((data) => {
const transformedMovies = data.results.map(movieData => {
return {
id: movieData.episode_id,
title: movieData.title,
openingText: movieData.opening_crawl,
releaseDate: movieData.release_date
};
});
setMovies(transformedMovies);
}
}
์ดํด๋ฅผ ์ํ ๋๋ฏธ๋ฐ์ดํฐ์ API ์์ฒญ์ ์ํด ๊ฐ์ ธ์จ ๋ฐ์ดํฐ ๋น๊ต
- ์์ fetch๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒ๊ณผ ๋๊ฐ์ด async, await๋ฅผ ์ด์ฉํ์ฌ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ํ ์ ์๋ค.
- ์ด๊ฑด ๋ฆฌ์กํธ์ ํน๋ณ ๊ธฐ๋ฅ์ด ์๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ด๋ค.
- ์ค์ ๋ก ์ด ์ฝ๋๊ฐ ์คํ๋ ๋ then์ผ๋ก ๋ฒ์ญ๋์ด ์คํ๋๋ค.
const [movies, setMovies] = useState([]);
async function fetchMoviesHandler () {
const response = await fetch('https://swapi.dev/api/films/')
const data = await response.json();
const transformedMovies = data.results.map(movieData => {
return {
id: movieData.episode_id,
title: movieData.title,
openingText: movieData.opening_crawl,
releaseDate: movieData.release_date
};
});
setMovies(transformedMovies);
}
๋ก๋ฉ ํ๋ฉด ๊ตฌํํ๊ธฐ ๐ญ
const [movies, setMovies] = useState([]);
const [isLoading, setIsLoading] = useState(false);
async function fetchMoviesHandler () {
// ์๋์ ์ฝ๋๋ค์ด ์คํ๋๊ธฐ ์ ์ ๋ก๋ฉ ์ํ๋ฅผ true๋ก ๋ง๋ฌ
setIsLoading(true);
const response = await fetch('https://swapi.dev/api/films/')
const data = await response.json();
const transformedMovies = data.results.map(movieData => {
return {
id: movieData.episode_id,
title: movieData.title,
openingText: movieData.opening_crawl,
releaseDate: movieData.release_date
};
});
setMovies(transformedMovies);
// ๋ชจ๋ ์ฝ๋๊ฐ ๋์๊ฐ๋ค๋ฉด ๋ค์ ๋ก๋ฉ ์ํ๋ฅผ false๋ก ๋ง๋ฌ
setIsLoading(false);
}
const App () => {
return (
<React.Fragment>
// ๋ก๋ฉ ์ํ๊ฐ false์ผ ๊ฒฝ์ฐ MovieList ์ปดํผ๋ํธ๋ฅผ ๋ณด์ฌ์ฃผ๊ณ
{!isLoading && <MovieList/>}
// ๋ก๋ฉ ์ํ๊ฐ true์ผ ๊ฒฝ์ฐ LoadingPage ์ปดํผ๋ํธ๋ฅผ ๋ณด์ฌ์ค
{isLoading && <LoadingPage>}
</React.Fragment>
)
}
- ์ถ๊ฐ๋ก ์ปจํ ์ธ ๊ฐ ์์ ๊ฒฝ์ฐ์ ํ๋ฉด๋ ๋๋๋ ๋ฐฉ๋ฒ๋ ์๋ค.
- ํ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ฌด๊ถ๋ฌด์งํ๋ค.
const App () => {
return (
<React.Fragment>
// ๋ก๋ฉ์ ๋์๊ณ ๋ณด์ฌ์ค ๋ด์ฉ์ด ์๋ ๊ฒฝ์ฐ
{!isLoading && movies.length > 0 && <MovieList/>}
// ๋ก๋ฉ์ ๋์์ง๋ง ๋ณด์ฌ์ค ๋ด์ฉ์ด ์๋ ๊ฒฝ์ฐ
{!isLoasing && movies.length === 0 && <EmptyList/>}
// ๋ก๋ฉ์ด ์ ๋ ๊ฒฝ์ฐ
{isLoading && <LoadingPage>}
</React.Fragment>
)
}