GET
에 해당)
- Create: 새로운 데이터 생성
- Update: 기존의 데이터 수정
- Delete: 기존의 데이터 삭제
Query
또는 Mutation
과 달리, 발행/구독(pub/sub) 모델을 따름.1) 쿼리(요청)와 결과는 정확하게 같은 모양이다.
✅ hero의 name을 요청하는 쿼리 ✅
{ hero { name } }
👉🏽 hero의 name을 요청한 쿼리의 결과
{ "data": { "hero": { "name": "R2-D2" } } }
✅ hero의 name과 hero의 friends의 name을 요청한 쿼리 ✅
{ hero { name # 이런 식으로 GraphQL 내에서 주석도 작성할 수 있습니다. friends { name } } }
👉🏽 hero의 name과 hero의 friends의 name을 요청한 쿼리의 결과
{ "data": { "hero": { "name": "R2-D2", "friends": [ { "name": "Luke Skywalker" }, { "name": "Han Solo" }, { "name": "Leia Organa" } ] } } }
{ hero { name } }
hero
,name
은 필드
{ human(id: "1000") { name height } }
- id가 1000인 human에 대해서만 쿼리(요청)
❌ 잘못된 예 ❌
{ hero(episode: EMPIRE) { name } hero(episode: JEDI) { name } }
- 이런 식으로 필드를 중복해 쿼리할 수 없다.
✅ 별명을 사용한 쿼리 ✅
{ empireHero: hero(episode: EMPIRE) { name } jediHero: hero(episode: JEDI) { name }
👉🏽 별명을 사용한 쿼리의 결과
{ "data": { "empireHero": { // 필드 대신 별명으로 결과를 받아볼 수 있다. "name": "Luke Skywalker" }, "jediHero": { "name": "R2-D2" } } }
query
를 붙여준다. 참고: 오퍼레이션 타입(Operation type)
query
외에도mutation
,subscription
,describes
등이 있다.
query HeroNameAndFriends { hero { name friends { name } } }
- 오퍼레이션 타입 :
query
- 오퍼레이션 네임 :
HeroNameAndFriends
변수 사용법
- 사용할 변수들을 오퍼레이션 네임 옆에
$변수 이름 : 타입
형태로 정의한다.- 인수의 값으로
$변수 이름
을 넣어준다.$변수 이름 : 타입
에서 타입 뒤에!
가 붙는다면 해당 변수는 반드시 해당 타입이어야 한다는 뜻이다.
query HeroNameAndFriends($episode: Episode) { hero(episode: $episode) { name friends { name } } }
mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) { createReview(episode: $ep, review: $review) { stars commentary } }
타입(Type) 예시
type Character { name: String! appearsIn: [Episode!]! }
Character
는 GraphQL의 객체 타입. (앱의 데이터를 상징)name
,appearsIn
은Character
타입의 필드(field).String
은 GraphQL에 내장된 스칼라 타입(기본 타입)!
가 붙는다면 해당 필드는 nullable하지 않고 반드시 값이 들어온다는 의미. (해당 필드에 대한 값을 반드시 받을 수 있을 것이란 예상을 할 수 있다.[ ]
는 배열을 의미다. 배열에도!
가 붙을 수 있다. (이 경우 항상 0개 이상의 요소를 포함한 배열을 기대할 수 있다)
Query
, Mutation
, Subscription
)에 따른 로직(함수)을 작성const db = require("./../db") const resolvers = { Query: { // **Query :** 저장된 데이터 가져오기 (REST 에 GET 과 비슷합니다.) getUser: async (_, { email, pw }) => { db.findOne({ where: { email, pw } }) ... // 실제 디비에서 데이터를 가져오는 로직을 작성합니다. ... } }, Mutation: { // **Mutation :** 저장된 데이터 수정하기 ( Create , Update , Delete ) createUser: async (_, { email, pw, name }) => { ... } } Subscription: { // **Subscription :** 실시간 업데이트 newUser: async () => { ... } } };