[GraphQL] GraphQL의 유형(TYPE)
1. 객체(Object)
GQL 스키마의 가장 기본적인 구성 요소는 객체 타입(Object Types)이다. 객체는 서비스에서 가져올 수 있는 객체의 종류와 엔티티를 설명하는 필드가 있다. 예를 들어 book은 authorName, publishingYear와 같은 필드가 있는 객체라 할 수 있다.
type Book {
authorName: String
publishingYear: Int
}
2. 스칼라(Scalar)
- Int : 부호가 있는 32비트 정수
- Float : 부호가 있는 부동소수점 값
- String : UTF-8 문자열
- Boolean : true 또는 false
- ID : 객체를 다시 요청하거나 캐시의 키로써 자주 사용되는 고유 식별자
3. 입력(Input)
입력은 필드 그룹, 객체를 인수로 전달할 수 있다. 주로 뮤테이션(Mutation)에서 사용되며 객체와 구조가 비슷하지만 특수 객체에 인수로 전달할 수 있다. type 대신 input을 사용한다. 입력을 사용하면 범위에 스칼라, 열거형 및 기타 입력을 정의할 수 있고, 입력 객체 타입을 참조할 수 있지만 입력 및 출력 타입을 스키마에 혼합할 수는 없다.
input ReviewInput {
stars: Int!
commentary: String
}
4. 특수 객체(Special object)
특수 객체는 GQL의 스키마를 정의하고 쿼리 및 뮤테이션을 구성하는 데 사용된다. 특수 객체들은 쿼리(Query), 변형(Mutation), 구독(Subscription)로서, 일반적으로 쿼리는 데이터를 가져오고, 변형은 데이터를 조작하며, 구독은 지속적인 통신을 위해 클라이언트와 서버 간의 양방향 연결을 열고 유지한다.
5. 열거형 타입(Enums)
열거형은 미리 정의된 유효 값 목록이라 할 수 있다. 특정한 값의 집합을 타나내며 주로 스키마에서 상수 값을 정의할 때 사용된다. 클라이언트와 서버 간에 특정한 유형의 값을 전달할 때 유용하며 스칼라 유형과 동일하게 취급 되기 때문에 열거형 값을 변수나 인자로 전달할 때는 스칼라 값과 동일한 방식으로 처리하면 된다.
enum DayOfWeek {
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY
}
6. 리스트(List)와 Non-Null
리스트는 지정된 유형의 모든 항목을 반환한다. 대괄호([ ])를 사용하여 필드 유형에 목록을 추가할 수 있다.
type Person {
name: String
age: Int
}
type Query {
people: [Person]
}
Query에서 Person 주위의 대괄호는 데이터 원본의 Person에 있는 모든 인스턴스를 배열로 반환한다는 것을 나타낸다. 응답에서 각 Person의 name 및 age 값은 구분된 단일 목록으로 반환된다.
Non-Null은 응답에서 Null이 될 수 없는 필드를 나타낸다. 느낌표(!) 기호를 사용하여 필드에 Null 값을 허용하지 않는 것으로 설정할 수 있다.
type Person {
name: String!
age: Int
}
type Query {
people: [Person]
}
Non-Null 및 리스트를 결합할 수도 있다. 예를 들어, Null이 아닌 문자열 리스트를 가질 수 있다.
myField: [String!]
즉, 리스트 자체는 Null일 수 있지만, null을 가질 수 없다.
myField: null // valid
myField: [] // valid
myField: ['a', 'b'] // valid
myField: ['a', null, 'b'] // error
필요에 따라 여러 개의 Null, 리스트 수정자를 중첩할 수 있다.
선언부 | myField: null | myField: [ ] | myField: [... , null] |
[String] | ✅ | ✅ | ✅ |
[String!] | ✅ | ✅ | ❌ |
[String]! | ❌ | ✅ | ✅ |
[String!]! | ❌ | ❌ | ❌ |
7. 인터페이스(Interface)
인터페이스는 유사한 객체 타입을 만들기 위한 공통 필드 타입이며 타입이 무엇인가를 구현하기 위해 포함해야 하는 특정 필드 집합을 포함하는 추상 타입이다. 예를 들어, 어떤 사람들의 모임을 나타내는 Event 인터페이스가 있다고 가정해보자. 여기서 가능한 이벤트 유형으로는 Concert, Conference, Festival이 있다. 이러한 형식은 모두 동일한 특성을 공유하고, 모두 이름, 이벤트가 발생하는 장소와 시작 날짜 및 종료 날짜를 가지고 있다. 하지만 이러한 형식에도 차이가 있는데, Conference는 발표자 및 워크숍 목록을 제공하는 반면에 Concert에는 공연하는 밴드가 있다.
interface Event {
id: ID!
name : String!
startsAt: String
endsAt: String
venue: Venue
minAgeRestriction: Int
}
type Concert implements Event {
id: ID!
name: String!
startsAt: String
endsAt: String
venue: Venue
minAgeRestriction: Int
performingBand: String
}
type Festival implements Event {
id: ID!
name: String!
startsAt: String
endsAt: String
venue: Venue
minAgeRestriction: Int
performers: [String]
}
type Conference implements Event {
id: ID!
name: String!
startsAt: String
endsAt: String
venue: Venue
minAgeRestriction: Int
speakers: [String]
workshops: [String]
}
인터페이스는 여러 형식일 수 있는 요소를 나타내는 데 유용하다. 예를 들어, 특정 장소에서 개최되는 모든 이벤트를 검색할 수 있다. 스키마에 다음과 같이 findEventsByVenue 필드를 추가해 보자.
schema {
query: Query
}
type Query {
# Retrieve Events at a specific Venue
findEventsAtVenue(venueId: ID!): [Event]
}
type Venue {
id: ID!
name: String
address: String
maxOccupancy: Int
}
type Concert implements Event {
id: ID!
name: String!
startsAt: String
endsAt: String
venue: Venue
minAgeRestriction: Int
performingBand: String
}
interface Event {
id: ID!
name: String!
startsAt: String
endsAt: String
venue: Venue
minAgeRestriction: Int
}
type Festival implements Event {
id: ID!
name: String!
startsAt: String
endsAt: String
venue: Venue
minAgeRestriction: Int
performers: [String]
}
type Conference implements Event {
id: ID!
name: String!
startsAt: String
endsAt: String
venue: Venue
minAgeRestriction: Int
speakers: [String]
workshops: [String]
}
findEventsByVenue는 Event 목록을 반환한다. GraphQL 인터페이스 필드는 구현하는 모든 형식에 공통적이기 때문에 Event 인터페이스에 대해 모든 필드를 선택할 수 있다(id, name, startsAt, endsAt, venue 및 minAgeRestriction). 또한 GraphQL 프리그먼트를 사용하여 형식을 지정하는 한 구현하는 모든 형식에 대한 필드에 액세스할 수 있다.
query {
findEventsAtVenue(venueId: "Madison Square Garden") {
id
name
minAgeRestriction
startsAt
... on Festival {
performers
}
... on Concert {
performingBand
}
... on Conference {
speakers
workshops
}
}
}
8. 유니온(Union)
유니온을 사용하면 클라이언트가 요청한 데이터에 따라 요청에서 하나 이상의 항목을 반환할 수 있으며 타입 여럿을 한 배열에 반환하고자 할 때 사용된다. 인터페이스는 공통된 부분을 interface 선언으로 추상화하고 이를 사용했지만, 유니온은 공통된 부분 없이 사용할 수 있다.
interface StuffInterface {
name: String!
kind: String!
price: Int!
}
type Food implements StuffInterface {
name: String!
kind: String!
price: Int!
shelf_life: Time!
#...
}
type Furniture implements StuffInterface {
name: String!
kind: String!
price: Int!
description: String!
#...
}
union StuffResult = Food | Furniture
- 참고자료
https://graphql-kr.github.io/learn/schema/#
https://docs.aws.amazon.com/ko_kr/appsync/latest/devguide/graphql-types.html