---
# System prepended metadata

title: GraphQL type
tags: [tech sharing]

---

# GraphQL type
###### tags: `tech sharing`

## 객체 타입

GraphQL 스키마의 가장 기본적인 구성요소는 객체 타입이다. 객체 타입은 서비스에서 가져올 수 있는 객체의 종류와 객체의 field를 나타낸다.

```graphql=
type Character {
  name: String!
  appearsIn: [Episode]!
}
```

## arguments

객체 타입의 모든 field는 0개 이상의 인자를 가질 수 있다. graphql의 인자에는 순서가 없다.

```graphql=
type Starship {
  id: ID!
  name: String!
  length(unit: LengthUnit = METER): Float
}
```

## Query type과 mutation type

스키마의 대부분의 타입은 일반 객체 타입이지만 스키마 내에는 `Query`, `Mutation`이라는 특수한 두 가지 타입이 있다. 이 두가지 타입은 GraphQL 쿼리의 진입점을 정의한다.

```graphql=
query {
  hero {
    name
  }
  droid(id: "2000") {
    name
  }
}
```

위와 같은 query가 있다면 graphQL의 Query type에 `hero`와 `droid`가 있어야한다.

```graphql=
type Query {
  hero(episode: Episode): Character
  droid(id: ID!): Droid
}
```


## 내장 자료형(스칼라 타입)
- ID : String이지만 고유 식별자 역할을 한다.
- String
- Int
- Float
- Boolean

> `!`가 붙으면 null을 반환할 수 없다.

## 열거 타입
```javascript=
// _enums.js

const { gql } = require('apollo-server')
const typeDefs = gql`
    enum Role {
        developer
        designer
        planner
    }
    enum NewOrUsed {
        new
        used
    }
`
module.exports = typeDefs

// inde.js
const enums = require('./typedefs-resolvers/_enums')
// ...
const typeDefs = [
    // ...
    enums,
    // ...
]
```

## 리스트 타입
```javascript=
const typeDefs = gql`
    // ...
    type EquipmentAdv {
        id: ID!
        used_by: Role!
        count: Int!
        use_rate: Float
        is_new: Boolean!,
        users: [String!]
    }
`
```

| 선언부	|users: null	|users: [ ]	|users: [..., null]|
| -------- | -------- | -------- |-------- |
| [String]|	✔|	✔|	✔|
| [String!]	|✔	|✔	|❌|
| [String]!	|❌	|✔|	✔|
| [String!]!|	❌	|✔	|❌|

## 유니언
타입 여럿을 한 배열에 반환하고자 할 때 사용한다.

```javascript=

const { gql } = require('apollo-server')
const dbWorks = require('../dbWorks.js')
const typeDefs = gql`
    union Given = Equipment | Supply
`
const resolvers = {
    Query: {
        givens: (parent, args) => {
            return [
                ...dbWorks.getEquipments(args),
                ...dbWorks.getSupplies(args)
            ]
        }
    },
    Given: {
        __resolveType(given, context, info) {
            if (given.used_by) {
                return 'Equipment'
            }
            if (given.team) {
                return 'Supply'
            }
            return null
        }
    }
}
module.exports = {
    typeDefs: typeDefs,
    resolvers: resolvers
}
```

## 인터페이스
유사한 객체 타입을 만들기 위한 공통 필드 타입

```javascript=
const { gql } = require('apollo-server')
const typeDefs = gql`
    interface Tool {
        id: ID!
        used_by: Role!
    }
`
const resolvers = {
    Tool: {
        __resolveType(tool, context, info) {
            if (tool.developed_by) {
                return 'Software'
            }
            if (tool.new_or_used) {
                return 'Equipment'
            }
            return null
        }
    }
}
module.exports = {
    typeDefs: typeDefs,
    resolvers: resolvers
}
```