GraphQL은 특정 DB나 특정 언어에 독립적이므로 Java, Kotlin, javascript, typescript, python 등 여러 언어로 작성된 백엔드 코드의 가장 앞단에 API를 위한 Query Language로 사용할 수 있다.
즉, MVC 아키텍처로 이루어진 구조라면 모든 Controller를 GraphQL로 대체할 수 있다. 이번 시간에는 typescript 언어로 작성된 GraphQL을 알아보자.
API를 다루는 GraphQL은 Typedef
과 Resolver
로 이루어져 있다.
먼저 Typedef
에서 GraphQL로 다룰 데이터들의 type
, query
, mutation
을 정의해야한다. 이 정의를 통해 어떤 타입을 어떻게 사용할 것인지를 미리 설정해야 한다.
const typeDefs = gql`
enum DeleteStatus {
" 삭제 성공 "
SUCCESS
}
type Query {
meetings(hostId: String, page: Page!): MeetingConnection!
meeting(id: ID!): Meeting!
reviews(meetingId: Int, userId: String, page: Page!): ReviewConnection!
review(id: ID!): Review!
}
type Mutation {
createMeeting(input: MeetingPostParam!): Meeting!
updateMeeting(id: ID!, input: MeetingPostParam!): Meeting!
deleteMeeting(id: ID!): DeleteStatus!
createMeetingParticipation(meetingId: Int!, userId: String!): Participation!
deleteMeetingParticipation(meetingId: Int!, userId: String!): DeleteStatus!
updateAttendance(meetingId: Int!, userId: String!): Participation!
createReview(input: ReviewPostParam!): Review!
updateReview(id: ID!, input: ReviewPostParam!): Review!
deleteReview(id: ID!): DeleteStatus!
}
input MeetingPostParam {
hostId: String!
title: String!
content: String!
startAt: String!
endAt: String!
deadline: String!
maxParticipant: Int!
place: String!
}
input ReviewPostParam {
meetingId: Int!
userId: String!
title: String!
content: String!
}
input Page {
"this is Page type!"
pageNum: Int
pageSize: Int
first: Int
after: String
}
type Meeting {
" 모임 ID"
id: ID!
" 모임 등록 호스트 정보 "
host: Host!
" 모임 제목 "
title: String!
" 모임 내용 "
content: String!
" 모임 시작 시간 "
startAt: DateTime!
" 모임 종료 시간 "
endAt: DateTime!
" 모임 마감 시간 "
deadline: DateTime!
" 모임 참가 최대 인원 "
maxParticipant: Int!
" 모임 장소 "
place: String!
" 모임 등록글 업데이트 시간 "
updatedAt: DateTime!
" 현재 참가 유저 수"
cntCurrentParticipant: Int
" 현재 참가 유저"
participatesUsers: [User!]!
" 모임 후기 "
connectedReviews: [Review!]!
}
type Review {
" 리뷰 ID "
id: ID!
" 작성자 "
postedBy: User!
" 제목 "
title: String!
" 내용 "
content: String!
" 등록 또는 수정 시간 "
updatedAt: DateTime!
}
type User {
" 유저 ID "
id: ID!
" 유저 닉네임 "
nickname: String!
}
type Host {
" 호스트 ID "
id: ID!
" 호스트 닉네임 "
nickname: String!
}
type Participation {
" 참가신청 유저 "
user: User!
" 참가신청 모임 "
meeting: Meeting!
}
type PageInfo {
hasNextPage: Boolean!
endCursor: String!
}
type MeetingConnection {
totalCount: Int!
pageInfo: PageInfo!
edges: [MeetingEdge!]!
}
type MeetingEdge {
cursor: String!
node: Meeting!
}
type ReviewConnection {
totalCount: Int!
pageInfo: PageInfo!
edges: [ReviewEdge!]!
}
type ReviewEdge {
cursor: String!
node: Review!
}
scalar DateTime
`;
export default typeDefs;
정의할 타입은 6가지로 나뉜다.
- Model
- 어떤 모델의 데이터 타입을 나타낸다. 정의된 타입을
query
,mutation
의 파라미터나 리턴 타입으로 설정한다
- Mutation
- 어떤 상태에서 변화가 있을 때를 정의한다. REST API의 CUD에 해당하는 타입이다.
- Query
- 어떤 상태를 조회할 때를 정의한다. REST API의 GET에 해당하는 타입이다.
- Input
- 모델 타입 중 특별히 파라미터로 쓰이는 타입을 정의한다.
- Enum
Enum
타입을 정의할 수 있다.
- Scalar
- GraphQL에 내장된 기본타입 이외의 타입을 선언한다. Date를 예로 들 수 있다
'GraphQL' 카테고리의 다른 글
GraphQL 페이지네이션 (0) | 2023.03.16 |
---|---|
Schema Merge vs Federation(=join) (0) | 2023.01.19 |
GraphQL 기본 문법 - 클라이언트 (0) | 2020.12.11 |