

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

# 확장 프로그램
<a name="extensions"></a>

**참고**  
이제 우리는 주로 APPSYNC\$1JS 런타임과 해당 문서를 지원합니다. [여기](https://docs.aws.amazon.com/appsync/latest/devguide/resolver-reference-js-version.html)에서 APPSYNC\$1JS 런타임과 해당 안내서를 사용해 보세요.

`$extensions`에는 해석기 내에서 추가 작업을 수행할 수 있는 일련의 메서드가 있습니다.

## 확장 사용
<a name="caching-extensions-list"></a>

**`$extensions.evictFromApiCache(String, String, Object) : Object`**  
 AWS AppSync 서버 측 캐시에서 항목을 제거합니다. 첫 번째 인수는 형식 이름입니다. 두 번째 인수는 필드 이름입니다. 세 번째 인수는 캐싱 키 값을 지정하는 키-값 쌍 항목을 포함하는 객체입니다. 캐시된 해석기의 `cachingKey`에 있는 캐싱 키와 동일한 순서로 객체에 항목을 넣어야 합니다.  
이 유틸리티는 뮤테이션에만 작동하고 쿼리에는 작동하지 않습니다.

## 구독 확장
<a name="subscription-extensions-list"></a>

**`$extensions.setSubscriptionFilter(filterJsonObject)`**  
향상된 구독 필터를 정의합니다. 각 구독 알림 이벤트는 제공된 구독 필터에 대해 평가되고 모든 필터가 `true`로 평가되면 클라이언트에 알림을 전달합니다. 인수는 다음 섹션에 설명된 대로 `filterJsonObject`입니다.  
이 확장 메서드는 구독 해석기의 응답 매핑 템플릿에서만 사용할 수 있습니다.

**`$extensions.setSubscriptionInvalidationFilter(filterJsonObject)`**  
구독 무효화 필터를 정의합니다. 구독 필터는 무효화 페이로드에 대해 평가된 후 필터가 `true`로 평가되면 지정된 구독을 무효화합니다. 인수는 다음 섹션에 설명된 대로 `filterJsonObject`입니다.  
이 확장 메서드는 구독 해석기의 응답 매핑 템플릿에서만 사용할 수 있습니다.

**`$extensions.invalidateSubscriptions(invalidationJsonObject)`**  
뮤테이션으로부터 구독 무효화를 시작하는 데 사용됩니다. 인수는 다음 섹션에 설명된 대로 `invalidationJsonObject`입니다.  
이 확장은 뮤테이션 해석기의 응답 매핑 템플릿에서만 사용할 수 있습니다.  
단일 요청에서 고유한 `$extensions.invalidateSubscriptions()` 메서드 직접 호출을 최대 5개까지만 사용할 수 있습니다. 이 한도를 초과할 경우 GraphQL 오류가 발생합니다.

## 인수: filterJsonObject
<a name="extensions-setSubscriptionInvalidationFilter"></a>

JSON 객체는 구독 또는 무효화 필터를 정의합니다. `filterGroup`에 있는 필터 배열입니다. 각 필터는 개별 필터의 모음입니다.

```
{
    "filterGroup": [
        {
           "filters" : [
                 {
                    "fieldName" : "userId",
                    "operator" : "eq",
                    "value" : 1
                }
           ]
           
        },
        {
           "filters" : [
                {
                    "fieldName" : "group",
                    "operator" : "in",
                    "value" : ["Admin", "Developer"]
                }
           ]
           
        }
    ]
}
```

각 필터에는 다음의 세 가지 속성이 있습니다.
+ `fieldName` - GraphQL 스키마 필드
+ `operator` - 연산자 유형
+ `value` - 구독 알림 `fieldName` 값과 비교할 값.

다음은 이러한 속성에 대한 할당 예시입니다.

```
{
 "fieldName" : "severity",
 "operator" : "le",
 "value" : $context.result.severity
}
```

### 필드: fieldName
<a name="extensions-fieldName"></a>

문자열 유형 `fieldName`은 구독 알림 페이로드에서 `fieldName`과 일치하는 GraphQL 스키마에 정의된 필드를 나타냅니다. 일치가 발견되면 GraphQL 스키마 필드의 `value`는 구독 알림 필터의 `value`와 비교됩니다. 다음 예제에서 `fieldName` 필터는 주어진 GraphQL 유형에 정의된 `service` 필드와 일치합니다. 알림 페이로드에 `AWS AppSync`와 동등한 `value`가 있는 `service` 필드가 포함된 경우 필터는 `true`로 평가합니다.

```
{
 "fieldName" : "service",
 "operator" : "eq",
 "value" : "AWS AppSync"
}
```

### 필드: 값
<a name="extensions-value"></a>

값은 연산자에 따라 다른 유형일 수 있습니다.
+ 단일 숫자 또는 부울
  + 문자열 예제: `"test"`, `"service"` 
  + 숫자 예제: `1`, `2`, `45.75` 
  + 부울 예제: `true`, `false` 
+ 숫자 또는 문자열 페어
  + 문자열 페어 예제:`["test1","test2"]`, `["start","end"]` 
  + 숫자 페어 예제: `[1,4]`, `[67,89]`, `[12.45, 95.45]` 
+ 숫자 또는 문자열 배열
  + 문자열 배열 예제: `["test1","test2","test3","test4","test5"]`
  + 숫자 배열 예제: `[1,2,3,4,5]`, `[12.11,46.13,45.09,12.54,13.89]` 

### 필드: 연산자
<a name="extensions-operator"></a>

대소문자를 구분하는 문자열로, 가능한 값은 다음과 같습니다.


| 
| 
| 연산자 | 설명 | 가능한 값 유형 | 
| --- |--- |--- |
| eq | Equal | integer, float, string, Boolean | 
| ne | Not equal | integer, float, string, Boolean | 
| le | Less than or equal | integer, float, string | 
| lt | Less than | integer, float, string | 
| ge | Greater than or equal | integer, float, string | 
| gt | Greater than | integer, float, string | 
| contains | Checks for a subsequence or value in the set. | integer, float, string | 
| notContains | Checks for the absence of a subsequence or absence of a value in the set. | integer, float, string | 
| beginsWith | Checks for a prefix. | string | 
| in | Checks for matching elements that are in the list. | Array of integer, float, or string | 
| notIn | Checks for matching elements that aren't in the list. | Array of integer, float, or string | 
| between | Between two values | integer, float, string | 
| containsAny | Contains common elements | integer, float, string | 

다음 테이블에는 구독 알림에서 각 연산자가 사용되는 방식이 설명되어 있습니다.

------
#### [ eq (equal) ]

`eq` 연산자는 구독 알림 필드 값이 일치하고 필터 값과 엄격하게 동일하면 `true`로 평가됩니다. 다음 예에서 구독 알림에 `AWS AppSync`와 동등한 값을 가진 `service` 필드가 있는 경우 필터는 `true`로 평가합니다.

**가능한 값 유형:** 정수, 부동 소수점, 문자열, 부울

```
{
 "fieldName" : "service",
 "operator" : "eq",
 "value" : "AWS AppSync"
}
```

------
#### [ ne (not equal) ]

`ne` 연산자는 구독 알림 필드 값이 필터 값과 다르면 `true`로 평가됩니다. 다음 예에서는 구독 알림에 `AWS AppSync`와 다른 값을 가진 `service` 필드가 있는 경우 필터는 `true`로 평가합니다.

**가능한 값 유형:** 정수, 부동 소수점, 문자열, 부울

```
{
 "fieldName" : "service",
 "operator" : "ne",
 "value" : "AWS AppSync"
}
```

------
#### [ le (less or equal) ]

`le` 연산자는 구독 알림 필드 값이 필터 값과 같거나 그보다 작으면 `true`로 평가됩니다. 다음 예에서는 구독 알림에 `5`와 같거나 그보다 작은 값을 가진 `size` 필드가 있는 경우 필터는 `true`로 평가합니다.

**가능한 값 유형:** 정수, 부동 소수점, 문자열

```
{
 "fieldName" : "size",
 "operator" : "le",
 "value" : 5
}
```

------
#### [ lt (less than) ]

`lt` 연산자는 구독 알림 필드 값이 필터 값보다 낮으면 `true`로 평가됩니다. 다음 예에서는 구독 알림에 `5`보다 낮은 값을 가진 `size` 필드가 있는 경우 필터는 `true`로 평가합니다.

**가능한 값 유형:** 정수, 부동 소수점, 문자열

```
{
 "fieldName" : "size",
 "operator" : "lt",
 "value" : 5
}
```

------
#### [ ge (greater or equal) ]

`ge` 연산자는 구독 알림 필드 값이 필터 값과 같거나 그보다 크면 `true`로 평가됩니다. 다음 예에서는 구독 알림에 `5`와 같거나 그보다 큰 값을 가진 `size` 필드가 있는 경우 필터는 `true`로 평가합니다.

**가능한 값 유형:** 정수, 부동 소수점, 문자열

```
{
 "fieldName" : "size",
 "operator" : "ge",
 "value" : 5
}
```

------
#### [ gt (greater than) ]

`gt` 연산자는 구독 알림 필드 값이 필터 값보다 크면 `true`로 평가됩니다. 다음 예에서는 구독 알림에 `5`보다 높은 값을 가진 `size` 필드가 있는 경우 필터는 `true`로 평가합니다.

**가능한 값 유형:** 정수, 부동 소수점, 문자열

```
{
 "fieldName" : "size",
 "operator" : "gt",
 "value" : 5
}
```

------
#### [ contains ]

`contains` 연산자는 집합이나 단일 항목의 하위 문자열, 하위 시퀀스 또는 값을 확인합니다. 구독 알림 필드 값에 필터 값이 포함된 경우 `contains` 연산자가 있는 필터는 `true`로 평가됩니다. 다음 예에서는 구독 알림에 값 `10`이 포함된 배열 값이 있는 `seats` 필드가 있는 경우 필터는 `true`로 평가합니다.

**가능한 값 유형:** 정수, 부동 소수점, 문자열

```
{
 "fieldName" : "seats",
 "operator" : "contains",
 "value" : 10
}
```

다른 예로, 필터는 구독 알림에 `launch`가 하위 문자열로 포함된 `event` 필드가 있는 경우 `true`로 평가합니다.

```
{
 "fieldName" : "event",
 "operator" : "contains",
 "value" : "launch"
}
```

------
#### [ notContains ]

`notContains` 연산자는 집합이나 단일 항목에 하위 문자열, 하위 시퀀스 또는 값이 없는지 확인합니다. 구독 알림 필드 값에 필터 값이 포함되지 않은 경우 `notContains` 연산자가 있는 필터는 `true`로 평가됩니다. 다음 예에서는 구독 알림에 값 `10`이 포함되지 않은 배열 값이 있는 `seats` 필드가 있는 경우 필터는 `true`로 평가합니다.

**가능한 값 유형:** 정수, 부동 소수점, 문자열

```
{
 "fieldName" : "seats",
 "operator" : "notContains",
 "value" : 10
}
```

다른 예로, 필터는 구독 알림에 `launch`가 하위 문자열로 포함되지 않은 `event` 필드 값이 있는 경우 `true`로 평가합니다.

```
{
 "fieldName" : "event",
 "operator" : "notContains",
 "value" : "launch"
}
```

------
#### [ beginsWith ]

`beginsWith` 연산자는 문자열에서 접두사를 확인합니다. 구독 알림 필드 값이 필터 값으로 시작하는 경우 `beginsWith` 연산자가 포함된 필터는 `true`로 평가됩니다. 다음 예에서는 구독 알림에 값이 `AWS`로 시작하는 `service` 필드가 있는 경우 필터는 `true`로 평가합니다.

**가능한 값 유형:** 문자열

```
{
 "fieldName" : "service",
 "operator" : "beginsWith",
 "value" : "AWS"
}
```

------
#### [ in ]

`in` 연산자는 배열에서 일치하는 요소가 있는지 확인합니다. `in` 연산자가 포함된 필터는 구독 알림 필드 값이 배열에 존재하는 경우 `true`로 평가됩니다. 다음 예에서는 구독 알림에 `[1,2,3]` 배열에 있는 값 중 하나가 포함된 `severity` 필드가 있는 경우 필터는 `true`로 평가합니다.

**가능한 값 유형:** 정수 배열, 부동 소수점 또는 문자열

```
{
 "fieldName" : "severity",
 "operator" : "in",
 "value" : [1,2,3]
}
```

------
#### [ notIn ]

`notIn` 연산자는 배열에서 누락된 요소가 있는지 확인합니다. `notIn` 연산자가 포함된 필터는 구독 알림 필드 값이 배열에 존재하지 않는 경우 `true`로 평가됩니다. 다음 예에서는 구독 알림에 `[1,2,3]` 배열에 없는 값 중 하나가 포함된 `severity` 필드가 있는 경우 필터는 `true`로 평가합니다.

**가능한 값 유형:** 정수 배열, 부동 소수점 또는 문자열

```
{
 "fieldName" : "severity",
 "operator" : "notIn",
 "value" : [1,2,3]
}
```

------
#### [ between ]

`between` 연산자는 두 숫자 또는 문자열 사이의 값을 확인합니다. 구독 알림 필드 값이 필터의 값 페어 사이에 있는 경우 `between` 연산자가 포함된 필터는 `true`로 평가됩니다. 다음 예에서는 구독 알림에 값이 `2`,`3`,`4`인 `severity` 필드가 있는 경우 필터는 `true`로 평가합니다.

**가능한 값 유형:** 정수 페어, 부동 소수점 또는 문자열

```
{
 "fieldName" : "severity",
 "operator" : "between",
 "value" : [1,5]
}
```

------
#### [ containsAny ]

`containsAny` 연산자는 배열에서 공통된 요소가 있는지 확인합니다. 구독 알림 필드 집합 값 및 필터 집합 값의 교차점이 비어 있지 않은 경우 `containsAny` 연산자가 있는 필터는 `true`로 평가됩니다. 다음 예에서는 구독 알림에 `10` 또는 `15`를 포함하는 배열 값을 가진 `seats` 필드가 있는 경우 필터는 `true`로 평가합니다. 이는 구독 알림에 `[10,11]` 또는 `[15,20,30]`라는 `seats` 필드 값이 있는 경우 필터가 `true`로 평가한다는 의미입니다.

**가능한 값 유형:** 정수, 부동 소수점 또는 문자열

```
{
 "fieldName" : "seats",
 "operator" : "containsAny",
 "value" : [10, 15]
}
```

------

### AND 로직
<a name="extensions-AND-logic"></a>

`filterGroup` 배열의 `filters` 객체 내에 여러 항목을 정의하여 AND 논리를 사용하여 여러 필터를 결합할 수 있습니다. 다음 예에서는 구독 알림에 값이 `1`인 `userId` 필드가 있고(AND) `Admin` 또는 `Developer`인 `group` 필드 값이 있는 경우 필터는 `true`로 평가합니다.

```
{
    "filterGroup": [
        {
           "filters" : [
                 {
                    "fieldName" : "userId",
                    "operator" : "eq",
                    "value" : 1
                },
                {
                    "fieldName" : "group",
                    "operator" : "in",
                    "value" : ["Admin", "Developer"]
                }
           ]
           
        }
    ]
}
```

### OR 로직
<a name="extensions-OR-logic"></a>

`filterGroup` 배열 내에서 여러 필터 객체를 정의하면 OR 논리를 사용하여 여러 필터를 결합할 수 있습니다. 다음 예에서는 구독 알림에 값이 `1`인 `userId` 필드가 있거나(OR) `Admin` 또는 `Developer`인 `group` 필드 값이 있는 경우 필터는 `true`로 평가합니다.

```
{
    "filterGroup": [
        {
           "filters" : [
                 {
                    "fieldName" : "userId",
                    "operator" : "eq",
                    "value" : 1
                }
           ]
           
        },
        {
           "filters" : [
                {
                    "fieldName" : "group",
                    "operator" : "in",
                    "value" : ["Admin", "Developer"]
                }
           ]
           
        }
    ]
}
```

### 예외
<a name="extensions-exceptions"></a>

필터 사용에는 몇 가지 제한이 있다는 점에 유의하세요.
+ `filters` 객체에는 필터당 최대 5개의 고유 `fieldName` 항목이 있을 수 있습니다. 즉, AND 로직을 사용하여 최대 5개의 개별 `fieldName` 객체를 결합할 수 있습니다.
+ `containsAny` 연산자에는 최대 20개의 값이 있을 수 있습니다.
+ `in` 및 `notIn` 연산자에는 최대 5개의 값이 있을 수 있습니다.
+ 각 연결 문자열은 최대 256자입니다.
+ 각 문자열 비교는 대/소문자를 구분합니다.
+ 중첩된 객체 필터링은 최대 5개의 중첩 수준 필터링을 허용합니다.
+ 각 `filterGroup`에는 최대 10개의 `filters`가 있을 수 있습니다. 즉, OR 로직을 사용하여 최대 10개의 개별 `filters`를 결합할 수 있습니다.
  + `in` 연산자는 OR 논리의 특별 사례입니다. 다음 예제에서는 두 가지 `filters`가 있습니다.

    ```
    {
        "filterGroup": [
            {
               "filters" : [
                     {
                        "fieldName" : "userId",
                        "operator" : "eq",
                        "value" : 1
                    },
                    {
                        "fieldName" : "group",
                        "operator" : "in",
                        "value" : ["Admin", "Developer"]
                    }
               ]  
            }
        ]
    }
    ```

    이전 필터 그룹은 다음과 같이 평가되며 최대 필터 한도에 포함됩니다.

    ```
    {
        "filterGroup": [
            {
               "filters" : [
                     {
                        "fieldName" : "userId",
                        "operator" : "eq",
                        "value" : 1
                    },
                    {
                        "fieldName" : "group",
                        "operator" : "eq",
                        "value" : "Admin"
                    }
               ]  
            },
            {
               "filters" : [
                     {
                        "fieldName" : "userId",
                        "operator" : "eq",
                        "value" : 1
                    },
                    {
                        "fieldName" : "group",
                        "operator" : "eq",
                        "value" : "Developer"
                    }
               ]  
            }
        ]
    }
    ```

## 인수: invalidationJsonObject
<a name="extensions-invalidationJsonObject"></a>

`invalidationJsonObject`는 다음을 정의합니다.
+ `subscriptionField` - 무효화할 GraphQL 스키마 구독입니다. `subscriptionField`에서 문자열로 정의된 단일 구독은 무효화 대상으로 간주됩니다.
+ `payload` – 무효화 필터가 해당 값에 대해 `true`로 평가되는 경우 구독 무효화를 위한 입력으로 사용되는 키-값 쌍 목록입니다.

  다음 예에서는 구독 해석기에 정의된 무효화 필터가 `payload` 값에 대해 `true`로 평가될 때 `onUserDelete` 구독을 사용하여 구독 및 연결된 클라이언트를 무효화합니다.

  ```
  $extensions.invalidateSubscriptions({
          "subscriptionField": "onUserDelete",
          "payload": {
                  "group": "Developer"
                  "type" : "Full-Time"
        }
      })
  ```