GraphQL의 동적 쿼리

간단한 GraphQL 쿼리는 다음과 같습니다.

query myQuery() {
    user {
        age
        firstName
        lastName
        dob
       }
     } 

위 쿼리는 형식의 응답을 반환합니다.

data {
   user {
       age: 23,
       firstName: "John",
       lastName: "Smith",
       dob: "01-01-1970"
   }
 }

글쎄, 이것은 꽤 표준적인 것들이다. GraphQL 끝점은 요청된 정확한 필드를 반환합니다.

이제 매번 다른 필드를 쿼리하려면 어떻게 합니까? 예를 들어, 처음에는 { age, firstName } 쿼리한 다음 { age, dob } 쿼리하고 싶습니다. 두 번째 경우에는 필요하지 않기 때문에 firstName를 가져오고 싶지 않습니다. 이것은 특히 API 호출이 특정 필드와 관련된 경우 견고한 접근 방식입니다.

이에 대한 사용 사례는 다음과 같습니다.
  • 가져와야 하는 데이터 요소가 포함된 체크리스트가 UI에 있습니다.
  • 사용자가 자신의 인증 기준을 선택하고 우리는 그것을 가져오기를 원합니다.

  • 이를 수행하는 한 가지 방법은 지정된 필드에 따라 쿼리를 생성하는 것입니다. 그러나 중첩된 json을 도입하자마자 이것은 꽤 지저분해집니다.

    이를 해결하기 위해 GraphQL에는 directives 이라는 매우 편리한 기능이 있습니다. 특히 @include 지시문은 동적 쿼리 문제를 해결합니다.

    이제 @include 지시문을 사용하여 위의 쿼리를 다시 작성합니다.

    query myQuery($age: Boolean!, $firstName: Boolean!, $lastName: Boolean!, $dob: Boolean!) {
           user {
           age @include(if: $age)
           firstName @include(if: $firstName)
           lastName @include(if: $lastName)
           dob @include(if: $dob)
           }
    }
    
    variables: 
     {
      age: true,
      firstName: true,
      lastName: false,
      dob: false
      }
    

    위 쿼리의 응답은 다음과 같습니다.

    data {
       user {
           age: 23,
           firstName: "John"
       }
     }
    

    변수 json에서 age로 설정된 것만 firstNametrue를 반환합니다. 이 @include 지시문에 대한 또 다른 좋은 점은 GraphQL 엔진이 해당 리졸버를 실행하지도 않아 성능이 향상된다는 것입니다. 이러한 변수 json을 조작하는 것은 매우 간단하며 모든 요청에 ​​대해 쿼리를 변경할 필요가 없습니다. dob 대신 firstName 값을 얻으려면 변수 json에서 firstName: falsedob: true만 변경하면 됩니다.

    이 지시문 사용의 단점은 쿼리가 훨씬 더 장황하고 여러 위치에서 변수를 반복해야 한다는 것입니다. 그러나 설명된 대로here GraphQL 유형 안전의 고유한 부분입니다.

    좋은 웹페이지 즐겨찾기