📝Mutation
/** ─── 호출 ───**/
mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {
createReview(episode: $ep, review: $review) {
stars
commentary
}
}
/** ─── 호출 변수 ───**/
{
"ep": "JEDI",
"review": {
"stars": 5,
"commentary": "This is a great movie!"
}
}
/** ─── 응답 ───**/
{
"data": {
"createReview": {
"stars": 5,
"commentary": "This is a great movie!"
}
}
}
Mutation의 경우는 데이터의 조회를 제외한 모든 것에 사용됩니다 특히 데이터 생성, 삭제, 수정에 해당하죠
쿼리 필드는 병렬로 실행되는 반면 변형 필드는 순차적으로 실행됩니다
한 요청에 두 개의 Mutation을 보내면 두번째 Mutation이 시작되기 전에 첫 번째 Mutation이 완료되어 우리 자신과의 경쟁 조건이 발생하지 않도록 보장합니다
쿼리와 마찬가지로 변형 필드가 객체 유형을 반환하는 경우 중첩 필드를 요청할 수 있습니다
이는 업데이트 후 객체의 새 상태를 가져오는 데 유용합니다
📝Query
HTTP에서 Get 방식 통신에 해당하는 걸로 데이터를 조회할 때 사용한다
기본 예제 1
/** ─── 호출 ───**/
Query Hero {
hero {
name
}
}
// 생략
{
hero {
name
}
}
/** ─── 응답 ───**/
{
"data": {
"hero": {
"name": "R2-D2"
}
}
}
단일 작업 및 복잡하지 않는 단일 요청일 때 query 키워드랑 쿼리 이름을 생략할 수 있지만 생략해서 혼돈만 초래할 뿐 그냥 적어주자
기본 예제 2
/** ─── 호출 ───**/
Query Hero {
hero {
name
# Queries can have comments!
friends {
name
}
}
}
/** ─── 응답 ───**/
{
"data": {
"hero": {
"name": "R2-D2",
"friends": [
{
"name": "Luke Skywalker"
},
{
"name": "Han Solo"
},
{
"name": "Leia Organa"
}
]
}
}
}
📝Query 파라미터
파라미터 사용 예제 1
# Human 타입 정의
type Human {
id: ID!
name: String!
height: Float
}
# 쿼리 타입 정의
type Query {
human(id: ID!): Human
}
/** ─── 호출 ───**/
{
human(id: "1000") {
name
height
}
}
/** ─── 응답 ───**/
{
"data": {
"human": {
"name": "Luke Skywalker",
"height": 1.72
}
}
}
정의한 쿼리 타입 토대로 파라미터를 넣어서 요청할 수 있다
파라미터 사용 예제 2
enum Unit {
METER
FOOT
}
# Human 타입 정의
type Human {
id: ID!
name: String!
height(unit: Unit = METER): Float
}
/** ─── 호출 ───**/
{
human(id: "1000") {
name
height(unit: FOOT)
}
}
/** ─── 응답 ───**/
{
"data": {
"human": {
"name": "Luke Skywalker",
"height": 5.6430448
}
}
}
📝Query 별칭
별칭 예제
/** ─── 호출 ───**/
{
empireHero: hero(episode: EMPIRE) {
name
}
jediHero: hero(episode: JEDI) {
name
}
}
/** ─── 응답 ───**/
{
"data": {
"empireHero": {
"name": "Luke Skywalker"
},
"jediHero": {
"name": "R2-D2"
}
}
}
두 필드는 hero로 충돌이 될 예정이였지만 alias로 인해 문제 없이 진행되게 했다
📝Query Fragment
fragment 예제
fragment comparisonFields on Character {
name
appearsIn
friends {
name
}
}
/** ─── 호출 ───**/
{
leftComparison: hero(episode: EMPIRE) {
...comparisonFields
}
rightComparison: hero(episode: JEDI) {
...comparisonFields
}
}
/** ─── 응답 ───**/
{
"data": {
"leftComparison": {
"name": "Luke Skywalker",
"appearsIn": [
"NEWHOPE",
"EMPIRE",
"JEDI"
],
"friends": [
{
"name": "Han Solo"
},
{
"name": "Leia Organa"
},
{
"name": "C-3PO"
},
{
"name": "R2-D2"
}
]
},
"rightComparison": {
"name": "R2-D2",
"appearsIn": [
"NEWHOPE",
"EMPIRE",
"JEDI"
],
"friends": [
{
"name": "Luke Skywalker"
},
{
"name": "Han Solo"
},
{
"name": "Leia Organa"
}
]
}
}
}
fragment를 이용해 재사용할 수 있게 하고 반복적인 코드를 줄일 수 있습니다
on Type명으로 꼭 타입을 지정해줘야합니다 여기에서는 Character라는 타입입니다
📝Query 동적 파라미터
동적 파라미터 예제 1
/** ─── 호출 ───**/
query HeroNameAndFriends($episode: Episode) {
hero(episode: $episode) {
name
friends {
name
}
}
}
/** ─── 호출 변수 ───**/
{
"episode": "JEDI"
}
/** ─── 응답 ───**/
{
"data": {
"hero": {
"name": "R2-D2",
"friends": [
{
"name": "Luke Skywalker"
},
{
"name": "Han Solo"
},
{
"name": "Leia Organa"
}
]
}
}
}
변수를 이용해 동적으로 데이터를 받을 수 있다
동적 파라미터 예제 2
query HeroNameAndFriends($episode: Episode = JEDI) {
hero(episode: $episode) {
name
friends {
name
}
}
}
기본값 설정도 가능함
📝지시문
/** ─── 호출 ───**/
query Hero($episode: Episode, $withFriends: Boolean!) {
hero(episode: $episode) {
name
friends @include(if: $withFriends) {
name
}
}
}
/** ─── 호출 변수 ───**/
{
"episode": "JEDI",
"withFriends": false
}
/** ─── 응답─**/
{
"data": {
"hero": {
"name": "R2-D2"
}
}
}
지시문으로 필드를 동적으로 받을 수 있다
- @include(if: Boolean)
- 인수가 다음인 경우에만 결과에 이 필드를 포함합니다
- @skip(if: Boolean)