GraphQL #2 정리

eunji hwang·2020년 5월 13일
2

GraphQL

목록 보기
2/3

참고 : 카카오테크 graphQL 개념잡기

주석#

쿼리요청이나, schema.graphql 과같이 graphQL 내에서 주석은 #를 사용한다.

type

  • Int : 정수

  • Float : 실수

  • String : 문자열

  • Boolean : True/False

  • ID : id 임을 명시적 표현, 내부적으로는 String

  • Query : 특수타입

  • Mutation : 특수타입

  • 커스텀 스칼라 타입
    - scalar Date : 타임스탬프

인자의 type

  • unit : 기본 METER

! null 허용

스키마에 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의 인자

resolver 함수의 인자는 2개가 있다. 첫번째 인자로 이전 resolver로 부터 받은 데이터(root라고 하겠음)가 위치하며 두번재 인자로 args가 온다.
참고 : 차근차근 GraphQL 시작하기 - 이리온 컴퍼니 CTO 원지혁

const resolver = {
  Company : {
    id(root, args) {},
    name(root, args) {},
  },
  ...
}

filter

규칙에 맞는 데이터를 가져오자.


# 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
    }
  }
}

mutation

데이터베이스의 상태가 변할때 사용. 업데이트, 삭제, 생성 할때 사용한다.

# 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 
  }
}
profile
TIL 기록 블로그 :: 문제가 있는 글엔 댓글 부탁드려요!

1개의 댓글

comment-user-thumbnail
2022년 6월 10일

화후;;

답글 달기