GraphQL에서는 두 가지 유형의 타입을 지원합니다: Scalar Type과 Object Type입니다.
Scalar Type은 단일 값으로 표현됩니다. 예를 들어, 문자열, 숫자, Boolean 등이 있습니다. GraphQL에서 제공하는 Scalar Type은 아래와 같습니다.
Int
: 32비트 정수를 나타냅니다.Float
: 부동 소수점 수를 나타냅니다.String
: UTF-8 문자열을 나타냅니다.Boolean
: true 또는 false 값을 나타냅니다.ID
: 고유 식별자를 나타냅니다. (자세한 내용은 뒤에서 다룰 예정입니다.)Object Type은 이름, 필드 및 연결된 다른 객체 타입에 대한 설명을 포함하는 복합 타입입니다. 예를 들어, 책이라는 Object Type이 있을 경우, 책의 제목, 저자 및 출판사와 같은 정보를 포함할 수 있습니다.
아래는 Scalar Type과 Object Type을 이용한 typeDefs 예시입니다. 이 예시에서는 책 정보를 다루는 Book Object Type을 정의하고, 각 필드의 타입을 지정하기 위해 Scalar Type을 사용합니다.
import { gql } from 'apollo-server';
const typeDefs = gql`
type Book {
id: ID!
title: String!
author: String!
price: Float!
isAvailable: Boolean!
}
type Query {
books: [Book!]!
book(id: ID!): Book
}
type Mutation {
addBook(title: String!, author: String!, price: Float!, isAvailable: Boolean!): Book!
deleteBook(id: ID!): Boolean!
updateBook(id: ID!, title: String!, author: String!, price: Float!, isAvailable: Boolean!): Book!
}
`;
위 예시에서는 Book Object Type에 id
필드가 추가되었습니다. ID
Scalar Type은 GraphQL에서 특별한 용도로 사용됩니다. 일반적으로 데이터베이스의 고유 식별자를 나타내기 위해 사용됩니다. 이는 이전 답변에서 언급했던 것처럼, 일반적으로 문자열이지만, GraphQL에서는 ID
Scalar Type으로 표현합니다.
또한 위 예시에서는 Query와 Mutation이라는 두 가지 Root Type을 정의하고 있습니다. Query는 데이터를 읽기 위한 타입이고, Mutation은 데이터를 변경하기 위한 타입입니다. 예를 들어, addBook
Mutation은 새로운 책을 추가하고 추가된 책을 반환합니다. 이때 반환 값의 타입은 Book입니다.
GraphQL에서 argument란, query나 mutation을 실행할 때 필요한 값들을 의미합니다. Non-scalar type을 이용하여 새로운 type을 정의할 때, 이 type이 갖는 필드 중 일부에는 argument를 받을 수 있는 필드가 존재할 수 있습니다. 이를테면, 책(Book) type에 대한 예시를 들어보겠습니다. Book type에는 title, author, description 등 여러 필드들이 존재할 수 있습니다. 그 중에서도 예를 들어 title 필드는 argument를 받을 수 있습니다. 이 경우, title 필드는 특정 문자열을 인자로 받아 그 문자열을 가진 책만을 반환하도록 하게 됩니다.
아래 코드에서는 Book type을 정의하고, title 필드가 받을 수 있는 argument로는 contains와 startsWith가 있다고 가정합니다.
import { gql } from 'apollo-server';
const typeDefs = gql`
type Book {
id: ID!
title(contains: String, startsWith: String): String!
author: String!
description: String
}
type Query {
books: [Book!]!
}
`;
export default typeDefs;
GraphQL에서 non-null 타입은 !
기호를 이용하여 정의합니다. 이것은 해당 필드가 항상 null이 아니어야 함을 의미합니다. 만약 해당 필드가 null인 경우, GraphQL은 오류를 반환합니다.
아래는 non-null 타입을 사용하는 예시 코드입니다.
import { gql } from 'apollo-server';
const typeDefs = gql`
type Book {
id: ID!
title: String!
author: String!
publishedDate: String!
isbn: String!
}
type Query {
books: [Book!]!
book(id: ID!): Book!
}
type Mutation {
createBook(
title: String!
author: String!
publishedDate: String!
isbn: String!
): Book!
updateBook(
id: ID!
title: String
author: String
publishedDate: String
isbn: String
): Book!
deleteBook(id: ID!): Boolean!
}
`;
export default typeDefs;
위 코드에서는 Book
타입의 필드 중에서 id
, title
, author
, publishedDate
는 non-null 타입으로 정의되어 있습니다. 또한 createBook
mutation과 book
query의 반환값인 Book
역시 non-null 타입으로 정의되어 있습니다.
이렇게 non-null 타입을 사용하면, API를 더욱 강력하고 안정적으로 만들 수 있습니다. 만약 필수 필드를 누락하거나 null 값을 반환하는 경우, GraphQL이 오류를 반환하여 개발자가 문제를 더욱 쉽게 파악할 수 있습니다.