GraphQL 기본 문법 - 서버

DDANDARA ㅣ 2021. 4. 18. 01:18

GraphQL은 특정 DB나 특정 언어에 독립적이므로 Java, Kotlin, javascript, typescript, python 등 여러 언어로 작성된 백엔드 코드의 가장 앞단에 API를 위한 Query Language로 사용할 수 있다.

즉, MVC 아키텍처로 이루어진 구조라면 모든 Controller를 GraphQL로 대체할 수 있다. 이번 시간에는 typescript 언어로 작성된 GraphQL을 알아보자.

API를 다루는 GraphQL은 TypedefResolver 로 이루어져 있다.

먼저 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가지로 나뉜다.

  1. Model
  • 어떤 모델의 데이터 타입을 나타낸다. 정의된 타입을 query, mutation 의 파라미터나 리턴 타입으로 설정한다
  1. Mutation
  • 어떤 상태에서 변화가 있을 때를 정의한다. REST API의 CUD에 해당하는 타입이다.
  1. Query
  • 어떤 상태를 조회할 때를 정의한다. REST API의 GET에 해당하는 타입이다.
  1. Input
  • 모델 타입 중 특별히 파라미터로 쓰이는 타입을 정의한다.
  1. Enum
  • Enum 타입을 정의할 수 있다.
  1. Scalar
  • GraphQL에 내장된 기본타입 이외의 타입을 선언한다. Date를 예로 들 수 있다

'GraphQL' 카테고리의 다른 글

GraphQL 페이지네이션  (0) 2023.03.16
Schema Merge vs Federation(=join)  (0) 2023.01.19
GraphQL 기본 문법 - 클라이언트  (0) 2020.12.11