GraphQL 핵심 요소
📕📗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를 사용합니다.