fetch api

</>·2021년 12월 5일
2

Get to Know React

목록 보기
8/8
post-thumbnail

목표

  • fetch api를 통해 외부로부터 데이터를 가져오기

1. 데이터 가져오기

1-1. Fetch API

  • 웹에서 화면을 표시할 때 프론트만 가지고 화면을 구성하는 경우는 드물고 보통 서버로부터 데이터를 가져와 화면을 구성한다.
  • 클라이언트와 서버 간 데이터를 주고받기 위해 비동기 HTTP 통신을 위한 도구로는 Ajax, Axios, Fetch 등이 존재한다.
  • 그 중에서 ES6부터 도입된 JavaScript의 내장 라이브러리인 Fetch로 데이터를 가져오려고 한다.

Fetch API란?

  • 네트워크 통신을 포함한 리소스 취득을 위한 인터페이스가 정의되어 있다.
  • Fetch에는 일반적인 오브젝트로로 RequestResponse가 포함되어 있다.
  • 따라서, Fetch API를 이용하면 Request나 Response와 같은 HTTP의 파이프라인을 구성하는 요소를 조작하는것이 가능하다.
  • 자세한 내용은 Mozilla - Fetch API 에서 확인할 수 있다.

1-2. TMDB API

  • TMDB는 영화, TV 프로그램을 수집하여 데이터베이스로 만드는 기업이다.
  • API를 무료로 제공하기 때문에 API Key만 있으면 언제든지 데이터를 접근할 수 있다.
  • TMDB API 를 이용하기 위해서는 회원가입을 해야하는데 여기서 할 수 있다.(간단한 정보만 입력하면 된다.)

  • 회원가입 후 로그인을 하면 API Key값을 얻을 수 있다. 이 key값을 querystring으로 넘겨주면 원하는 정보를 얻을 수 있다.

  • 다음 url에 API Key값을 넣어 접속해보자.
https://api.themoviedb.org/3/movie/popular?api_key={API_KEY}

  • 위와 같이 JSON 형태의 데이터를 넘겨준다. 이제 fetch를 활용해서 API를 호출해보자.
const App = () => {
  const [datas, setDatas] = React.useState(null);

  React.useEffect(() => {
    fetch(
      "https://api.themoviedb.org/3/movie/popular?api_key={API_KEY}
    )
      .then(function (response) {
      return response.json();
    })
      .then(function (data) {
      setDatas(data.results);
    });
  }, []);

  return (
    <div>
      <h2>popular movie</h2>
      {datas ? (
        datas.map((data) => {
          return (
            <div className="wrapper" key={data.id}>
              <div>id: {data.id}</div>
              <div>title: {data.title}</div>
              <div>rating: {data.vote_average}</div>
              <div>overview: {data.overview}</div>
              <div>
                <img
                  src={`https://image.tmdb.org/t/p/original/${data.poster_path}`}
                  width="200"
                  />
              </div>
            </div>
          );
        })
      ) : (
        <p>Loading...</p>
      )}
    </div>
  );
};
  • 데이터 호출은 렌더링 될 때 한 번만 호출하면 되므로 dependency array에 빈 배열을 넣어 useEffect를 선언한다.
  • 그리고 Fetch API를 통해 받아온 data를 useState를 통해 datas state 변수에 저장하고 사용한다.

💡 주의

  • Fetch를 통해 데이터를 받아올 때 상황에 따라(네트워크 상태 등) 오래 걸리는 경우가 생길 수 있다.
  • 따라서, 위 코드 처럼 삼항 연산자를 사용해 데이터를 받아오기 전까지는 로딩 화면을 띄어주고 데이터를 받아왔다면 받아온 데이터를 화면에 렌더링 해주는 작업이 필요하다.

❗️ 참고

  • 위 코드에서 이미지 주소(src)를 데이터에 맞게 동적으로 변경 해야하는 경우가 생길 수 있다.
  • 따라서 변경되는 부분을 변수로 설정해야 한다. 이럴 때는 백틱(`)을 사용하여 동적으로 url을 설정하면 된다.


1-3. error 핸들링

const App = () => {
    const [datas, setDatas] = React.useState(null);
    const [error, setError] = React.useState(null);

    React.useEffect(() => {
      fetch(
        "https://apis.themoviedb.org/3/movie/popular?api_key={API_KEY}"
      )
        .then(function (response) {
          return response.json();
        })
        .then(function (data) {
          setDatas(data.results);
        })
        .catch(function (error) {
          setError(error.message);
        });
    }, []);

    return (
      <div>
        <h2>popular movie</h2>
        {datas ? (
          // 생략
        ) : error !== null ? (
          <div>
            <h3>There is some error.</h3>
            <div>{error}</div>
          </div>
        ) : (
          <p>Loading...</p>
        )}
      </div>
    );
  };
  • fetch API에 catch를 붙여 error state 변수에 error.message를 설정해준다.
  • 그 후, api의 일부를 수정(위 코드에서는 api를 apis로)해 일부로 에러를 발생시킨다.
  • 만약 error state 변수가 null 값이 아니면 즉, 에러가 발생했다면 에러를 표시하는 화면을 렌더링 해준다.

출처

profile
개발자가 되고 싶은 개발자

0개의 댓글