다음을 통해 공유


GraphQL의 필드 선택(프로젝션)

GraphQL에서 요청하는 필드는 DAB(Data API Builder)가 반환하는 것을 정확히 정의합니다. DAB는 요청된 매핑된(노출된) 열과 내부적으로 가져와야 하는 추가 열만 포함하여 이러한 선택 항목을 매개 변수가 있는 SQL로 컴파일합니다. 여기에는 관계(외래 키), 기본 키 또는 페이지 매김 및 커서 생성에 사용되는 안정적인 순서 지정에 필요한 열이 포함될 수 있습니다.

비고

GraphQL에는 .와 같은 SELECT *와일드카드가 없습니다. 클라이언트는 각 필드를 명시적으로 지정해야 합니다.

이 문서의 REST 버전으로 이동합니다.

기본 선택

매핑된 몇 가지 필드를 쿼리합니다.

GraphQL 쿼리

query {
  books {
    items {
      id
      title
      price
    }
  }
}

개념적 SQL

SELECT
  id,
  sku_title AS title,
  sku_price AS price
FROM dbo.books;

샘플 응답

{
  "data": {
    "books": {
      "items": [
        {
          "id": 1,
          "title": "Dune",
          "price": 20
        }
      ]
    }
  }
}

필드 별칭

별칭은 데이터베이스가 아닌 응답의 필드 이름을 바꿉니다. SQL 계층은 GraphQL 필드 이름에 별칭을 지정하지 않습니다. 별칭은 데이터 검색 후에 발생합니다.

query {
  books {
    items {
      id
      bookTitle: title
      cost: price
    }
  }
}

개념적 SQL

SELECT
  id,
  sku_title AS title,
  sku_price AS price
FROM dbo.books;

샘플 응답

별칭을 사용하는 경우:

{
  "data": {
    "books": {
      "items": [
        {
          "id": 2,
          "bookTitle": "Foundation",
          "cost": 18
        }
      ]
    }
  }
}

중첩된 선택 영역

구성에 정의된 관계는 중첩된 쿼리를 허용합니다. 아래의 개념적 SQL은 단일 조인을 보여줍니다. 실제로 DAB는 하나의 평면화된 조인 대신 하나 이상의 매개 변수가 있는 쿼리(예: 부모 쿼리와 일괄 처리된 자식 페치)를 실행할 수 있습니다.

GraphQL 쿼리

query {
  books {
    items {
      id
      title
      category {
        id
        name
      }
    }
  }
}

개념적 SQL

SELECT
  b.id,
  b.sku_title AS title,
  c.id AS category_id,
  c.name AS category_name
FROM dbo.books AS b
JOIN dbo.categories AS c
  ON b.category_id = c.id;

샘플 응답

{
  "data": {
    "books": {
      "items": [
        {
          "id": 1,
          "title": "Dune",
          "category": {
            "id": 10,
            "name": "Sci-Fi"
          }
        },
        {
          "id": 2,
          "title": "Foundation",
          "category": {
            "id": 10,
            "name": "Sci-Fi"
          }
        }
      ]
    }
  }
}

일대다 선택

역 관계를 트래버스할 수도 있습니다. 다시 말하지만 SQL은 개념적입니다. 실제 실행은 부모 행을 중복 제거하고 자식 컬렉션을 별도로 구체화할 수 있습니다.

GraphQL 쿼리

query {
  categories {
    items {
      id
      name
      books {
        items {
          id
          title
        }
      }
    }
  }
}

개념적 SQL

SELECT
  c.id,
  c.name,
  b.id AS book_id,
  b.sku_title AS title
FROM dbo.categories AS c
JOIN dbo.books AS b
  ON c.id = b.category_id;

샘플 응답

{
  "data": {
    "categories": {
      "items": [
        {
          "id": 10,
          "name": "Sci-Fi",
          "books": {
            "items": [
              { "id": 1, "title": "Dune" },
              { "id": 2, "title": "Foundation" }
            ]
          }
        }
      ]
    }
  }
}

구성 예

{
  "runtime": {
    "pagination": {
      "default-page-size": 100,
      "max-page-size": 100000
    }
  },
  "entities": {
    "Book": {
      "source": {
        "type": "table",
        "object": "dbo.books"
      },
      "mappings": {
        "sku_title": "title",
        "sku_price": "price"
      },
      "relationships": {
        "book_category": {
          "cardinality": "one",
          "target.entity": "Category",
          "source.fields": [ "category_id" ],
          "target.fields": [ "id" ]
        }
      }
    },
    "Category": {
      "source": {
        "type": "table",
        "object": "dbo.categories"
      },
      "relationships": {
        "category_books": {
          "cardinality": "many",
          "target.entity": "Book",
          "source.fields": [ "id" ],
          "target.fields": [ "category_id" ]
        }
      }
    }
  }
}

참고하십시오

개념 REST GraphQL 목적
Projection $select 항목 반환할 필드 선택
Filtering $filter 필터 조건별로 행 제한
정렬 $orderby orderBy 정렬 순서 정의
페이지 크기 $first 첫 번째 페이지당 항목 수 제한
연속 $after 커서를 사용하여 마지막 페이지에서 계속

비고

REST 키워드는 OData 규칙에 따라 시작 $합니다.