NBC - JS 개인프로젝트 : api로 받아온 데이터 화면에 뿌리기 (promise.all, aysnc, await)

2024. 7. 26. 23:47·프론트엔드/React

 

 

이번 개인 프로젝트 과제에서는 영화 정보를 api로 받아와서 메인 화면에 리스트를 뿌려주는 기능이 주요 기능 중 하나이다.

가이드 라인에 있는 예시 코드에는 api로 받아올 주소를 보니 한 페이지 즉 총 20개의 영화만을 가지고 오는 URL로 되어있었다.

const URL = `https://api.themoviedb.org/3/movie/popular?api_key=${API_KEY}&language=en-US&page=1`;

 

맨 마지막을 보면  "page=1"이 있다. TMDB에 인기영화 top20개 (1페이지) 만을 보여주는 주소이다. 문득 저 숫자를 반복문을 돌며 받아오면 10페이지(200개)의 영화도 리스트로 뽑아 올 수 있지 않을까? 라는 생각이 들었고.. 바로 해보기로 했다.

 

 

일단 기본 api를 받아오는 구성부터 바꿨다.

먼저 API_KEY, baseUrl, pages를 변수로 빼줘서 언제든지 나중에 수정하기 쉽게 해두었다.

const API_KEY = "###";
const baseUrl = "https://api.themoviedb.org/3/movie/popular";
const pages = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; // 요청할 페이지 번호

 

 

 

1. 단일 페이지 데이터 요청 (await)

단일 페이지의 데이터를 요청하고 처리하는 로직을 짰다.

async function fetchMovies(page) {
  const url = `${baseUrl}?api_key=${API_KEY}&language=en&page=${page}`;
  const response = await fetch(url); // url로 fetch 요청(get)
  const data = await response.json(); // json형태로 데이터 가져옴
  return data.results; // 영화 데이터만 반환
}

 

fetch를 통해 url로 get 요청을 보낸다.

fetch에 대해 조금 더 찾아봤는데 기본적으로 get 요청에만 이렇게 간단하게 url만 있으면 사용이 가능하다고 한다.

 

await는 비동기 작업을 처리할 때 사용하는 키워드인데, async 함수 내에서만 사용이 가능하다.

그리고 나중에 Promise가 이행될때 까지 기다힌다. 마지막에 동기적인 코드처럼 처리가 된다.(promise를 기다리는 코드라고 할 수 있을 것 같다)

 

 

참고로 post 같은 경우 이런식으로 method, headers, body와 같은 옵션들이 필수로 필요해진다.
const response = await fetch(url, {
  method: 'POST', // 요청 메소드
  headers: {
    'Content-Type': 'application/json' // 요청 헤더
  },
  body: JSON.stringify({ key: 'value' }) // 요청 본문
});
const data = await response.json();

 

 

 

2. map으로 단일페이지 반복문 (+Promise.all)

async function fetchAllMovies(pages) {
  const promises = pages.map((page) => fetchMovies(page)); // 각 페이지 번호에 대해 fetchMovies 호출
  const results = await Promise.all(promises); // 모든 페이지의 데이터를 병렬로 요청
  console.log(results);
  console.log(results.flat());
  return results.flat(); // 2차원 배열을 1차원으로 변환
}

 

 

맨 상단에 할당한 pages가 인자로 들어오고, map을 돌며 fetchMovies를 반복한다.

여기서 나온 모든 영화 정보(fetchMovies 함수 안에 있는 data.results > 영화 데이터들)들을 result에 넣는데 여기서 Promise 가 나온다.

 

Promise는 비동기 작업중 시간이 오래걸리는 것들 (API 호출, 파일 읽기 등)을 수행할때 사용된다.

Promise.all은 병렬로 처리해주는 메서드 중 하나이다.

 

결국 result에는 2차 배열로 총 20개씩 10개의 배열로 이뤄어지게 되고(한 페이지당 20개의 배열로 받은 리스트가 10개 있는 거기에)

마지막에 flat() 메서드를 통해 200개의 1차 배열로 변형을 해준다.

 

 

 

그렇게 해서 얻게 된 총 200개의 영화 리스트들..

 

 

당연 이 코드를 혼자서 짜라면 못짜겠지만... 어떻게 api를 받아오고 그 이후 로직이 돌아가는지 알기에는 참 좋았던거 같다

아마 시간이 난다면 이번에 배운 sort() 메서드를 통해 이름 순으로 소팅을 해볼까 싶기도 하다.ㅎㅎ

'프론트엔드 > React' 카테고리의 다른 글

리액트에서 자주 사용하는 기초 JS 정리  (0) 2024.08.09
NBC - JS 개인프로젝트 : scroll indicator, 모달창 구현  (0) 2024.07.29
NBC - JS 2주차 강의 정리 : Map, Set  (0) 2024.07.24
NBC - JS 2주차 강의 정리 : 일급 객체로서의 함수  (1) 2024.07.24
NBC - JS 2주차 강의 정리 : 구조분해할당, 전개 구문(Spread Operator)  (0) 2024.07.24
'프론트엔드/React' 카테고리의 다른 글
  • 리액트에서 자주 사용하는 기초 JS 정리
  • NBC - JS 개인프로젝트 : scroll indicator, 모달창 구현
  • NBC - JS 2주차 강의 정리 : Map, Set
  • NBC - JS 2주차 강의 정리 : 일급 객체로서의 함수
장쫑이이
장쫑이이
  • 장쫑이이
    JongHoy
    장쫑이이
  • 전체
    오늘
    어제
    • 코딩공부하기 (41)
      • 프론트엔드 (41)
        • Next.js (12)
        • React (16)
        • TypeScript (2)
        • 상태관리 (1)
        • HTML&CSS (1)
        • 기타 (9)
      • 과거 공부 내용 (0)
        • JSCODE 그룹스터디 (0)
        • JS 객체 지향 프로그래밍 (0)
        • 리엑트 (0)
        • 제로초 - 웹 게임을 만들며 배우는 리엑트 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    isNan
    github
    이중 for문
    destructuring
    유클리드 호제법
    행렬의 덧셈
    styled-components
    reduce
    setAttribute
    속성 추가
    map
    LastIndexOf
    slice
    While문
    Filter
    팀프로젝트
    토글
    필터링
    git
    useState
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
장쫑이이
NBC - JS 개인프로젝트 : api로 받아온 데이터 화면에 뿌리기 (promise.all, aysnc, await)
상단으로

티스토리툴바