Programming/GraphQL

GraphQL과 YTS API 사용하기 (1)

쌩우 2019. 9. 30. 17:51

GraphQL과 REST API를 함께 사용하는 경우, 어떻게 REST API를 wrapping 할지를 간단히 알아본다.

GraphQL 서버에서 다른 서버로 데이터 요청을 한 뒤, 해당 정보에 대하여 처리하는 것이다.
여기선 node-fetch를 사용하여 YTS API에 요청을 보낸다.

  1. database를 구축하기 위하여 YTS API로 요청하기
    기존의 db.js에 작성한 임의의 값이 아닌, API 요청 응답값을 기준으로 database를 구축한다.

     // API를 요청하는 URL
     const API\_URL = 'https://yts.lt/api/v2/list\_movies.json';
    
     // URL endpoint인 limit과 rating을 인자로 받는 함수
     // limit은 불러올 데이터의 개수, rating은 불러올 데이터의 점수 정보에 대한 것
     import fetch from "node-fetch";
     const API_URL = "https://yts.lt/api/v2/list_movies.json";
    
     export const getMovies = (limit, rating) => {
       let REQUEST_URL = API_URL;
       if (limit > 0) {
         REQUEST_URL += `?limit=${limit}`;
       }
       if (rating > 0) {
         REQUEST_URL += `&minimum_rating=${rating}`;
       }
       console.log(REQUEST_URL);
       return fetch(`${REQUEST_URL}`)
         .then(res => res.json())
         .then(json => json.data.movies);
     };
     
    1. resolvers
      query에 대해서 동작할 함수를 resolvers에 정의해주자

    resolvers.js

    import { getMovies } from "./db";
    
    const resolvers = {
     Query: {
       movies: (_, { limit, rating }) => getMovies(limit, rating)
     }
    };
    export default resolvers;
    
  2. 스키마
    YTS API를 사용했을 경우 받게 될 데이터의 형식에 맞게 스키마를 작성해주자.

schema.graphql

type Movie {
  title: String!
  id: Int!
  rating: Float!
  summary: String
  language: String
  medium_cover_image: String
}

type Query {
  movies(limit: Int, rating: Float): [Movie]!
}
  1. 데이터 불러오기
    query를 통해 YTS API를 이용, 필요한 데이터를 가져와보자.

요청
rating이 7.3 이상인 것에 대하여 3개의 영화 정보와 이미지만 불러와보자.

query{
  movies(limit:3, rating: 7.3){
    rating
    title
    medium_cover_image
  }
}

응답

{
  "data": {
    "movies": [
      {
        "rating": 7.4,
        "title": "Sister Aimee",
        "medium_cover_image": "https://yts.lt/assets/images/movies/sister_aimee_2019/medium-cover.jpg"
      },
      {
        "rating": 7.3,
        "title": "Elena",
        "medium_cover_image": "https://yts.lt/assets/images/movies/elena_2011/medium-cover.jpg"
      },
      {
        "rating": 7.9,
        "title": "Ivan the Terrible, Part II",
        "medium_cover_image": "https://yts.lt/assets/images/movies/ivan_the_terrible_part_ii_1958/medium-cover.jpg"
      }
    ]
  }
}

여기까지 GraphQL이 타 API를 어떻게 감싸고 사용할 수 있는지 간단하게 알아볼 수 있었다.


다음 글에서는 여기에서 조금 더 GraphQL API를 확장해보자.