https://facebook.com/groups/graphql-kr logo
#질문
Title
# 질문
y

yunseop kim

11/05/2019, 5:49 AM
안녕하세요, 질문드립니다. 어떤 객체의 상태를 업데이트 할 때 GraphQL에서는 어떻게 하시나요? 예를 들어서, REST의 경우에는 예약 클래스에 상태라는 변수가 있어서 예약완료, 예약 대기, 결제 필요 와 같은 상태가 있다고 한다면…
/reservation/status (PUT)
과 같이 업데이트를 하는데, graphql도 그냥 이런식으로 mutation을 하는지가 궁금합니다. 내가 너무 GraphQL을 모르고 REST 스럽게 짜는건 아닐까 하는 👀 고민이 들어서요….
t

Tony Won

11/05/2019, 6:04 AM
mutation 내에 필드로 추가하시면 될거같아요 ㅋㅋ
Copy code
type Mutation {
  updateReservation(where: UpdateReservationWhereInput!, data: UpdateReservationDataInput!): Reservation!
  # 또는
  updateReservationStatus(where: UpdateReservationStatusWhereInput!, status: ReservationStatus!): Reservation!
}
같은 느낌으로 할거같아요
h

Hyeseong Kim

11/05/2019, 6:10 AM
저라면 (REST더라도) 상태 변경을 프론트엔드에서 결정해서 PUT 하게 만들지는 않을 것 같습니다.
👍 1
y

yunseop kim

11/05/2019, 6:15 AM
1. 음, @Tony Won 님 좀더 자세히 설명해주실수 있을까요? 2. @Hyeseong Kim 님 왜인지 여쭤봐도 될까요? 👀
t

Tony Won

11/05/2019, 6:16 AM
Copy code
mutation {
  updateReservationStatus(where: { id: "1249" }, status: Pending) {
    id
    status
  }
}
h

Hyeseong Kim

11/05/2019, 6:17 AM
단순한 상태값이 아니라 비즈니스 로직이기 때문입니다. 대충 상상해봐도 예약완료,예약대기,결제 트랜지션에 필요한 필드들이 다 다를텐데 그럼 그에 맞춰서 타입을 추상화하고 뮤테이션도 다 쪼개는게 좋다는 생각이에요
t

Tony Won

11/05/2019, 6:17 AM
저도 혜성님 말씀에 동의해요 ㅎㅎ
다만 현실세계는 언제나 아름답지는 않으니 ㅠㅠ 어떻게 더 자세히 설명해드릴까요?
h

Hyeseong Kim

11/05/2019, 6:18 AM
REST 는 이러면 엔드포인트가 무진장 쪼개져서 안하는데 GraphQL 로 풀면 쉬워지죠.
다만 예제를 쓰려면 무슨 도메인인지 힌트를 주시면 좋을듯한데.. “예약” 인가요
대략 이럴거같은데
Copy code
type Reservation {
  id: ID!
  status: ReservationStatus;
}

input RegisterInput {
  ...
}

type RegisterOutput {
  reservation: Reservation!
}

input PurchaseInput {
  reservationId: String!
}

type PurchaseOutput {
  reservation: Reservation!
}

type Mutation {
  register(input: RegisterInput!): RegisterOutput!
  purchase(input: PurchaseInput!): PuchaseOutput!
}

mutation {
  purchase(input: { reservationId: ... }) {
    reservation {
      id
      status
    }
  }
}
결제처럼 Reservation 상태에 따라 로직이 많이 다르면 status 필드보단 interface or union 으로 다형성 구현하는게 낫습니다.
Copy code
query ReservationInfo($id: ID!) {
  reservation(id: $id) {
    id
    memo
    ...on NeedPurchase {
      # 결제 관련 정보 격리
      ...PurchaseInformation
    }
  }
}
👍 1
y

yunseop kim

11/05/2019, 7:31 AM
음.. 사실은 그냥 예를 들다보니 생각난게 예약이어서 대충 적은것이었습니다.. 죄송합니다.. 👀 그러나 도움이 많이 되었습니다. 감사합니다