이번 포스팅에서는 GraphQL의 query language인 SDL에 대해 알아보려고 한다.
GraphQL의 SDL은 간단하고 직관적이다. 그럼 실제 예시를 하나씩 보면서 확인하도록 하자.
type Person {
name: String!
age: Int!
}
위의 예시는 Person 타입을 표현하는 SDL이다. Person 타입에는 String 타입을 가진 name 필드와 Int 타입을 가진 age 필드가 존재한다.
(그리고 각 필드 뒤에 '!' 는 required 표시한다.)
type Post {
title: String!
author: Person!
}
그리고 다음은 Post 타입을 표현한다. Person 타입과 비슷하긴 하지만 조금 다른 점은 내부 필드의 타입이 Custom하게 만든 Person 이라는 것이다.
즉, 타입으로 필드의 타입으로 기본 타입 뿐만 아니라 Custom하게 만든 타입 또한 사용 할 수 가 있다.
(객체지향 언어의 클래스 또는 구조체로 타입 선언하는 것과 비슷하다.)
또 Custom한 타입을 아래와 같이 리스트로도 사용할 수 있다. ('[ ]' 은 리스트를 표현한다.)
type Person {
name: String!
age: Int!
posts: [Post!]!
}
이렇듯 GraphQL의 SDL은 직관적으로 만들어진 언어이다. 그런데 이렇게 만든 타입들을 가지고 무엇을 할 것인가? GraphQL의 역할인 CRUD는 어떻게 하는 것인가? 대략적으로 SDL의 기본(?)은 알았으니 CRUD를 만들어보면서 조금씩 더 이해해 보도록 하자.
Query | Result |
{ allPersons { name } } |
{ "data": { "allPersons": [ { "name": "Johnny" } ] } } |
위의 테이블은 Query를 하여 얻은 결과 값이다. 결과 값이 리스트로 저정되어 있는 각 Person의 이름이 출력되는 것을 확인 할 수 있다.
그런데 무조건 allPerson을 하면 얻을 수 있는 것은 아니다. 당연히 스키마로써 미리 명시가 되어 있어야 한다.
type Query { allPersons( first: Int last: Int ): [Person!]! } |
위의 테이블이 바로 Query를 위해 명시된 스키마이다. (타입이 Query로 되어 있다.)
일반적인 것과 큰 차이는 없지만 데이터를 가져오기 위한 Query Set을 구성하기 위해 함수(기타 언어와 같이)를 구성하는 방식과 비슷하다.
allPersons는 살펴보면 allPersons() : [Persons!]! 로 클라이언트가 allPerson을 Query하면 Person 타입이 리스트로 나타난다.
(그런데 Query 요청시 name만 넣었으므로 결과값도 name만 나온다.)
Query | Result |
{ allPersons(last : 1) { name } } | { "data": { "allPersons": [ { "name": "Johnny" } ] } } |
그리고 앞서 함수와 같다고 한것은 allPersons에 인자 first, last를 넣을 수도 있다는 점이다.
위의 테이블에서 확인 할 수 있듯이 last에 1을 넣어 데이터베이스에 저장되어 있는 모든 Person을 돌려 받는 것이 아닌 마지막에 저장된 Person만 가져 올 수 있다.
이제까지는 CRUD에서 단순히 데이터를 Read라는 부분만 알아보았다. 그렇다면 나머지 데이터를 직접 Write하는 작업인 CUD(Create, Update, Delete)에 대해 알아보자.
Create |
Result |
mutation { createPerson(name: "Bob", age: 36) { name age } } |
{ "data": { "createPerson": { "name": "Bob", "age": 36 } } } |
먼저 위의 테이블은 Create 이다. 그런데 Query랑 다른 점을 살펴보자면 가장 먼저 눈의 띄는 부분이 mutation이다. mutation은 데이터를 조작할 때 사용하는 키워드로 사실 query도 마찬가지 이지만 생략이 가능하고 mutation은 그렇지 않다.
다음으로 함수와 같이 createPerson에 name과 age를 넣고 리턴 필드에 name과 age를 넣어 생성된 결과를 리턴받을 때 name과 age가 포함된다.
(아래는 CreatePerson의 스키마이다.)
type Mutation { createPerson( age: Int! name: String! postsIds: [ID!] posts: [PersonpostsPost!] ): Person } |
지금까지 간단히 GraphQL의 SDL을 알아보았다. 아시다시피 해당 포스팅에서 언급한 부분은 SDL의 부분에 불과하다.
GraphQL의 SDL은 다양한 기능 및 타입들이 존재하니 https://graphql.org/ 의 공식 페이지에 들어가서 어떤 것이 확인해보면 더 많은 것을 알 수 있을 것이다.
참조
'IT > Web' 카테고리의 다른 글
[GraphQL] Architecture Pattern (0) | 2019.03.16 |
---|---|
[GraphQL] Overview (0) | 2019.03.15 |
Golang Web Framework 비교 (0) | 2018.08.06 |
댓글