Intro
React에서 영화 API 데이터를 가져와서 컴포넌트에 보여주기
API 에서 가져온 데이터는 JSON 형식이라, 배열 State를 사용하게 된다. 이는 이전 포스팅 설명했으니 참고하자.
[React] 배열 State
Intro 간단한 ToDo-list 어플 배열 State에 새로운 값 추가하기 배열 State값을 component로 render하기 State 연습을 위해 할 일을 추가할 수 있는 간단한 투두리스트 어플을 만들어보려고 한다. State의 기본
hu-coding.tistory.com
API 에서 데이터 받아오기
먼저, 영화 API 주소를 이용해 데이터를 가져오려고 한다.
https://yts.mx/api/v2/list_movies.json?minimum_rating=9&sort_by=year
=> 연도별로 정렬된 평점 9 이상의 영화 데이터
useEffect() 함수를 이용해 컴포넌트가 가장 처음으로 render 되었을 때 한 번만 api를 로딩하려고 한다. 두번째 인자로 빈 배열을 넣어주면 첫번째 인자에 들어있는 코드는 한 번만 작동한다는 것을 기억하자.
fetch(
`API주소`
).then((response) => response.json())
원하는 api 주소의 url을 fetch 시킨다. 그러면 request가 요청되고, 우리는 response를 받게되는데 데이터를 출력하기 위해서는 json을 추출해내야 한다. .then((response) => response.json())으로 response를 받아서 response.json을 return해준다.
그렇게 가져온 data를 컴포넌트에 보여주고 싶다면, 가져온 data를 state에 넣어야한다.
useState를 이용해서 json의 값을 setState 함수로 state 값에 넣어준다.
전체코드는 다음과 같다.
import { useState, useEffect } from "react";
function App() {
const [loading, setLoading] = useState(true);
const [movies, setMovies] = useState([]);
useEffect(() => {
fetch(
`https://yts.mx/api/v2/list_movies.json?minimum_rating=9&sort_by=year`
)
.then((response) => response.json())
.then((json) => {
setMovies(json.data.movies);
setLoading(false);
});
}, []);
console.log(movies);
return <div>{loading ? <h1>Loading...</h1> : null}</div>;
}
export default App;
+
async-await 사용
최근에는 보편적으로 .then 대신 async-await 사용한다. async 함수 getMovies를 만들어주고 useEffect()에서 호출해준다. 그리고 getMovies 함수 안에 api 데이터를 가져오도록 하는 것이다.
import { useState, useEffect } from "react";
function App() {
const [loading, setLoading] = useState(true);
const [movies, setMovies] = useState([]);
const getMovies = async () => {
// const response = await fetch(
// `https://yts.mx/api/v2/list_movies.json?minimum_rating=9&sort_by=year`
// );
// const json = await response.json();
const json = await (
await fetch(
`https://yts.mx/api/v2/list_movies.json?minimum_rating=9&sort_by=year`
)
).json(); // await를 await로 감싸기
setMovies(json.data.movies);
setLoading(false);
};
useEffect(() => {
getMovies();
}, []);
console.log(movies);
return <div>{loading ? <h1>Loading...</h1> : null}</div>;
}
export default App;
가져온 api 데이터를 보여주는 방법은 이전 포스팅의 배열 state 사용하는 법에서 설명했는데, map() 함수를 사용해주면 된다.
return (
<div>
{loading ? (
<h1>Loading...</h1>
) : (
<div>
{movies.map((movie) => (
<div key={movie.id}>{movie.title}</div>
))}
</div>
)}
</div>
);
간단히 영화의 제목들만 가져와서 보여줬다.
'WEB > React' 카테고리의 다른 글
[React] github pages에 배포하기 (Publishing) (0) | 2022.02.03 |
---|---|
[React] React Router 사용하기 (0) | 2022.02.03 |
[React] 배열 State (0) | 2022.02.02 |
[React] Effects (useEffect, clean-up) (0) | 2022.01.29 |
[React] Props (Memo, Props Types) (0) | 2022.01.28 |