As i wish

[GraphQL] GraphQL 시작하기 - 5 (Api 연결) 본문

GraphQL

[GraphQL] GraphQL 시작하기 - 5 (Api 연결)

어면태 2020. 2. 29. 11:42

그래프 큐엘에 대한 강의를 듣고 실제 코딩 후 기록을 위해 블로그에 남기고 있는데요.

Graph QL - 1

 

[GraphQL] GraphQL 시작하기

2020년에는 새로운 것을 시작하기로 마음을 먹었었는데 그동안 아버지 홈페이지 리뉴얼 작업으로 인하여 React + MobX + Styled-Component + Firebase + AWS로 프로젝트를 구성하고 끝내느라 시작하지 못하였습니..

eomtttttt-develop.tistory.com

Graph QL - 2

 

[GraphQL] GraphQL 시작하기 - 2 (Query with parameter)

요즘 그래프 큐엘로 서버를 구축하고 있고 공부 중인데, 지난번에는 Query와 기본적인 개념에 대하여 포스팅했었습니다. 이번에는 복습 차원에서 parameter를 가진 Query를 만들 때에 어떻게 해주는지 포스팅해보..

eomtttttt-develop.tistory.com

Graph QL - 3

 

[GraphQL] GraphQL 시작하기 - 3 (Mutation)

안녕하세요. 오늘은 GraphQL 에서 데이터를 Create 할 수 있는 Mutation 에 대하여 포스팅 해보겠습니다. 기존에는 Query를 통하여 데이터를 가져오는 방법을 했었는데, 전체 데이터를 가져오기도 하고 Parameter..

eomtttttt-develop.tistory.com

Graph QL - 4

 

[GraphQL] GraphQL 시작하기 - 4 (Mutation - delete)

안녕하세요. 지난 번에는 Mutation을 이용하여 Add 하는 법을 포스팅 했었죠. CRUD에서 Create부분 이죠. GraphQL - Mutation (Add) [GraphQL] GraphQL 시작하기 - 3 (Mutation) 안녕하세요. 오늘은 GraphQL 에서..

eomtttttt-develop.tistory.com

 

이렇게 1 ~ 4 까지 진행해보았고 기본적인 Query, Mutaion, resolvers, scheme 등에 대하여 포스팅 해봤습니다.

오늘은 마지막 시리즈로 실제 API 에 연결해보겠습니다.

제가 사용할 API 는 영화 정보를 가져오는  API인데요.

- https://yts-proxy.now.sh/list_movies.json
- https://yts-proxy.now.sh/movie_details.json?movie_id={}

영화 리스트를 가져오는 API와 영화 상세 정보를 가져오는 API 두가지를 사용해 보겠습니다.

먼저 스키마 부터 정의해보겠습니다.

graphql.scheme

type Query {
  people: [Person]!
  person(id: String!): Person!
  movies(limit: Int, rating: Float): [Movie]!
  movie(id: Int!): Movie!
}

type Mutation {
  addPerson(name: String!, age: Int!, gender: String!): Person!
  deletePerson(id: String!): Boolean!
}

type Person {
  id: String!
  name: String!
  age: Int!
  gender: String!
}

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

 

그 다음 이에 맞는 resolvers를 구현해보겠습니다.

resolvers.js

const { getPeople, getPerson, addPerson, deletePerson } = require('../dummy/people');
const { getMovies, getMovie } = require('../controller/test-movie.controller');

const resolvers = {
    Query: {
        people: () => getPeople(),
        person: (_parent, { id }) => getPerson(id),
        movies: (_parent, { limit, rating }) => getMovies(limit, rating),
        movie: (_parent, { id }) => getMovie(id),
    },
    Mutation: {
        addPerson: (_parent, { name, age, gender }) => addPerson(name, age, gender),
        deletePerson: (_parent, { id }) => deletePerson(id)
    }
}

module.exports.resolvers = resolvers;

 

컨트롤러 모듈을 구현해 보겠습니다. 위에서는 test-movie.controller가 되겠죠?

test-movie.controller.js

const axios = require('axios');

const BASE_URL = "https://yts-proxy.now.sh/";
const LIST_MOVIES_URL = `${BASE_URL}list_movies.json`;
const MOVIE_DETAILS_URL = `${BASE_URL}movie_details.json`;
const MOVIE_SUGGESTIONS_URL = `${BASE_URL}movie_suggestions.json`;

const getMovies = async (limit, rating) => {
  const res = await axios.get(LIST_MOVIES_URL, {
    params: {
      limit,
      minimum_rating: rating,
    }
  });
  const { movies } = res.data.data;

  return movies
};

const getMovie = async (id) => {
  const res = await axios.get(MOVIE_DETAILS_URL, {
    params: {
      movie_id: id,
    }
  });

  const { movie } = res.data.data;

  return {
    ...movie,
    summary: movie.description_full
  }
};

module.exports.getMovies = getMovies;
module.exports.getMovie = getMovie;

 

이런식으로 resolvers 에 맞는 함수들을 정의해주고 함수 안에서는 axios 모듈을 이용하여 api 콜을 진행하였습니다.

이런식으로 movies를 가져 올 수 있고 movie 상세를 가져올 수 있게 됩니다.

여기서 주의할 점은 movie query를 날릴 때에 api 상에서는 summary라는 프로퍼티가 존재하지않습니다.

따라서 컨트롤러 단에서 movie 에 description_full 을 summary 프로퍼티로 변경 해주어서 query가 원하는 값을 맞춰줘야 제대로 동작하게 됩니다.

앞으로 저는 제가 실제 api를 만들어 볼 생각인데요. 현재 영화 정보를 가져오는 서비스를 제작 중에 있는데 이를 그래프큐엘로 구성해볼 생각입니다.

각각의 정보들을 크롤링 할 생각이고 크롤링 한 모듈을 AWS Lambda에 올려서 api를 구성 한 뒤, 서버 쪽을 그래프큐엘로 구현하여 각 API를 콜해 볼 생각입니다. 이러한 방향성을 가지고 그래프큐엘 프로젝트를 진행해 볼 생각인데, 기회가 되면 포스팅도 이어가보도록 하겠습니다.

정말 쉽고 빠르게 서버를 구축할 수 있는것 같고, REST API 를 구현하기 위한 여러가지 작업들이 많이 생략되어서 조금 더 클라이언트에 맞는 라이브러리? 가 되지 않을까 싶네요.

조금 더 깊게 써보고 속도나 이런측면도 고민해 봐야겠네요.

Comments