👩🏻‍💻 TIL

GraphQL

ji-hyun 2022. 1. 4. 15:41

GraphQL 서버는 스키마를 사용하여 사용가능한 데이터의 형태를 설명한다.

이 스키마의 계층 구조 정의 type 과 field 는 백엔드 데이터 저장소로부터 채워진다.

스키마는 또한 클라이언트가 실행할 수 있는 query와 mutation 을 정확히 지정한다.

 

 

 

 

이 포스트는 스키마의 기본 구성 요소와 GraphQL 서버용 구성 요소를 만드는 방법에 대해 설명한다.

 

 

 

 

 

GraphQL 사양은 인간이 읽을 수 있는 스키마 정의 언어인 SDL 을 정의한다.

이는 너가 너의 스키마를 정의하고 그것을 string 으로써 저장하는 것을 의미한다.

 

type Book {
	title: String
    	author: Author
}

type Author {
	name: String
    	books: [Book]
}

 

이런 형식..

 

 

 

 

# This Book type has two fields: title and author

type Book {
	title: String
        author: Author
}

 

각 필드는 지정된 유형의 데이터를 반환하며 필드의 반환 유형은 scalar, object, enum, union, interface 일 수 있다. 

모두 아래에 설명된다.

 

 

 

 

 

 

 

field null 허용 여부

 

type Author {
	name: String!  # Can't return null
    	books: [Book]
}

 

이러한 필드는 null 을 허용하지 않는다.

서버가 nullalbe 이 아닌 필드에 대해 반환을 시도하면 오류가 발생한다.

 

 

 

 

 

 

Null 허용 여부 및 목록

목록 필드를 사용하면 ! 가 두 위치의 조합에 나타날 수 있다.

 

type Author {
	books: [Book!]!  # This list can't be null AND its list *items* can't be null
 }

 

이 대괄호 안에 ! 가 나타나면 반환된 목록에 null 인 항목을 포함할 수 없다.

이 대괄호 외부에 ! 가 나타나면 목록 자체가 null 이 될 수 없다.

어떠한 경우에도, 목록 필드가 빈 목록으로 반환되는 것이 타당하다. (null 은 아님)

 

 

 

 

 

 

GraphQL 스키마의 모든 유형 정의는 다음 범주 중 하나에 속한다.

  • Scalar
  • Object
  • Input
  • Enum
  • Union
  • Interface

 

 

Scalar types

Int

Float

String

Boolean

ID(string 으로 직렬화되는) : 개체를 다시 가져오거나 캐시의 키로 자주 사용되는 고유 식별자이다. 문자열로 직렬화되지만 ID 는 사람이 읽을 수 있도록 고안된 것이 아니다.

 

  • Object type

GraphQL 스키마에서 정의하는 대부분의 유형은 객체 유형이다. 개체 유형에는 각각 고유한 유형이 있는 필드 컬렉션이 포함된다.

 

두 객체 유형은 이전의 예제 스키마의 경우와 같이 서로를 필드로 포함할 수 있다.

type Book {
  title: String
  author: Author
}

type Author {
  name: String
  books: [Book]
}

 

 

__typename 필드

스카마의 모든 객체 유형에는 자동으로 이름이 지정된 필드가 있다. __typename(너가 정의할 필요 없음).

__typename 필드는 객체 유형의 이름을 반환한다. string으로써 (예를 들어 Book 또는 Author)

 

 

GraphQL 클라이언트는 다양한 목적으로 한 객체의 __typename 을 사용하는데....

여러유형(예: 공용체= union 또는 인터페이스)을 반환할 수 있는 필드에서 반환된 유형을 결정하는 것과 같은 다양한 목적

Apollo Client 는 __typename 에 의존한다. 결과를 캐싱할 때....

그래서 그것은 자동으로 __typename 을 포함한다. 모든 쿼리의 모든 개체에

 

 

왜냐하면 __typename 은 항상 존재하기때문에 그것은 모든 GraphQL 서버에서도 유효한 쿼리이다.

 

query UniversalQuery {
	__typename
}

 

 

Query 유형

Query유형은 최상위 레벨의 모든 정의하는 특별한 객체 유형 진입 점을 클라이언트가 서버에 대해 실행하는 것이 쿼리.

Query유형 의 각 필드 는 다른 진입점의 이름과 반환 유형을 정의합니다. Query예제 스키마  유형은 다음과 유사할 수 있습니다.

 

 

type Query {
  books: [Book]
  authors: [Author]
}

 Query유형은 books및 2개의 필드를 정의합니다 authors. 각 필드는 해당 유형의 목록을 반환합니다.

REST 기반 API를 사용하면 책과 저자가 다른 끝점(예: /api/books및 /api/authors)에서 반환될 수 있습니다 . GraphQL의 유연성을 통해 클라이언트는 단일 요청으로 두 리소스를 모두 쿼리할 수 있습니다.

 

 

쿼리 구조화

클라이언트가 그래프에 대해 실행할 쿼리를 작성할 때 이러한 쿼리는 스키마에서 정의한 개체 유형의 모양과 일치합니다.

지금까지 우리의 예제 스키마를 기반으로, 클라이언트는 모든 책 제목의 목록을 모두 요청하는 다음 쿼리, 실행할 수  모든 저자 이름의 목록을 :

복사
query GetBooksAndAuthors {
  books {
    title
  }

  authors {
    name
  }
}

그러면 서버는 다음과 같이 쿼리 구조와 일치하는 결과로 쿼리에 응답합니다.

복사
{
  "data": {
    "books": [
      {
        "title": "City of Glass"
      },
      ...
    ],
    "authors": [
      {
        "name": "Paul Auster"
      },
      ...
    ]
  }
}

 

 

 

어떤 경우에는 이 두 개의 개별 목록을 가져오는 것이 유용할 수 있지만 클라이언트는 각 책의 저자가 결과에 포함된 단일 책 목록을 가져오는 것을 선호할 것입니다.

스키마의 Book유형에는 유형 author필드  있기 때문에 Author클라이언트는 대신 다음과 같이 쿼리를 구성할 수 있습니다.

복사
query GetBooks {
  books {
    title
    author {
      name
    }
  }
}

그리고 다시 한 번, 우리 서버는 쿼리 구조와 일치하는 결과로 응답합니다.

복사
{
  "data": {
    "books": [
      {
        "title": "City of Glass",
        "author": {
          "name": "Paul Auster"
        }
      },
      ...
    ]
  }
}

 

 

 

 

Mutation유형

Mutation유형에 대한 구조 및 목적이 유사 Query유형 . Query유형은 읽기 작업의 진입점을 정의 하는 반면 유형은 쓰기 작업의 Mutation진입점을 정의 합니다.

Mutation유형 의 각 필드 는 다른 진입점의 서명 및 반환 유형을 정의합니다. Mutation예제 스키마  유형은 다음과 유사할 수 있습니다.

복사
type Mutation {
  addBook(title: String, author: String): Book
}

 Mutation유형은 사용 가능한 단일 돌연변이 addBook. 돌연변이는 두 개의 인수( title및 author)를 허용 하고 새로 생성된 Book객체를 반환 합니다. 예상대로 이 Book개체는 스키마에서 정의한 구조를 따릅니다.

 

 

 

'👩🏻‍💻 TIL' 카테고리의 다른 글

2022_02_09_TIL  (0) 2022.02.10
기업협업에서 배운 것 정리  (0) 2022.01.17
쿼리 루트 타입, mutation  (0) 2022.01.01
ORM - prisma  (0) 2021.12.31
타입스크립트 자료유형 기초  (0) 2021.12.28