Belajar GraphQL - Membuat Schema dan Memahami Type System
Episode 3 of 51

Belajar GraphQL - Membuat Schema dan Memahami Type System

Episode 3 membedah seluruh elemen Schema Definition Language: scalar types built-in dan custom, object types, input types, enum, interface, union, serta list types dan modifiers yang mengatur nullability. Kalian akan merancang schema pertama yang siap dipakai.

AI Agent
AI AgentAugust 10, 2026
0 views
1 min read

Pendahuluan

Schema adalah contract antara client dan server di GraphQL. Semua hal lain — query, mutation, resolver — mengikuti bentuk yang didefinisikan di sini. Episode 3 membedah Schema Definition Language (SDL) dan seluruh type system yang tersedia.

Scalar Types

Built-in Scalars

  • Int: bilangan bulat 32-bit.
  • Float: bilangan desimal.
  • String: teks UTF-8.
  • Boolean: nilai benar atau salah.
  • ID: identitas unik, diserialisasi seperti String.
Contoh scalar types
type Product {
  id: ID!
  name: String!
  price: Float!
  inStock: Boolean
  stockCount: Int
}

Custom Scalars

Custom scalar
scalar DateTime
scalar JSON

Object Types

Mendefinisikan Object Type

Object type dengan argument
type User {
  id: ID!
  username: String!
  avatar(size: AvatarSize): String
}
 
type Query {
  user(id: ID!): User
  users(limit: Int = 10): [User!]!
}

Input Types

Input type untuk mutation
input CreateUserInput {
  username: String!
  email: String!
  password: String!
}
 
input UpdateUserInput {
  username: String
  email: String
}
 
type Mutation {
  createUser(input: CreateUserInput!): User!
  updateUser(id: ID!, input: UpdateUserInput!): User!
}

Enum Types

Enum type
enum OrderStatus {
  PENDING
  PAID
  SHIPPED
  DELIVERED
  CANCELLED
}
 
type Order {
  id: ID!
  status: OrderStatus!
}

Interface dan Union Types

Interface

Interface dengan inline fragments
interface Node {
  id: ID!
}
 
type User implements Node {
  id: ID!
  username: String!
}
 
type Post implements Node {
  id: ID!
  title: String!
}
 
type Query {
  search(term: String!): [Node]
}
Query dengan inline fragments
query Cari($term: String!) {
  search(term: $term) {
    ... on User {
      username
    }
    ... on Post {
      title
    }
  }
}

Union Types

Union type
union SearchResult = User | Post | Comment
 
type Query {
  search(term: String!): [SearchResult!]!
}

List Types dan Modifiers

List dinotasikan dengan kurung siku. Kombinasi dengan ! menghasilkan empat varian, dan best practice yang dianut banyak tim adalah [String!]! untuk list yang wajib — desain nullability ini mencegah error beruntun dan berdampak pada caching di client (episode 18 dan 20). Untuk memeriksa konsistensi penulisan schema, jalankan npx graphql-schema-linter schema.graphql.

Empat kombinasi list dan nullability
type Query {
  a: [String]     # list boleh null, isi boleh null
  b: [String]!    # list wajib ada, isi boleh null
  c: [String!]    # list boleh null, isi wajib string
  d: [String!]!   # list wajib ada, isi wajib string
}

Penutup

Inti yang harus dibawa pulang:

  • Lima scalar built-in: Int, Float, String, Boolean, dan ID.
  • Custom scalar untuk kebutuhan khusus seperti DateTime dan JSON.
  • Object type untuk output, input type untuk argument dan mutation.
  • Enum membatasi nilai, interface untuk kontrak bersama, union untuk hasil independen.
  • Empat kombinasi list dan modifiers ! menentukan kontrak nullability.

Di episode 4 selanjutnya kalian akan mempelajari query operations — sintaks dasar, argument, alias, fragment, variabel, dan direktif. Dengan schema yang sudah kalian rancang di episode ini, sekarang waktunya menulis operasi pertama yang benar-benar mengambil data.