참고 : 카카오테크 graphQL 개념잡기
#
쿼리요청이나, schema.graphql 과같이 graphQL 내에서 주석은 #
를 사용한다.
Int : 정수
Float : 실수
String : 문자열
Boolean : True/False
ID : id 임을 명시적 표현, 내부적으로는 String
Query : 특수타입
Mutation : 특수타입
커스텀 스칼라 타입
- scalar Date
: 타임스탬프
스키마에 type를 정의할때 !를 함께 쓸때가 있다. !는 필수사항을 말한다. null로 받을수 없다.
type Query {
case1: String! # case1은 null 허용 안됨
case2: [String!] # case2는 배열, 배열속 인덱스 값은 null 허용 안됨
case3: [String]! # case3는 배열, case3의 값은 null 허용 안됨, 배열 각 값은 null이여도 상관없음
case4: [String!]! # 배열도, case4도 모두 null허용안됨
}
null이 들어올 경우 아래와 같은 에러가 출력된다.
{
'error' : [
{
'message' : 'cannot return null for non-nullable field 에러난곳.스키마명",
}
]
}
스키마를 작성할때people : [User]!
와 같이 사용하는 것을 볼수 있는데, 여기서 대괄호 []
는 리스트(배열)로 값을 담는 다는 것을 뜻한다.
{
"data": {
"people": [
{
"id" :1,
"name": "hwang",
"age": 22,
"gender": "female"
},
{
"id" :2,
"name": "kim",
"age": 33,
"gender": "male"
},
]
}
}
resolver 함수의 인자는 2개가 있다. 첫번째 인자로 이전 resolver로 부터 받은 데이터(root라고 하겠음)가 위치하며 두번재 인자로 args가 온다.
참고 : 차근차근 GraphQL 시작하기 - 이리온 컴퍼니 CTO 원지혁
const resolver = {
Company : {
id(root, args) {},
name(root, args) {},
},
...
}
규칙에 맞는 데이터를 가져오자.
# schema.graphql
type User {
id : Int!
name : String!
}
type Query {
people : [User]!
User(id:Int!): User!
}
// 목데이터 DB
export const people = [
{...},
{...},
{...},
]
export getById = (id) => {
const filteredPeople = people.filter( (person) => person.id === id )
return filteredPeople[0]; // id는 PK, 1개만 존재하니 배열받은 값의 0번 인덱스 반환
}
// resolvers.js
import { people, getById } from './db'
const resolvers = {
Query : {
people : () => people,
// 인자로 이전 resolver에게 받은 값=root, args 중 id
User : (root, {id}) => getById(id)
}
}
export default resolvers
// 최종 받은 파일
{
"data": {
"user": {
"id": 1,
"name" : "hwang",
"age" : 22
}
}
}
데이터베이스의 상태가 변할때 사용. 업데이트, 삭제, 생성 할때 사용한다.
# schema.graphql
type Mutation {
addMovie(name:String!, score:Int!) : Movie!
}
// 목데이터 db.js
export let movies = [
{...},
{...},
...
]
// DB 추가 로직을 작성한다.
export const addMovie = (name, score) => {
const newMovie = {
id : `${movies.length+1}`,
name,
score,
}
movies.push(newMovie);
return newMovie;
}
// resolvers.js
import {getMovies, getByID, addMovie, deleteMovie} from './db'
const resolvers = {
Query : {
...
},
Mutation : {
addMovie : (root, {args1,args2...}) => return
}
}
화후;;