Search
Duplicate
📒

[React 완벽 가이드] 05-1. HTTP 요청보내기

상태
수정중
수업
React 완벽 가이드
주제
4 more properties
참고

React HTTP 요청 보내기

NOTE
이 예제로 GET, POST 요청을 보내고 받는걸 실습한다.

GET 요청 보내기 (Fectch Api)

NOTE
// GET 요청 const response = await fetch( "https://react-http-f2dde-default-rtdb.firebaseio.com/movies.json" ); if (!response.ok) { throw new Error("Something went wrong!"); } const data = await response.json(); // 버튼 등록 <button onClick={fetchMoviesHandler}>Fetch Movies</button>
JavaScript
복사
Fetch API를 이용해서 영화 정보를 가져오기

로딩 및 데이터 State 처리하기

NOTE
로딩시간 동안 로딩중이라는 문구가 출력됨.
async function fetchMoviesHandler() { 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); setIsLoading(false); }
JavaScript
복사
지금의 예제는 버튼을 클릭하고 데이터가 가져오는 시간동안 잠시 공백이 생긴다.
이 시간동안 로딩창을 뛰운다.

Http 오류 처리하기

NOTE
만약 요청이 잘못되면 그에 해당하는 예외처리 결과를 보여줌
setError(null); //fetchMoviesHandler함수를 실행할 떄 // 이전 에러를 null로 초기화 해줍니다. try { // 현재 링크가 잘못됨! const response = await fetch("https://swapi.dev/api/films/m"); if (!response.ok) { throw new Error("Something went wrong!"); } 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); } catch (error) { setError(error.message); } setIsLoading(false);
JavaScript
복사
async, await를 사용하지 않으면 .catch()로 예외를 잡을 수 있으나, 지금은 아니므로 try~catch를 사용한다.

요청에 useEffect() 사용하기

NOTE
접속하면 바로 데이터 가져옴 (현재 이미지에서는 버튼 클릭을 하는데 그냥 넘어가자)
const fetchMoviesHandler = useCallback(async () => { setIsLoading(true); setError(null); try { const response = await fetch("https://swapi.dev/api/films/"); if (!response.ok) { throw new Error("Something went wrong!"); } 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); } catch (error) { setError(error.message); } setIsLoading(false); }, []);
JavaScript
복사
useEffect(() => { fetchMoivesHandler(); }, []);
JavaScript
복사
현재 우리는 버튼을 클릭해야만 API의 데이터를 불러오고 있는데 보통은 화면에 접속하자마자 데이터를 가져와서 보여줘야 한다.
즉시 fetch를 하려면 useEffect 훅을 사용하면 된다!
useCallback 훅을 사용해서, 함수가 변경될때 반영되도록 해주자
[ 참고]
함수로 호출해도 되지만, 의존성 배열 자리에 그 함수를 다시 호출하면 재 랜더링, 재평가 되면서 무한루프에 빠지게되므로 useEffect를 사용하자!
useEffect(() => { fetchMoviesHandler(); }, [fetchMoviesHandler]); // 무한 루프에 빠지게된다.
JavaScript
복사

POST 요청 보내기 (Fectch Api)

NOTE
POST로 데이터 추가
async function addMovieHandler(movie) { const response = await fetch( "https://react-http-f2dde-default-rtdb.firebaseio.com/movies.json", { method: "POST", body: JSON.stringify(movie), headers: { "Content-Type": "application/json", }, } );
JavaScript
복사
POST 코드
JSON.stringify() 함수로 객체를 JSON 문자열로 변경해준다.
const fetchMoviesHandler = useCallback(async () => { setIsLoading(true); setError(null); try { const response = await fetch( "https://react-http-f2dde-default-rtdb.firebaseio.com/movies.json" ); if (!response.ok) { throw new Error("Something went wrong!"); } const data = await response.json(); const loadedMovies = []; for (const key in data) { loadedMovies.push({ id: key, title: data[key].title, openingText: data[key].openingText, releaseDate: data[key].releaseDate, }); } setMovies(loadedMovies); } catch (error) { setError(error.message); } setIsLoading(false); }, []);
JavaScript
복사
GET 코드
firebase의 컬럼은 위와같이 랜덤값으로 들어가있어서 for문을 사용해 json으로 변형시켜줌