기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
GraphQL은 다양한 유형을 지원합니다. 이전 섹션에서 보았듯이 유형은 데이터의 형태나 동작을 정의합니다. 유형은 GraphQL 스키마의 기본 구성 요소입니다.
유형은 입력과 출력으로 분류할 수 있습니다. 입력은 특수 객체 유형(Query
, Mutation
등)에 대한 인수로 전달될 수 있는 유형인 반면, 출력 유형은 데이터를 저장하고 반환하는 데만 사용됩니다. 유형 및 분류 목록은 아래와 같습니다.
-
객체: 객체에는 엔터티를 설명하는 필드가 있습니다. 예를 들어 객체는
authorName
,publishingYear
와 같이 특성을 설명하는 필드가 있는book
등이 될 수 있습니다. 이러한 유형은 엄밀히 말하면 출력 유형입니다. -
스칼라: int, 문자열 등과 같은 기본 유형입니다. 일반적으로 필드에 할당됩니다.
authorName
필드를 예로 들면 'John Smith'와 같은 이름을 저장하는String
스칼라에 할당할 수 있습니다. 스칼라는 입력 유형과 출력 유형이 모두 될 수 있습니다. -
입력: 입력을 사용하면 필드 그룹을 인수로 전달할 수 있습니다. 객체와 구조가 매우 비슷하지만, 특수 객체에 인수로 전달할 수 있습니다. 입력을 사용하면 범위에 스칼라, 열거형 및 기타 입력을 정의할 수 있습니다. 입력은 입력 유형만 가능합니다.
-
특수 객체: 특수 객체는 상태 변경 작업을 수행하며 서비스의 까다로운 작업 대부분을 수행합니다. 쿼리, 변형, 구독이라는 세 가지 특수 객체 유형이 있습니다. 일반적으로 쿼리는 데이터를 가져오고, 변형은 데이터를 조작하며, 구독은 지속적인 통신을 위해 클라이언트와 서버 간의 양방향 연결을 열고 유지합니다. 특수 객체는 기능으로 볼 때 입력도 출력도 아닙니다.
-
열거형: 열거형은 미리 정의된 유효 값 목록입니다. 열거형을 호출하는 경우 범위에 정의된 값만 열거형 값이 될 수 있습니다. 예를 들어 교통 신호 목록을 나타내는
trafficLights
라는 열거형이 있는 경우redLight
및greenLight
와 같은 값을 가질 수 있지만purpleLight
값은 가질 수 없습니다. 실제 신호등에는 신호가 너무 많기 때문에 열거형을 사용하여 신호를 정의하고trafficLight
를 참조할 때 이러한 열거형만 유효 값이 되도록 할 수 있습니다. 열거형은 입력 유형과 출력 유형이 모두 될 수 있습니다. -
결합/인터페이스: 결합을 사용하면 클라이언트가 요청한 데이터에 따라 요청에서 하나 이상의 항목을 반환할 수 있습니다. 예를 들어
title
필드가 포함된Book
유형과name
필드가 포함된Author
유형이 있는 경우 두 유형 간에 결합을 생성할 수 있습니다. 클라이언트가 데이터베이스에서 'Julius Caesar'라는 문구를 쿼리하려는 경우 결합은Book
title
에서 Julius Caesar(윌리엄 셰익스피어의 희곡)를 반환하고Author
name
에서 Julius Caesar(Commentarii de Bello Gallico의 저자)를 반환할 수 있습니다. 결합은 출력 유형만 될 수 있습니다.인터페이스는 객체가 구현해야 하는 필드 집합으로, 인터페이스에 정의된 필드를 구현해야 하는 Java와 같은 프로그래밍 언어의 인터페이스와 약간 유사합니다. 예를 들어
title
필드를 포함하는Book
이라는 인터페이스를 만들었다고 가정해 보겠습니다. 이후Book
을 구현한Novel
이라는 유형을 만들었다고 가정합니다.Novel
은title
필드를 포함해야 합니다. 하지만Novel
은pageCount
또는ISBN
와 같이 인터페이스에 없는 다른 필드도 포함할 수 있습니다. 인터페이스는 출력 유형만 될 수 있습니다.
다음 섹션에서는 GraphQL에서 각 유형이 작동하는 방식을 설명합니다.
Objects
GraphQL 객체는 프로덕션 코드에서 볼 수 있는 기본 유형입니다. GraphQL에서는 객체를 다른 언어의 변수와 비슷한 여러 필드의 그룹으로 생각할 수 있으며, 각 필드는 값을 보유할 수 있는 유형(일반적으로 스칼라 또는 다른 객체)으로 정의됩니다. 객체는 서비스 구현에서 검색/조작할 수 있는 데이터 단위를 나타냅니다.
객체 유형은 Type
키워드를 사용하여 선언됩니다. 스키마 예제를 약간 수정해 보겠습니다.
type Person {
id: ID!
name: String
age: Int
occupation: Occupation
}
type Occupation {
title: String
}
여기에서 객체 유형은 Person
및 Occupation
입니다. 각 객체에는 고유한 유형이 있는 고유한 필드가 있습니다. GraphQL에는 필드를 다른 유형으로 설정할 수 있는 기능이 있습니다. Person
의 occupation
필드에 Occupation
객체 유형이 포함되어 있는 것을 볼 수 있습니다. GraphQL은 데이터를 설명할 뿐 서비스 구현은 설명하지 않기 때문에 이렇게 연결할 수 있습니다.
스칼라
스칼라는 본질적으로 값을 보유하는 기본 유형입니다. 에는 기본 GraphQL 스칼라와 스칼라라는 두 AWS AppSync가지 유형의 AWS AppSync 스칼라가 있습니다. 스칼라는 일반적으로 객체 유형 내에 필드 값을 저장하는 데 사용됩니다. 기본 GraphQL 유형에는 Int
, Float
, String
, Boolean
, ID
가 포함됩니다. 이전 예제를 다시 사용해 보겠습니다.
type Person {
id: ID!
name: String
age: Int
occupation: Occupation
}
type Occupation {
title: String
}
name
및 title
필드를 분리해 보면 둘 다 String
스칼라를 보유합니다. Name
은 'John Smith
'와 같은 문자열 값을 반환하고 제목은 'firefighter
'와 같은 결과를 반환할 수 있습니다. 일부 GraphQL 구현에서는 Scalar
키워드를 사용하고 유형의 동작을 구현하는 사용자 지정 스칼라도 지원합니다. 그러나 지금은 AWS AppSync 에서 사용자 지정 스칼라를 지원하지 않습니다. 스칼라 목록은 AWS AppSync의 스칼라 유형을 참조하세요.
입력
입력 및 출력 유형의 개념으로 인해 인수를 전달할 때 특정 제한이 발생합니다. 공통으로 전달해야 하는 유형, 특히 객체가 제한됩니다. 입력 유형을 사용하여 이 규칙을 우회할 수 있습니다. 입력은 스칼라, 열거형 및 기타 입력 유형을 포함하는 유형입니다.
입력은 input
키워드를 사용하여 정의됩니다.
type Person {
id: ID!
name: String
age: Int
occupation: Occupation
}
type Occupation {
title: String
}
input personInput {
id: ID!
name: String
age: Int
occupation: occupationInput
}
input occupationInput {
title: String
}
보는 것과 같이 원래 유형을 모방하는 별도의 입력이 있을 수 있습니다. 이러한 입력은 다음과 같이 필드 작업에 자주 사용됩니다.
type Person {
id: ID!
name: String
age: Int
occupation: Occupation
}
type Occupation {
title: String
}
input occupationInput {
title: String
}
type Mutation {
addPerson(id: ID!, name: String, age: Int, occupation: occupationInput): Person
}
Person
을 생성하기 위해 Occupation
의 자리에 occupationInput
을 계속해서 전달하는 방식을 주목하세요.
이 방식은 입력에 대한 한 가지 시나리오에 불과합니다. 객체를 반드시 1:1로 복사할 필요는 없으며, 프로덕션 코드에서는 이 방법으로 사용하지 않을 가능성이 큽니다. 입력해야 하는 항목만 인수로 정의하여 GraphQL 스키마를 활용하는 것이 좋습니다.
또한 동일한 입력을 여러 작업에 사용할 수 있지만 권장되지는 않습니다. 스키마의 요구 사항이 변경될 경우를 대비하여 각 작업에는 입력의 고유한 사본이 포함되는 것이 이상적입니다.
특수 객체
GraphQL은 스키마가 데이터를 검색/조작하는 방식에 대한 일부 비즈니스 로직을 정의하는 특수 객체를 위한 몇 가지 키워드를 예약합니다. 스키마에는 이러한 키워드가 최대 하나씩만 있을 수 있습니다. 이러한 키워드는 클라이언트가 GraphQL 서비스에 대해 실행하는 모든 요청 데이터의 진입점 역할을 합니다.
type
키워드를 사용하여 특수 객체도 정의합니다. 일반 객체 유형과는 다르게 사용되지만 구현은 매우 비슷합니다.
쿼리는 읽기 전용 가져오기를 수행하여 소스에서 데이터를 가져온다는 점에서 GET
작업과 매우 유사합니다. GraphQL에서 Query
는 서버에 요청을 보내는 클라이언트의 모든 진입점을 정의합니다. GraphQL 구현에는 항상 Query
가 있습니다.
다음은 이전 스키마 예제에서 사용한 Query
및 수정된 객체 유형입니다.
type Person {
id: ID!
name: String
age: Int
occupation: Occupation
}
type Occupation {
title: String
}
type Query {
people: [Person]
}
Query
에는 데이터 원본의 Person
인스턴스 목록을 반환하는 people
라는 필드가 포함되어 있습니다. 애플리케이션의 동작을 변경해야 하는데 이제 별도의 목적으로 Occupation
인스턴스 목록만 반환해야 한다고 가정해 보겠습니다. 쿼리에 간단히 추가할 수 있습니다.
type Query {
people: [Person]
occupations: [Occupation]
}
GraphQL에서는 쿼리를 요청의 단일 소스로 취급할 수 있습니다. 보는 것과 같이 서로 다른 엔드포인트를 사용하여 동일한 결과(.../api/1/people
및 .../api/1/occupations
)를 달성할 수 있는 RESTful 구현보다 훨씬 간단할 수 있습니다.
이 쿼리에 대한 해석기 구현이 있다고 가정하면 이제 실제 쿼리를 수행할 수 있습니다. Query
유형이 존재하지만 애플리케이션의 코드에서 실행되도록 하려면 명시적으로 호출해야 합니다. 다음과 같은 query
키워드를 사용하여 수행할 수 있습니다.
query getItems {
people {
name
}
occupations {
title
}
}
보는 것과 같이 이 쿼리는 getItems
라고 하며 people
(Person
객체의 목록) 및 occupations
(Occupation
객체의 목록)를 반환합니다. people
에서는 각 Person
의 name
필드만 반환하는 반면, 각 Occupation
의 title
필드를 반환합니다. 응답은 다음과 같을 수 있습니다.
{
"data": {
"people": [
{
"name": "John Smith"
},
{
"name": "Andrew Miller"
},
.
.
.
],
"occupations": [
{
"title": "Firefighter"
},
{
"title": "Bookkeeper"
},
.
.
.
]
}
}
예제 응답은 데이터가 쿼리의 형태를 어떻게 따르는지 보여 줍니다. 검색된 각 항목은 필드 범위 내에 나열됩니다. people
및 occupations
는 항목을 별도의 목록으로 반환합니다. 이 방법이 유용하긴 하지만, 사람들의 이름과 직업 목록을 반환하도록 쿼리를 수정하는 것이 더 편리할 수도 있습니다.
query getItems {
people {
name
occupation {
title
}
}
Person
유형에 유형 Occupation
의 occupation
필드가 포함되어 있기 때문에 이는 유효한 수정입니다. people
의 범위 내에 나열되면 각 Person
의 name
과 함께 관련된 Occupation
이 title
별로 반환됩니다. 응답은 다음과 같을 수 있습니다.
}
"data": {
"people": [
{
"name": "John Smith",
"occupation": {
"title": "Firefighter"
}
},
{
"name": "Andrew Miller",
"occupation": {
"title": "Bookkeeper"
}
},
.
.
.
]
}
}
스키마 예제에서 언급되지 않은 한 가지는 특수 객체 유형도 schema
루트에 정의되어야 한다는 사실입니다. 따라서에서 스키마를 내보낼 때 다음과 같 AWS AppSync을 수 있습니다.
schema {
query: Query
mutation: Mutation
subscription: Subscription
}
.
.
.
type Query {
# code goes here
}
type Mutation {
# code goes here
}
type Subscription {
# code goes here
}
열거
열거 또는 열거형은 유형이나 필드에 사용할 수 있는 유효한 인수를 제한하는 특수 스칼라입니다. 즉, 스키마에 열거형이 정의될 때마다 관련 유형이나 필드가 열거형의 값으로 제한됩니다. 열거형은 문자열 스칼라로 직렬화됩니다. 프로그래밍 언어에 따라 GraphQL 열거형을 다르게 처리할 수 있다는 점에 유의하세요. 예를 들어 JavaScript에는 기본 열거형 지원이 없으므로 열거형 값을 int 값에 대신 매핑할 수 있습니다.
열거형은 enum
키워드를 사용하여 정의됩니다. 다음은 그 예입니다.
enum trafficSignals {
solidRed
solidYellow
solidGreen
greenArrowLeft
...
}
trafficLights
열거형을 호출할 때 인수는 solidRed
, solidYellow
, solidGreen
등만 사용할 수 있습니다. 명확하지만 제한된 수의 선택 사항이 있는 항목을 묘사하는 데 열거형을 사용하는 것이 일반적입니다.
결합/인터페이스
GraphQL의 인터페이스 및 결합을 참조하세요.