GraphQL 구조 설계의 GraphQL 최적 실천

15221 단어 reactwebdevgraphqlnode
본문은 free GraphQL Language course의 일부분이다.내용을 완전히 이해하려면 SDL 언어, GraphQL 문서 문법 또는 GraphQL object typesscalars 등 기본적인 GraphQL 개념을 숙지해야 합니다.만약 당신이 이 지식들을 이해하지 못한다면, 당신은 우리가 이전에 our older articles on atheros.aimedium publication 에 쓴 글을 볼 수 있습니다.

소개하다.
본고에서 우리는 각종 방법과 기본 모델을 소개하여 최상의 방식으로 모델을 설계하는 데 도움을 줄 것이다.이것은 절대로 완전한 지침이 아니다.자주 발생하는 가장 큰 함정을 어떻게 피할 것인가에 대한 최선의 실천과 설명에 대한 짧은 명단일 뿐이다.GraphQL 모델 디자인에 대한 더 많은 고급 정보는 무료GraphQL language course를 보십시오.검사표를 만들어서 당신의 모델이 무엇을 제공해야 디자인 과정을 지도할 수 있는지 열거함으로써 모델 디자인을 하는 것이 매우 유용하다.

돌연변이에 입력 대상 유형 사용
돌연변이의 경우 하나의 변수만 사용하고 입력 대상 유형을 사용하여 GraphQL 문서의 구조를 간소화하는 것이 중요하다.우리의 모델에서 예는 우리의createPlanet 돌연변이이다.SDL의 내용은 다음과 같습니다.
type Planet implements Node {
  id: ID!
  createdAt: DateTime!
  updatedAt: DateTime
  name: String
  description: String
  planetType: PlanetTypeEnum
}
input CreatePlanetInput {
  name: String!
  galaxyId: ID!
  description: String
}
type Mutation {
  createPlanet(input: CreatePlanetInput!): Planet!
}
우리는 입력 대상 유형인 매개 변수만 입력할 수 있음을 알 수 있다.입력의 유효 부하가null이 되지 않도록 비null 수식자를 사용하고 있습니다.이 모델에 대한 자세한 내용은 우리가 왜 그것을 사용하고 그것을 실현하는지, 그리고 그것을 어떻게 실현하는지 포함해서 this article on input object typesGraphQL lists and Non Null modifiers 의 이것을 따를 수 있습니다.

돌연변이로 인해 영향을 받은 대상이 되돌아오다
돌연변이를 처리할 때 돌연변이 기록을 돌연변이 결과로 되돌리는 것은 좋은 설계로 여겨진다.따라서 프런트엔드의 상태를 적절하게 업데이트하고 일관성을 유지할 수 있습니다.이 개념을 설명하기 위해 다음과 같은 돌연변이를 살펴보자.
type Mutation {
  createPlanet(input: CreatePlanetInput!): Planet!
  updatePlanet(input: UpdatePlanetInput!): Planet!
}
우리는 우리가 지구로 돌아가는 것을 볼 수 있다.이런 돌변으로그리고 캐시는 그것을 사용하여 저장소를 업데이트할 것이다.createPlanet에서 행성 목록에 객체를 첨부합니다.이것은 보통 코드에서 완성해야 한다.그러나 업데이트 플래닛의 두 번째 예에서 우리는 행성의 id에 따라 자동으로 행성을 업데이트할 수 있다.

기본적으로 페이지 목록 사용
보안상의 이유로 서버에서 검색하고자 하는 기록 수량을 제한하는 능력은 페이지 나누기 결과가 매우 중요하다.페이지 나누기 결과를 다음과 같이 구성하는 것이 좋습니다.
type PageInfo {
  endCursor: String
  hasNextPage: Boolean!
  hasPreviousPage: Boolean!
  startCursor: String
}
type ConstellationConnection {
  nodes: [Constellation]
  pageInfo: PageInfo!
  totalCount: Int!
}
이런 페이지는 이른바 커서 기반의 페이지를 바탕으로 한다.언제든지 목록을 가져오면 기본적으로 페이지 목록을 사용하는 것을 권장합니다.미래에 패턴의 변경을 피할 수 있을 뿐만 아니라, 거의 항상 신축성 있는 해결 방안이 될 것입니다.또한 수량 제한을 쉽게 실현하고 자원 소모 공격으로부터 자신을 보호할 수 있습니다. 이런 공격에서 누군가가 데이터베이스에서 대량의 기록을 한 번에 조회할 수 있습니다.

질의에 객체 네스트하기
GraphQL 모델을 구축할 때, 나는 캐시에 영향을 주고 클라이언트 기기의 GraphQL 조회의 효율을 방해하는 잘못된 모델을 자주 본다.만약 우리가 이런 나쁜 방법으로 우리의 행성 유형을 다시 쓴다면 우리는 이런 내용을 쓸 것이다.
type Planet implements Node {
  id: ID!
  createdAt: DateTime!
  updatedAt: DateTime
  name: String
  description: String
  planetType: PlanetTypeEnum
  galaxyId: ID!
}
문제는 갤럭시Id입니다.프런트엔드 캐시의 경우 정합성이 보장되지 않습니다.패턴을 고려하고, 유형을 다시 사용하며, 이 ID들을 적당한 형식으로 대체해야 합니다.만약 행성의 별자리를 조회하고 싶다면, 두 개의 조회를 해야 한다.우선, 갤럭시 Id를 사용하여planet을 호출한 다음, 갤럭시 Id를 다른 검색어에 전달합니다.이것은 정말 불편하고 GraphQL의 기능을 최대한 발휘할 수 없다.GraphQL에서는 플러그인 출력 형식이 훨씬 좋습니다.이렇게 하면 우리는 요청을 통해 모든 내용을 호출할 수 있고 data loader를 사용하여 캐시와 일괄 처리를 실행할 수 있다.
type Planet implements Node {
  id: ID!
  createdAt: DateTime!
  updatedAt: DateTime
  name: String
  description: String
  planetType: PlanetTypeEnum
  galaxy: Galaxy!
}
우리가 이 행성을 조회하고 별자리를 포함하기를 희망할 때, 우리는GraphQL 조회라고 할 수 있다.
query getPlanets {
  planets {
    nodes {
      id
      name
      constellation {
        id
        name
        createdAt
      }
    }
  }
}

인터페이스로 모드 디자인 향상
인터페이스와 연합은 서로 다른 개념을 추상화하고 복잡성을 낮추며 모델을 간소화하는 강력한 도구이다.인터페이스의 가장 좋은 예는 노드 인터페이스다.노드 인터페이스는 Relay.js로 이루어지지만 다른 모델로도 실현할 것을 제안합니다.설령 그들이 계전기를 사용하지 않는다 하더라도.전면에서 복잡성을 줄이는 데 도움이 된다.인터페이스에 대한 자세한 내용은 this article 또는 DellGraphQL language course을 참조하십시오.

미래의 패턴 변화를 고려하다
최초의 모델을 실현할 때 미래의 모든 가능한 변화를 고려해 보자.일반적으로 모델에 투자하기만 하면 된다.앞으로 어디에 추가 필드를 추가할 수 있는지 고려하고 출력 대상 유형과 입력 대상 유형을 추가하면 이후에 돌파적인 변경을 도입할 필요가 없습니다.더 복잡한 프로그램을 만들고 있다면 GraphQL 모드 생성기를 맹목적으로 사용하지 마십시오.GraphQL 모드 생성기는 일부 상황에서 틀림없이 매우 유용할 것이다. 예를 들어 원형 디자인이나 데이터베이스에 있는 즉각적인 고성능 API 등이다. 그러나 전반적으로 말하자면 모델 디자인을 고려하고 귀하의 전방 수요에 따라 맞춤형 디자인을 하는 것을 권장합니다.

모드에서 일치하는 이름 사용하기
GraphQL 모드 디자인에서 명명 약정의 일치성을 유지하는 것은 매우 중요하다.필드에 camelCase를 사용하고 유형 이름에 pascalCase를 사용하는 것은 흔히 볼 수 있는 좋은 방법입니다.이렇게 입력 유형을 명명하는 것도 유용하다는 것을 알게 되었습니다.
(action)(type)Input
(action) 는 생성, 업데이트, 삭제이며, (type) 은 업데이트 중인 유형이나 실체의 이름입니다.비록 중요한 것은 간단한crud 작업에서만 모델을 디자인하지 말고, 당신의 전방 수요에 따라 맞춤형 돌연변이를 하는 것입니다.우리는 또한 일반적인 패턴 (예를 들어 페이지 나누기) 을 같은 방식으로 명명할 수 있도록 확보해야 한다.노드가 있는 페이지 나누기 목록에 PageInfo 유형 및 연결을 사용합니다.ENUM의 또 다른 좋은 실천은 모든 대문자를 사용하여 ENUM 값을 표시하는 것이다. 왜냐하면 그들은 기본적으로 상수이기 때문이다.

I hope that you liked this shortlist of best practices for GraphQL schema design. Feel free to ask any question and feedback at [email protected].

좋은 웹페이지 즐겨찾기