Computer Science/GraphQL

GraphQL 핵심 요소

nayoon030303 2021. 7. 24. 02:41

📕📗GraphQL의 핵심 요소📙📒

 

GraphQL은 서버에 query, mutation 등 사용자가 원하는 Schema를 직접 구축한 다음, 클라이언트로부터 해당 요청을 받을 시, Resolver를 통해 데이터를 반환하는 구조입니다. 

 

1. Query

query란 데이터베이스에 정보를 요청하는 것입니다. 

type Query{
	(쿼리명):([)(반환 타입){]}(!)
]

의 형태로 선언합니다. 

 

옵션

  • [ ]을 붙인 경우 배열 타입으로 반환
  • 해당 요청이 들어온 경우 필수로 해당 타입을 반환해야 합니다.

아래는 Movie라는 반환 type을 생성한 다음 Query를 작성한 것입니다. 

#반환 타입 생성
type Movie{
    id:Int!
    name:String!
    score:Int!

}

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

쿼리 실행 후 결과

 

2. Mutation

Mutation이란 플랫폼에서 서버 측 데이터를 수정할 때 사용됩니다. 

CRUD(Create Read Update Delete)에서 CUD를 담당합니다. Mutation에서는 데이터 생성, 업데이트, 삭제가 가능합니다. Query 필드는 병렬로 실행되지만 Mutation 필드는 하나씩 차례대로 실행됩니다.

type Mutation{
	(이름)(인자):([)(반환 타입){]}(!)
]

의 형태로 선언합니다.

 

아래는 Movie를 추가, 삭제하는 Mutation을 작성했습니다.

#반환 타입 생성
type Movie{
    id:Int!
    name:String!
    score:Int!

}

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

#Mutation 생성
type Mutation{
    addMovie(name: String!,score: Int!):Movie!
    deleteMovie(id:Int!):Boolean
}

 

3. Resolver

Resolver란 클라이언트로부터 요청된 Query 또는 Mutation에 대해 반환할 결과를 생성하는 로직으로, GraphQL 서버가 Resolver를 찾아 Query와 Mutation에 해당하는 함수를 실행합니다. 

또 Resolver를 통해 데이터베이스, 메모리, 다른 API 등과 연결하여 프로그래밍을 할 수도 있습니다. 실행 함수의 첫 번째 인자로는 현재 Object가 넘어오고, 두 번째 요청부터 요청된 인자가 객체의 형태로 전달되기 때문에(_,{arg1, arg2})의 형태로 인자를 넘겨받아 사용합니다. 

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

Query는 movie데이터들을 반환하는 쿼리, 입력한 id에 맞는 movie를 반환하는 쿼리를 정의했습니다. 

Mutation은 name, score를 입력받아 추가하는 mutation, id를 받아서 삭제하는 mutation을 정의했습니다. 

 

4. Schema

Schema란 GraphQL에서 쿼리 할 수 있는 데이터를 설명하는 것입니다. GraphQL 쿼리의 모양은 결과와 거의 일치하기 때문에 서버에 대해 잘 모르더라도 반환되는 쿼리가 무엇인지 예측할 수 있습니다. 그러나 요청할 수 있는 데이터에 대한 정확한 설명이 있으면 유용합니다. GraphQL 서비스는 모든 언어로 작성할 수 있습니다. JavaScript와 같은 특정 프로그래밍 언어 구문에 의존할 수 없기 때문에 GraphQL 스키마에 대해 이야기할 때 자체적인 간단한 언어를 정의합니다. 쿼리 언어와 유사한 "GraphQL 스키마 언어"를 사용하여 언어에 구애받지 않는 방식으로 GraphQL 스키마에 대해 설명할 수 있습니다.

type Movie{
    id:Int!
    name:String!
    score:Int!

}

위에 Query와 Mutation에 있었던 Movie가 Schema입니다.

 

 

GraphQL을 활용할 수 있게 도와주는 라이브러리 

GraphQL은 쿼리 언어입니다. 이것 만으로는 할 수 있는 것이 없습니다. GraphQL을 실제 구체적으로 활용할 수 있도록 해주는 라이브러리들이 있습니다. 대표적인 GraphQL 라이브러리는 Relay, Apollo GraphQL이 있습니다. 

하지만 현재 Relay는 사용하기 어렵게 디자인되어있다고 합니다. 저도 개인적으로 Apollo를 사용합니다.