

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# GraphQL의 추가 속성
<a name="graphql-properties"></a>

GraphQL은 대규모로 단순성과 견고성을 유지하기 위한 몇 가지 설계 원칙으로 구성됩니다.

## 선언적
<a name="declarative-property"></a>

GraphQL은 선언적이므로 사용자는 쿼리하려는 필드만 선언하여 데이터를 설명(형태 지정)할 수 있습니다. 응답은 이러한 속성에 대한 데이터만 반환합니다. 예를 들어, ISBN 13 `id` 값이 *9780199536061*인 DynamoDB 테이블에서 `Book` 객체를 검색하는 작업은 다음과 같습니다.

```
{
  getBook(id: "9780199536061") {
    name
    year
    author
  }
}
```

응답은 페이로드의 필드(`name`, `year`, `author`)만 반환하며 다른 필드는 반환하지 않습니다.

```
{
  "data": {
    "getBook": {
      "name": "Anna Karenina",
      "year": "1878",
      "author": "Leo Tolstoy",
    }
  }
}
```

이러한 설계 원칙으로 인해 GraphQL은 복잡한 시스템에서 REST API가 다루는 과다 가져오기와 과소 가져오기라는 고질적인 문제를 해결합니다. 그 결과 데이터 수집이 더 효율적으로 이루어지고 네트워크 성능이 향상됩니다.

## 계층적
<a name="hierarchical-property"></a>

GraphQL은 요청된 데이터를 사용자가 애플리케이션의 요구에 맞게 구성할 수 있다는 점에서 유연합니다. 요청된 데이터는 항상 GraphQL API에 정의된 속성의 유형과 구문을 따릅니다. 예를 들어, 다음 스니펫은 `Book` *9780199536061*에 연결된 모든 저장된 인용 문자열과 페이지를 반환하는 `quotes`라는 새로운 필드 범위를 사용한 `getBook` 작업을 보여 줍니다.

```
{
  getBook(id: "9780199536061") {
    name
    year
    author
    quotes {
      description
      page
    }
  }
}
```

이 쿼리를 실행하면 다음 결과가 반환됩니다.

```
{
  "data": {
    "getBook": {
      "name": "Anna Karenina",
      "year": "1878",
      "author": "Leo Tolstoy",
      "quotes": [
         {
            "description": "The highest Petersburg society is essentially one: in it everyone knows everyone else, everyone even visits everyone else.",
            "page": 135
         },
         { 
            "description": "Happy families are all alike; every unhappy family is unhappy in its own way.",
            "page": 1
         },
         {        
            "description": "To Konstantin, the peasant was simply the chief partner in their common labor.",
            "page": 251
         }
      ]
    }
  }
}
```

보는 것과 같이 요청된 책에 연결된 `quotes` 필드는 쿼리에서 설명한 것과 동일한 형식의 배열로 반환되었습니다. 여기에 표시되지는 않았지만 GraphQL은 검색하는 데이터의 위치를 상관하지 않는다는 추가 이점이 있습니다. `Books` 및 `quotes`는 별도로 저장할 수 있지만, GraphQL은 연결이 존재하는 한 정보를 계속 검색합니다. 즉, 쿼리는 단일 요청으로 다수의 독립형 데이터를 검색할 수 있습니다.

## 내관적
<a name="introspective-property"></a>

GraphQL은 스스로 문서화하는 내관적 성격을 지닙니다. 사용자가 스키마 내의 기본 유형과 필드를 볼 수 있는 몇 가지 내장된 작업을 지원합니다. 예를 들어, 다음은 `date` 및 `description` 필드가 있는 `Foo` 유형입니다.

```
type Foo {
	date: String
	description: String
}
```

`_type` 작업을 사용하여 스키마 아래에 있는 입력 메타데이터를 찾을 수 있습니다.

```
{
  __type(name: "Foo") {
    name                   # returns the name of the type
    fields {               # returns all fields in the type
      name                 # returns the name of each field
      type {               # returns all types for each field
        name               # returns the scalar type
      }
    }
  }
}
```

이 작업은 다음 응답을 반환합니다.

```
{
  "__type": {
    "name": "Foo",                     # The type name
    "fields": [
      {
        "name": "date",                # The date field
        "type": { "name": "String" }   # The date's type
      },
      {
        "name": "description",         # The description field
        "type": { "name": "String" }   # The description's type
      },
    ]
  }
}
```

이 기능을 사용하여 특정 GraphQL 스키마가 지원하는 유형과 필드를 확인할 수 있습니다. GraphQL은 이러한 내관적 작업을 다양하게 지원합니다. 자세한 정보는 [내부 검사](https://graphql.org/learn/introspection/)를 참조하세요.

## 강력한 유형 지정
<a name="strong-typing-property"></a>

GraphQL은 유형 및 필드 시스템을 통해 강력한 유형 지정을 지원합니다. 스키마에서 무언가를 정의할 때는 런타임 전에 검증할 수 있는 유형이 있어야 합니다. 또한 GraphQL의 구문 사양을 따라야 합니다. 이 개념은 다른 언어의 프로그래밍과 다르지 않습니다. 예를 들어 이전의 `Foo` 유형은 다음과 같습니다.

```
type Foo {
	date: String
	description: String
}
```

`Foo`가 생성될 객체라는 것을 알 수 있습니다. `Foo`의 인스턴스 안에는 `date` 및 `description` 필드가 있으며, 둘 다 `String` 기본 유형(스칼라)입니다. 구문상으로는 `Foo`가 선언되었고 해당 필드가 범위 내에 존재한다는 것을 알 수 있습니다. 이렇게 유형 검사와 논리적 구문을 조합하면 GraphQL API를 간결하고 이해하기 쉽게 만들 수 있습니다. GraphQL의 유형 지정 및 구문 사양은 [여기](https://spec.graphql.org/)에서 확인할 수 있습니다.