프로그래밍 언어/REACT

Movie 컴포넌트 만들기

· 코딩마이데이

Movie 컴포넌트 만들기

import React from "react";
import PropTypes from "prop-types";

const Movie = () => {
  return <div></div>;
};

Movie.propTypes = {};

export default Movie;

 

Movie 컴포넌트는 state가 필요하지 않으므로 클래스형 컴포넌트가 아니라 함수형 컴포넌트로 작성할 겁니다.

또, Movie에 넘어와야 하는 영화 데이터를 정의하고 관리하기 위해 prop-types를 사용했습니다.

 

Movie.propTypes 작성하기

우선 id, year, title, summary, poster를 각각 자료형에 주의하여 Movie.propTypes에 추가해봅시다.

import React from "react";
import PropTypes from "prop-types";

const Movie = () => {
  return <div></div>;
};

Movie.propTypes = {
  id: PropTypes.number.isRequired,
  year: PropTypes.number.isRequired,
  title: PropTypes.string.isRequired,
  summary: PropTypes.string.isRequired,
  poster: PropTypes.string.isRequired,
};

export default Movie;

 

yts-proxy.now.sh/list_movies.json에 접속한 다음 스크롤을 조금만 내리면 medium_cover_image 키를 찾을 수 있습니다.

 

이 값을 사용하면 영화 포스터 이미지도 쉽게 출력할 수 있습니다.

 

노마드 코더 영화 API 정렬 기능 사용해보기

yts.lt/api#list_movies에 접속한 다음 EndPoint Prameters를 주목해 봅시다. sort_by라는 Parameter가 보일 것입니다.

 

Parameter의 이름에서 볼 수 있듯이 sort_by를 사용하면 영화 데이터를 정렬할 수 있습니다.

Example에는 quality가 3D인 영화만 불러오는 URL이 적혀있습니다.

Parameter(quality)와 Parameter에 넘겨줄 값(3D)을 =으로 이어서 작성하면 됩니다.

 

https://yts.mx/api/v2/list_movies.json?sort_by=rating을 접속해보면 평점 내림차순으로 영화 데이터를 보여줍니다.

 

 

axios.get() 수정하기

axios.get()에 yts-proxy.now.sh/list_movies.json?sort_by=rating을 전달합니다.

import axios from "axios";
import React from "react";

class App extends React.Component {
  state = {
    isLoading: true,
    movies: [],
  };
  getMovies = async () => {
    const {
      data: {
        data: { movies },
      },
    } = await axios.get(
      "https://yts-proxy.now.sh/list_movies.json?sort_by=rating"
    );
    this.setState({ movies, isLoading: false });
  };
  componentDidMount() {
    this.getMovies();
  }

  render() {
    const { isLoading } = this.state;

    return <div>{isLoading ? "로딩중..." : "우리는 준비 됐어"}</div>;
  }
}

export default App;

 

이제 평점 내림차순으로 영화 데이터를 가져올 수 있게 되었습니다.

 

Movie 컴포넌트에 props 추가하고 출력해보기

Movie 컴포넌트에서 id, title, year, summary, poster props를 받아 출력할 수 있도록 수정합시다.

그리고 App 컴포넌트에서 Movie 컴포넌트를 그릴 때 title만 출력하도록 만들어봅시다.

import React from "react";
import PropTypes from "prop-types";

const Movie = ({ id, title, year, summary, poster }) => {
  return <h4>{title}</h4>;
};

Movie.propTypes = {
  id: PropTypes.number.isRequired,
  year: PropTypes.number.isRequired,
  title: PropTypes.string.isRequired,
  summary: PropTypes.string.isRequired,
  poster: PropTypes.string.isRequired,
};

export default Movie;

 

App 컴포넌트에서 Movie 컴포넌트 그리기

구조 분해 할당으로 this.state에 있는 movies를 얻은 다음, App 컴포넌트에서 우리는 준비됐어를 출력하고 있는 자리에 movies.map()을 사용합시다.

import axios from "axios";
import React from "react";

class App extends React.Component {
  state = {
    isLoading: true,
    movies: [],
  };
  getMovies = async () => {
    const {
      data: {
        data: { movies },
      },
    } = await axios.get(
      "https://yts-proxy.now.sh/list_movies.json?sort_by=rating"
    );
    this.setState({ movies, isLoading: false });
  };
  componentDidMount() {
    this.getMovies();
  }

  render() {
    const { isLoading, movies } = this.state;

    return <div>{isLoading ? "로딩중..." : movies.map()}</div>;
  }
}

export default App;

 

map() 함수에 컴포넌트를 반환하는 함수 전달하기

[Console] 탭을 영화 데이터를 출력한 다음, 아무것도 반환한지 않는 함수를 전달해 봅시다.

import axios from "axios";
import React from "react";

class App extends React.Component {
  state = {
    isLoading: true,
    movies: [],
  };
  getMovies = async () => {
    const {
      data: {
        data: { movies },
      },
    } = await axios.get(
      "https://yts-proxy.now.sh/list_movies.json?sort_by=rating"
    );
    this.setState({ movies, isLoading: false });
  };
  componentDidMount() {
    this.getMovies();
  }

  render() {
    const { isLoading, movies } = this.state;

    return (
      <div>
        {isLoading
          ? "로딩중..."
          : movies.map((movie) => {
              console.log(movie);
              return;
            })}
      </div>
    );
  }
}

export default App;

 

Movie 컴포넌트 반환하도록 movies.map() 수정하기

import axios from "axios";
import React from "react";
import Movie from "./Movie";

class App extends React.Component {
  state = {
    isLoading: true,
    movies: [],
  };
  getMovies = async () => {
    const {
      data: {
        data: { movies },
      },
    } = await axios.get(
      "https://yts-proxy.now.sh/list_movies.json?sort_by=rating"
    );
    this.setState({ movies, isLoading: false });
  };
  componentDidMount() {
    this.getMovies();
  }

  render() {
    const { isLoading, movies } = this.state;

    return (
      <div>
        {isLoading
          ? "로딩중..."
          : movies.map((movie) => {
              console.log(movie);
              return <Movie />;
            })}
      </div>
    );
  }
}

export default App;

 

Movie 컴포넌트에 props 전달하기

import axios from "axios";
import React from "react";
import Movie from "./Movie";

class App extends React.Component {
  state = {
    isLoading: true,
    movies: [],
  };
  getMovies = async () => {
    const {
      data: {
        data: { movies },
      },
    } = await axios.get(
      "https://yts-proxy.now.sh/list_movies.json?sort_by=rating"
    );
    this.setState({ movies, isLoading: false });
  };
  componentDidMount() {
    this.getMovies();
  }

  render() {
    const { isLoading, movies } = this.state;

    return (
      <div>
        {isLoading
          ? "로딩중..."
          : movies.map((movie) => {
              console.log(movie);
              return (
                <Movie
                  id={movie.id}
                  year={movie.year}
                  title={movie.title}
                  summary={movie.summary}
                  poster={movie.medium_cover_image}
                />
              );
            })}
      </div>
    );
  }
}

export default App;

 

[Console] 탭에서 영화 데이터 확인해보기

[Console] 탭을 보면 영화 정보가 평점 순으로 잘 들어오고 있는 것을 확인할 수 있습니다.

 

 

key props 추가하기

key props는 유일헤야 하므로 노마드 코더 영화 API에서 넘겨주는 id를 그대로 사용했습니다.

import axios from "axios";
import React from "react";
import Movie from "./Movie";

class App extends React.Component {
  state = {
    isLoading: true,
    movies: [],
  };
  getMovies = async () => {
    const {
      data: {
        data: { movies },
      },
    } = await axios.get(
      "https://yts-proxy.now.sh/list_movies.json?sort_by=rating"
    );
    this.setState({ movies, isLoading: false });
  };
  componentDidMount() {
    this.getMovies();
  }

  render() {
    const { isLoading, movies } = this.state;

    return (
      <div>
        {isLoading
          ? "로딩중..."
          : movies.map((movie) => {
              return (
                <Movie
                  key={movie.id}
                  id={movie.id}
                  year={movie.year}
                  title={movie.title}
                  summary={movie.summary}
                  poster={movie.medium_cover_image}
                />
              );
            })}
      </div>
    );
  }
}

export default App;

 

다시 영화 앱을 실행해보면 key props와 관련된 경고 메시지가 사라졌음을 확인할 수 있습니다.