GraphQL의 스키마와 타입

신은지·2022년 8월 9일
0

GraphQL 쌈싸먹기

목록 보기
3/3

스키마 & 타입

객체 타입과 필드

스키마의 대부분은 객체 타입이다!
서비스에서 가져올 수 있는 객체의 종류와 그 객체의 필드를 표현한다.

  • GraphQL 스키마 언어 예시
    • Character : GraphQL 객체 타입
    • name, apperasIn : Character의 필드
    • String : 내장 스칼라 타입 -> 스칼라 객체로 해석
    • ! : 해당 필드가 non-null임을 표현
    • [Episode] : Episode 객체의 배열(array)임을 표현
    • length(unit: LengthUnit = METER) : 인자
      • 필수 혹은 옵셔널
      • 옵셔널일 경우, 디폴트 값 정의 가능

쿼리 타입 & 뮤테이션 타입

스키마에 대한 진입점 (Entry point) 정의
위 특이점 제외, 나머지는 객체 타입과 정확히 동일한 방식으로 작동!

// 쿼리 
query {
  hero {
    name
  }
  droid(id: "2000") {
    name
  }
}

// GraphQL 서비스
type Query {
  hero(episode: Episode): Character
  droid(id: ID!): Droid
}

스칼라 타입

하위 필드가 없는 쿼리의 끝

  • 위 쿼리에서 name, appearIn은 스칼라 타입이다.
    • Int : 부호가 있는 32비트 정수
    • Float : 부호가 있는 부동소수점 값
    • String: UTF-8 문자열
    • Boolean : true 혹은 false
    • ID : 고유 식별자

열거형 타입 (Enums)

특정 값들로 제한되는 특별한 종류의 스칼라

  • 이런 작업을 할 수 있어요!
    • 타입의 인자가 허용된 값 중 하나임을 검증
    • 필드가 항상 값의 열거형 집합 중 하나가 될 것임을 타입 시스템을 이용해 소통
  • 이렇게 생겼어요

리스트와 Non-Null

스키마의 다른 타입, 또는 쿼리 변수 선언에서 타입을 활용하면 값의 유효성 검사를 할 수 있는 타입 수정자 (type modifiers)를 적용할 수 있다.

  • !를 이용해 Non-Null로 표시 :: null값이 발생하면 GraphQL 실행 오류 발생 -> 유효성 검사 오류 반환
  • [] 를 이용해 리스트로 표시 :: 해당 타입의 배열을 반환. 배열이 필요한 인자에 대해 유효성 검사 작동

👾 요따구로 섞어 쓸 수도 있답니다~~

  • myField: [String!]
  • 리스트 자체는 null일 수 있지만, element는 null일 수 없다.
    • myField: null // valid
    • myField: [] // valid
    • myField: ['a', 'b'] // valid
    • myField: ['a', null, 'b'] // error

인터페이스

뭔가를 구현하기 위해 타입이 포함해야 하는 특정 필드들을 포함하는 추상 타입

// 인터페이스 
interface Character {
  id: ID!
  name: String!
  friends: [Character]
  appearsIn: [Episode]!
}

// 인터페이스를 구현한 타입
type Human implements Character {
  id: ID!
  name: String!
  friends: [Character]
  appearsIn: [Episode]!
  starships: [Starship]
  totalCredits: Int
}

type Droid implements Character {
  id: ID!
  name: String!
  friends: [Character]
  appearsIn: [Episode]!
  primaryFunction: String
}

유니온 타입

인터페이스와 유사하지만, 타입 간 공통 필드를 특정하지 않는다.

  • 유니온 타입의 멤버는 구체적인 객체여야 한다.
  • 인터페이스 혹은 유니온 타입에서 다른 유니온 타입을 사용할 수 없다.

  • 위 예시에서 SearchResult를 반환할 때마다 Human, Droid, Startship 를 얻을 수 있다.
  • SearchResult를 반환하는 필드를 쿼리하려면, 어떤 필드라도 쿼리할 수 있도록 조건부 프래그먼트를 활용해야 한다.
    {
      search(text: "an") {
        ... on Human {
          name
          height
        }
        ... on Droid {
          name
          primaryFunction
        }
        ... on Starship {
          name
          length
        }
      }
    }

입력 타입

뮤테이션에서 생성될 전체 객체를 전달할 때 사용!
일반 객체 타입과 동일하지만, type 대신 input을 사용한다.

  • 입력 객체 타입의 입력란은 입력 객체 타입을 참조할 수 있다.
  • 입력 및 출력 타입을 스키마에 혼합할 수는 없다.
  • 필드에 인자를 가질 수 없다.
/// input 객체
input ReviewInput {
  stars: Int!
  commentary: String
}

// 뮤테이션
mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {
  createReview(episode: $ep, review: $review) {
    stars
    commentary
  }
}

// variables
{
  "ep": "JEDI",
  "review": {
    "stars": 5,
    "commentary": "This is a great movie!"
  }
}

// 결과 
{
  "data": {
    "createReview": {
      "stars": 5,
      "commentary": "This is a great movie!"
    }
  }
}


레퍼런스

profile
호그와트 장학생

0개의 댓글