

신중한 고려 끝에 Amazon Kinesis Data Analytics for SQL 애플리케이션을 중단하기로 결정했습니다.

1. **2025년 9월 1**일부터 Amazon Kinesis Data Analytics for SQL 애플리케이션에 대한 버그 수정은 제공되지 않습니다. 곧 중단될 예정이므로 지원이 제한될 예정이기 때문입니다.

2. **2025년 10월 15**일부터 새 Kinesis Data Analytics for SQL 애플리케이션을 생성할 수 없습니다.

3. **2026년 1월 27**일부터 애플리케이션이 삭제됩니다. Amazon Kinesis Data Analytics for SQL 애플리케이션을 시작하거나 작동할 수 없게 됩니다. 그 시점부터 Amazon Kinesis Data Analytics for SQL에 대한 지원을 더 이상 이용할 수 없습니다. 자세한 내용은 [Amazon Kinesis Data Analytics for SQL 애플리케이션 단종](discontinuation.md) 단원을 참조하십시오.

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

# JSONPath로 작업하기
<a name="about-json-path"></a>

**참고**  
2023년 9월 12일 이후에는 Kinesis Data Analytics for SQL의 기존 사용자가 아닌 경우, Kinesis Data Firehose를 소스로 사용하여 새 애플리케이션을 생성할 수 없습니다. 자세한 설명은 [제한](https://docs.aws.amazon.com//kinesisanalytics/latest/dev/limits.html)을 참조하십시오.

JSONPath는 JSON 객체의 요소를 쿼리하는 표준화된 방법입니다. JSONPath는 경로 표현식을 사용하여 JSON 문서에서 요소, 중첩된 요소 및 배열을 탐색합니다. JSON에 대한 자세한 설명은 [JSON 소개](http://www.json.org/)를 참조하십시오.

Amazon Kinesis Data Analytics는 애플리케이션의 소스 스키마에 JSONPath 표현식을 사용하여 스트리밍 소스에서 JSON 형식의 데이터가 포함된 데이터 요소를 식별합니다.

스트리밍 데이터를 애플리케이션의 입력 스트림에 매핑하는 방법에 대한 자세한 설명은 [스트리밍 소스 요소를 SQL 입력 열에 매핑하기](sch-mapping.md) 섹션을 참조하십시오.

## JSONPath로 JSON 요소에 액세스하기
<a name="about-json-path-elements"></a>

JSONPath 표현식을 사용하여 JSON 형식 데이터의 다양한 요소에 액세스하는 방법을 알아볼 수 있습니다. 이 섹션의 예에서는 소스 스트림에 다음 JSON 레코드가 포함된 것으로 가정합니다.

```
{
  "customerName":"John Doe",
  "address":
  {
    "streetAddress":
    [
      "number":"123",
      "street":"AnyStreet"
    ],
    "city":"Anytown"
  }
  "orders":
  [
    { "orderId":"23284", "itemName":"Widget", "itemPrice":"33.99" },
    { "orderId":"63122", "itemName":"Gadget", "itemPrice":"22.50" },
    { "orderId":"77284", "itemName":"Sprocket", "itemPrice":"12.00" }
  ]
}
```

### JSON 요소에 액세스
<a name="about-json-path-firstlevel"></a>

JSONPath를 사용하여 JSON 데이터에 있는 요소를 쿼리하려면 다음의 구문을 사용합니다. 여기에서, `$`는 데이터 계층의 루트를 나타내고 `elementName`은 쿼리에 대한 요소 노드의 명칭입니다.

```
$.{{elementName}}
```

다음 표현식은 앞의 JSON 예제에 있는 `customerName` 요소를 쿼리하는 것이다.

```
$.customerName
```

앞의 표현식은 앞선 JSON 레코드로부터 다음을 반환합니다.

```
John Doe
```

**참고**  
경로 표현식은 대/소문자를 구분합니다. 표현식 `$.customername`은 앞선 JSON 예로부터 `null`을 반환합니다.

**참고**  
경로 표현식에서 지정한 위치에 요소가 나타나지 않을 경우, 표현식은 `null`을 반환합니다. 다음 표현식은 앞선 JSON 예로부터 `null`을 반환하는데, 일치하는 요소가 없기 때문입니다.  

```
$.customerId
```

### 중첩된 JSON 요소에 대한 액세스
<a name="about-json-path-nested"></a>

중첩된 JSON 요소를 쿼리하려면 다음 문구를 사용합니다.

```
$.{{parentElement}}.{{element}}
```

다음 표현식은 앞의 JSON 예제에 있는 `city` 요소를 쿼리하는 것이다.

```
$.address.city
```

앞의 표현식은 앞선 JSON 레코드로부터 다음을 반환합니다.

```
Anytown
```

다음 문구를 사용하여 하위 요소를 쿼리할 수 있습니다.

```
$.{{parentElement}}.{{element}}.{{subElement}}
```

다음 표현식은 앞의 JSON 예제에 있는 `street` 요소를 쿼리하는 것이다.

```
$.address.streetAddress.street
```

앞의 표현식은 앞선 JSON 레코드로부터 다음을 반환합니다.

```
AnyStreet
```

### 배열 액세스
<a name="about-json-path-arrays"></a>

다음과 같은 방법으로 JSON 배열의 데이터에 액세스할 수 있습니다.
+ 배열의 모든 요소를 단일 행으로 검색합니다.
+ 배열의 각 요소를 별도의 행으로 검색합니다.

#### 배열의 모든 요소를 단일 행으로 검색
<a name="about-json-path-arrays-row"></a>

배열의 전체 콘텐츠를 단일 행으로 쿼리하려면 다음의 구문을 사용합니다.

```
$.{{arrayObject}}[0:]
```

다음 표현식은 이 섹션에 사용된 위의 JSON 예에 있는 `orders` 요소의 전체 콘텐츠를 쿼리합니다. 단일 열 단일 행에 있는 배열 콘텐츠를 반환합니다.

```
$.orders[0:]
```

앞의 표현식은 이 섹션에 사용된 예 JSON 레코드로부터 다음을 반환합니다.

```
[{"orderId":"23284","itemName":"Widget","itemPrice":"33.99"},{"orderId":"61322","itemName":"Gadget","itemPrice":"22.50"},{"orderId":"77284","itemName":"Sprocket","itemPrice":"12.00"}]
```

#### 배열의 모든 요소를 별도의 행으로 검색
<a name="about-json-path-arrays-separate"></a>

배열의 개별 요소를 별도의 행으로 쿼리하려면 다음의 구문을 사용합니다.

```
$.{{arrayObject}}[0:].{{element}}
```

다음 표현식은 위의 JSON 예에 있는 `orderId` 요소를 쿼리하는 것으로 각 배열 요소를 별도의 행으로 반환합니다.

```
$.orders[0:].orderId
```

위의 표현식은 앞에 나온 JSON 레코드로부터 다음을 반환합니다. 이때 각 데이터 항목은 별도의 행으로 반환됩니다.


****  

|  | 
| --- |
| 23284 | 
| 63122 | 
| 77284 | 

**참고**  
비배열 요소를 쿼리하는 표현식이 개별 배열 요소를 쿼리하는 스키마에 포함되어 있는 경우, 비배열 요소는 해당 배열에 있는 각 요소에 대해 반복됩니다. 예를 들어, 위의 JSON 예에 대한 스키마가 다음의 표현식을 포함하고 있다고 가정해 보겠습니다.  
$.customerName
$.orders[0:].orderID
이 경우, 예 입력 스트림 요소로부터 반환된 데이터 행은 다음과 비슷할 것입니다. 이때 모든 `orderId` 요소에 대해 `name` 요소가 반복됩니다.  


****  

|  |  | 
| --- |--- |
| John Doe | 23284 | 
| John Doe | 63122 | 
| John Doe | 77284 | 

**참고**  
Amazon Kinesis Data Analytics에서 배열 표현식에는 다음 제한이 적용됩니다:  
배열 표현식에서는 한 가지 레벨의 역참조만 지원됩니다. 다음의 표현식 형식은 지원되지 않습니다.  

  ```
  $.{{arrayObject}}[0:].{{element}}[0:].{{subElement}}
  ```
한 가지 배열만 스키마에서 평면화할 수 있습니다. 복수의 어레이가 참조되어 – 어레이에 모든 요소가 포함된 하나의 행으로 반환될 수 있습니다. 그러나 하나의 어레이만 개별 행으로 반환되는 요소의 각각을 가질 수 있습니다.  
다음 형식의 요소를 포함하는 스키마는 유효합니다. 이 형식은 두 번째 어레이의 콘텐츠를 단일 열로 반환합니다. 첫 번째 어레이에 있는 모든 요소에 대해 반복됩니다.  

  ```
  {{$.arrayObjectOne}}[0:].{{element}}
  {{$.arrayObjectTwo}}[0:]
  ```
다음 형식의 요소를 포함하는 스키마는 유효하지 않습니다.  

  ```
  {{$.arrayObjectOne}}[0:].{{element}}
  {{$.arrayObjectTwo}}[0:].{{element}}
  ```

## 기타 고려 사항
<a name="about-json-path-other"></a>

JSONPath 작업 시 추가적인 고려 사항은 다음과 같습니다.
+ 애플리케이션 스키마의 JSONPath 표현식에 있는 개별 요소가 배열에 액세스하지 않는 경우, 처리된 각 JSON 레코드에 대해 애플리케이션의 입력 스트림에 단일 행이 생성됩니다.
+ 배열을 평면화할 때(즉, 해당 요소가 개별 행으로 반환됨) 누락된 요소가 있을 경우 애플리케이션 내 스트림에 null 값이 생성됩니다.
+ 배열은 항상 하나 이상의 행에 대해 평면화됩니다. 어떤 값도 반환되지 않는 경우(즉, 어레이가 비어 있거나 요소에 대한 쿼리가 없는 경우) 모든 null 값인 단일 행이 반환됩니다.

  다음 표현식은 앞선 JSON 예로부터 null 값을 지닌 레코드를 반환하는데, 지정된 경로에 일치하는 요소가 없기 때문입니다.

  ```
  $.orders[0:].itemId
  ```

  앞의 표현식은 앞선 JSON 예 레코드로부터 다음을 반환합니다.  
****    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/kinesisanalytics/latest/dev/about-json-path.html)

## 관련 항목
<a name="about-json-path.Related"></a>
+ [JSON 소개](http://www.json.org/)