GraphQL 2일차

24625 단어 graphqlgraphql

#0.5 Creating Queries with Arguments

  • Argument를 보낼 때 처음 보내는 인자는 현재 object를 보내는 object이다.
  • id를 통해 이름을 받아온다.
//resolvers.js
import { people, getById } from "./db";

const resolvers = {
    Query: {
        people: () => people,
        person: (_, { id }) => getById(id)
    }
};

export default resolvers;
//db.js
export const getById = id => {
    const filteredPeople = people.filter(person => person.id === String(id));
    return filteredPeople[0];
};
//schema.graphql
type Person{
    id: Int!,
    name: String!,
    age: Int!,
    gender: String!
}

type Query {
    people: [Person]!
    person(id: Int!): Person 
}


#0.6 Defining and Creating Mutations

  • Mutation은 Database의 상태가 변할 때 사용된다.
//schema.graphql
type Movie{
    id: Int!,
    name: String!,
    score: Int!
}

type Query {
    movies: [Movie]!
    movie(id: Int!): Movie 
}

type Mutation{
    addMovie(name: String!, score: Int!): Movie!
}
//db.js
let movies = [
    {
        id: 1,
        name: "Black Widow",
        score: 9
    },
    {
        id: 2,
        name: "Cruella",
        score: 8
    },
    {
        id: 3,
        name: "Japan Guy",
        score: 2
    }
];

export const getMovies = () => { return movies };

export const getById = id => {
    const filteredMovie = movies.filter(movie => movie.id === id);
    return filteredMovie[0];
};

export const addMovie = (name, score) => {
    const newMovie = {
        id: movies.length + 1,
        name,
        score
    }
    movies.push(newMovie);
    return newMovie;
}
//resolvers.js
import { getMovies, getById, addMovie } from "./db";

const resolvers = {
    Query: {
        movies: () => getMovies(),
        movie: (_, { id }) => getById(id)
    },
    Mutation: {
        addMovie: (_, { name, score }) => addMovie(name, score)
    }
};

export default resolvers;

#0.7 Delete Mutation

  • "db.js"파일에 delete 함수를 만들고 "schema.graphql"과 "resolvers.js"파일의 Mutation에 추가해준다.
//schema.graphql
type Mutation{
    addMovie(name: String!, score: Int!): Movie!
    deleteMovie(id: Int!): Boolean!
}
//db.js
export const deleteMovie = id => {
    const cleanedMovie = movies.filter(movie => movie.id !== id);
    if (movies.length > cleanedMovie.length) {
        movies = cleanedMovie;
        return true;
    } else {
        return false;
    }
}
//resolvers.js
Mutation: {
        addMovie: (_, { name, score }) => addMovie(name, score),
        deleteMovie: (_, { id }) => deleteMovie(id)
    }

#0.8 Wrapping a REST API with GraphQL

  • REST API로 받은 것을 GraphQL로 활용할 수 있다.
  • 오래된 서버를 가지고 있거나 GraphQL을 넣을 수 없을 때 사용하는 방법이다.
  • YTS API를 이용한다.
  • 이제 내 메모리가 아닌 api로 영화 정보를 가져온다.
  • yarn add node-fetch를 통해 fetch를 추가해준다.
  • "schema.graphql"과 "resolvers.js"파일의 movie를 api에서 받아온 값에 맞게 바꿔준다.
//schema.graphql
type Movie{
    id: Int!,
    title: String!
    rating: Float!
    summary: String!
    language: String!
    medium_cover_image: String!
}

type Query {
    movies(limit: Int, rating: Float): [Movie]!
}
//db.js
import fetch from "node-fetch";
const API_URL = "https://yts.mx/api/v2/list_movies.json?";

export const getMovies = (limit, rating) => {
    let REQUEST_API = API_URL;
    if (limit > 0) {
        REQUEST_API += `limit=${limit}`;
    }
    if (rating > 0) {
        REQUEST_API += `&minimum_rating=${rating}`;
    }
    return fetch(REQUEST_API)
        .then(res => res.json())
        .then(json => json.data.movies);
};
//resolvers.js
import { getMovies } from "./db";

const resolvers = {
    Query: {
        movies: (_, { limit, rating }) => getMovies(limit, rating)
    }
};

export default resolvers;

좋은 웹페이지 즐겨찾기