

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

# JSON 데이터 유형 개요
<a name="json-document-overview"></a>

ElastiCache는 JSON 데이터 유형으로 작업하기 위해 다양한 Valkey 및 Redis OSS 명령을 지원합니다. 다음은 JSON 데이터 유형의 개요 및 지원되는 명령의 세부 목록입니다.

## 용어
<a name="json-terminology"></a>


****  

| Term | 설명 | 
| --- | --- | 
|  JSON 문서 | JSON 키의 값을 참조합니다. | 
|  JSON 값 | 전체 문서를 나타내는 루트를 포함하는 JSON 문서의 하위 집합을 참조합니다. 값은 컨테이너 또는 컨테이너 내의 항목일 수 있습니다. | 
|  JSON 요소 | JSON 값과 같습니다. | 

## 지원되는 JSON 표준
<a name="Supported-JSON-Standard"></a>

JSON 형식은 [RFC 7159](https://www.ietf.org/rfc/rfc7159.txt) 및 [ECMA-404](https://www.ietf.org/rfc/rfc7159.txt) JSON 데이터 교환 표준과 호환됩니다. JSON 형식 텍스트에서 UTF-8 [유니코드](https://www.unicode.org/standard/WhatIsUnicode.html)가 지원됩니다.

## 루트 요소
<a name="json-root-element"></a>

루트 요소는 모든 JSON 데이터 유형일 수 있습니다. 이전 RFC 4627에서는 객체 또는 배열만 루트 값으로 허용되었습니다. RFC 7159로 업데이트한 이후 JSON 문서의 루트는 모든 JSON 데이터 유형이 될 수 있습니다.

## 문서 크기 제한
<a name="json-document-size-limit"></a>

JSON 문서는 내부적으로 신속한 액세스 및 수정을 위해 최적화된 형식으로 저장됩니다. 이 형식은 일반적으로 동일한 문서의 동등하게 직렬화된 표현보다 어느 정도 더 많은 메모리를 소비하게 됩니다.

단일 JSON 문서에 의한 메모리 소비는 64MB로 제한됩니다. 이는 JSON 문자열이 아닌 메모리 내 데이터 구조의 크기입니다. `JSON.DEBUG MEMORY` 명령을 사용하여 JSON 문서가 소비하는 메모리 양을 확인할 수 있습니다.

## JSON ACL
<a name="json-acls"></a>
+ 기존의 데이터 유형별 범주(@string, @hash 등)와 유사합니다. JSON 명령 및 데이터에 대한 액세스 권한 관리를 단순화하기 위해 새 범주 @json이 추가되었습니다. 다른 기존 Valkey 또는 Redis OSS 명령은 @json 범주에 속하지 않습니다. 모든 JSON 명령은 모든 키스페이스 또는 명령 제한 및 권한을 적용합니다.
+ @read, @write, @fast, @slow 및 @admin과 같은 새로운 JSON 명령을 포함하기 위해 업데이트된 다섯 가지 기존 Valkey 또는 Redis OSS ACL 범주가 있습니다. 다음의 표는 JSON 명령이 적절한 범주에 매핑되었음을 나타냅니다.


**ACL**  

| JSON 명령 | @read | @write | @fast | @slow | @admin | 
| --- | --- | --- | --- | --- | --- | 
|  JSON.ARRAPPEND |  | y | y |  |  | 
|  JSON.ARRINDEX | y |  | y |  |  | 
|  JSON.ARRINSERT |  | y | y |  |  | 
|  JSON.ARRLEN | y |  | y |  |  | 
|  JSON.ARRPOP |  | y | y |  |  | 
|  JSON.ARRTRIM |  | y | y |  |  | 
|  JSON.CLEAR |  | y | y |  |  | 
|  JSON.DEBUG | y |  |  | y | y | 
|  JSON.DEL |  | y | y |  |  | 
|  JSON.FORGET |  | y | y |  |  | 
|  JSON.GET | y |  | y |  |  | 
|  JSON.MGET | y |  | y |  |  | 
|  JSON.NUMINCRBY |  | y | y |  |  | 
|  JSON.NUMMULTBY |  | y | y |  |  | 
|  JSON.OBJKEYS | y |  | y |  |  | 
|  JSON.OBJLEN | y |  | y |  |  | 
|  JSON.RESP | y |  | y |  |  | 
|  JSON.SET |  | y |  | y |  | 
|  JSON.STRAPPEND |  | y | y |  |  | 
|  JSON.STRLEN | y |  | y |  |  | 
|  JSON.STRLEN | y |  | y |  |  | 
|  JSON.TOGGLE |  | y | y |  |  | 
|  JSON.TYPE | y |  | y |  |  | 
|  JSON.NUMINCRBY |  | y | y |  |  | 

## 중첩 깊이 제한
<a name="json-nesting-depth-limit"></a>

JSON 객체 또는 배열에 자체로 또 다른 JSON 객체 또는 배열인 요소가 있는 경우, 해당 내부 객체 또는 배열은 외부 객체 또는 배열 내에 '중첩'된다고 합니다. 최대 중첩 깊이 제한은 128입니다. 중첩 깊이가 128보다 큰 문서를 만들려는 시도는 오류와 함께 거부됩니다.

## 명령 구문
<a name="json-command-syntax"></a>

대부분의 명령에는 첫 번째 인수로 키 이름이 필요합니다. 일부 명령에는 path 인수도 있습니다. path 인수가 선택 사항이며 제공되지 않는 경우 기본적으로 루트로 설정됩니다.

 표기법
+ 필수 인수는 각괄호로 묶습니다. 예: <key>
+ 선택적 인수는 대괄호로 묶습니다. 예: [path]
+ 추가 선택적 인수는 줄임표('...')로 표시됩니다. 예: [json...]

## 경로 구문
<a name="json-path-syntax"></a>

Redis JSON은 다음과 같은 두 가지 종류의 경로 구문을 지원합니다.
+ **향상된 구문** - 다음의 표에 표시된 대로 [Goessner](https://goessner.net/articles/JsonPath/)에서 설명하는 JSONPath 구문을 따릅니다. 명확하게 하기 위해 표의 설명을 재정렬하고 수정했습니다.
+ **제한된 구문(Restricted syntax)** - 쿼리 기능이 제한되었습니다.

**참고**  
일부 명령의 결과는 사용되는 경로 구문 유형에 민감합니다.

 쿼리 경로가 '\$1'로 시작하는 경우 향상된 구문을 사용합니다. 그렇지 않으면 제한된 구문이 사용됩니다.

**향상된 구문**


****  

| 기호/표현식 | 설명 | 
| --- | --- | 
|  \$1 | 루트 요소. | 
|  . 또는 [] | 하위 연산자. | 
|  .. | 재귀 하강. | 
|  \$1 | 와일드카드. 객체 또는 배열의 모든 요소. | 
|  [] | 배열 아래 첨자 연산자. 인덱스는 0부터 시작합니다. | 
|  [,] | 조합 연산자. | 
|  [start:end:step] | 배열 조각 연산자. | 
|  ?() | 현재 배열 또는 객체에 필터(스크립트) 표현식을 적용합니다. | 
|  () | 필터 표현식. | 
|  @ | 처리 중인 현재 노드를 참조하는 필터 표현식에 사용됩니다. | 
|  == | 같음, 필터 표현식에 사용됩니다. | 
|  \$1= | 같지 않음, 필터 표현식에 사용됩니다. | 
|  > | 더 큼, 필터 표현식에 사용됩니다. | 
|  >= | 더 크거나 같음, 필터 표현식에 사용됩니다. | 
|  < | 더 작음, 필터 표현식에 사용됩니다. | 
|  <= | 더 작거나 같음, 필터 표현식에 사용됩니다. | 
|  && | 논리적 AND, 여러 필터 표현식을 결합하는 데 사용됩니다. | 
|  \$1\$1 | 논리적 OR, 여러 필터 표현식을 결합하는 데 사용됩니다. | 

**예**

다음의 예는 추가 필드를 추가하여 수정한 [Goessner의](https://goessner.net/articles/JsonPath/) XML 데이터 예를 기반으로 구축되었습니다.

```
{ "store": {
    "book": [ 
      { "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95,
        "in-stock": true,
        "sold": true
      },
      { "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99,
        "in-stock": false,
        "sold": true
      },
      { "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99,
        "in-stock": true,
        "sold": false
      },
      { "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99,
        "in-stock": false,
        "sold": false
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95,
      "in-stock": true,
      "sold": false
    }
  }
}
```


****  

| 경로 | 설명 | 
| --- | --- | 
|  \$1.store.book[\$1].author | 상점에 있는 모든 책의 저자. | 
|  \$1..author | 모든 저자. | 
|  \$1.store.\$1 | 상점의 모든 구성원. | 
|  \$1["store"].\$1 | 상점의 모든 구성원. | 
|  \$1.store..price | 상점에 있는 모든 것의 가격. | 
|  \$1..\$1 | JSON 구조의 모든 재귀 멤버. | 
|  \$1..book[\$1] | 모든 책. | 
|  \$1..book[0] | 첫 번째 책. | 
|  \$1..book[-1] | 마지막 책. | 
|  \$1..book[0:2] | 처음 두 권의 책. | 
|  \$1..book[0,1] | 처음 두 권의 책. | 
|  \$1..book[0:4] | 인덱스 0에서 3까지의 책(끝 인덱스는 포괄적이지 않음). | 
|  \$1..book[0:4:2] | 인덱스 0, 2의 책. | 
|  \$1..book[?(@.isbn)] | ISBN 번호가 있는 모든 책. | 
|  \$1..book[?(@.price<10)] | 모든 책이 10달러보다 저렴합니다.. | 
|  '\$1..book[?(@.price < 10)]' | 모든 책이 10달러보다 저렴합니다. (경로에 공백이 포함된 경우 따옴표로 묶어야 합니다.) | 
|  '\$1..book[?(@["price"] < 10)]' | 모든 책이 10달러보다 저렴합니다.. | 
|  '\$1..book[?(@.["price"] < 10)]' | 모든 책이 10달러보다 저렴합니다.. | 
|  \$1..book[?(@.price>=10&&@.price<=100)] | 가격대가 10달러에서 100달러인 모든 책, 포괄적. | 
|  '\$1..book[?(@.price>=10 && @.price<=100)]' | 가격대가 10달러에서 100달러인 모든 책, 포괄적. (경로에 공백이 포함된 경우 따옴표로 묶어야 합니다.) | 
|  \$1..book[?(@.sold==true\$1\$1@.in-stock==false)] | 모든 책이 매각 또는 품절되었습니다. | 
|  '\$1..book[?(@.sold == true \$1\$1 @.in-stock == false)]' | 모든 책이 매각 또는 품절되었습니다. (경로에 공백이 포함된 경우 따옴표로 묶어야 합니다.) | 
|  '\$1.store.book[?(@.["category"] == "fiction")]' | 소설 범주의 모든 책. | 
|  '\$1.store.book[?(@.["category"] \$1= "fiction")]' | 비소설 범주의 모든 책. | 

추가 필터 표현식의 예:

```
127.0.0.1:6379> JSON.SET k1 . '{"books": [{"price":5,"sold":true,"in-stock":true,"title":"foo"}, {"price":15,"sold":false,"title":"abc"}]}'
OK
127.0.0.1:6379> JSON.GET k1 $.books[?(@.price>1&&@.price<20&&@.in-stock)]
"[{\"price\":5,\"sold\":true,\"in-stock\":true,\"title\":\"foo\"}]"
127.0.0.1:6379> JSON.GET k1 '$.books[?(@.price>1 && @.price<20 && @.in-stock)]'
"[{\"price\":5,\"sold\":true,\"in-stock\":true,\"title\":\"foo\"}]"
127.0.0.1:6379> JSON.GET k1 '$.books[?((@.price>1 && @.price<20) && (@.sold==false))]'
"[{\"price\":15,\"sold\":false,\"title\":\"abc\"}]"
127.0.0.1:6379> JSON.GET k1 '$.books[?(@.title == "abc")]'
[{"price":15,"sold":false,"title":"abc"}]

127.0.0.1:6379> JSON.SET k2 . '[1,2,3,4,5]'
127.0.0.1:6379> JSON.GET k2 $.*.[?(@>2)]
"[3,4,5]"
127.0.0.1:6379> JSON.GET k2 '$.*.[?(@ > 2)]'
"[3,4,5]"

127.0.0.1:6379> JSON.SET k3 . '[true,false,true,false,null,1,2,3,4]'
OK
127.0.0.1:6379> JSON.GET k3 $.*.[?(@==true)]
"[true,true]"
127.0.0.1:6379> JSON.GET k3 '$.*.[?(@ == true)]'
"[true,true]"
127.0.0.1:6379> JSON.GET k3 $.*.[?(@>1)]
"[2,3,4]"
127.0.0.1:6379> JSON.GET k3 '$.*.[?(@ > 1)]'
"[2,3,4]"
```

**제한된 구문(Restricted syntax)**


****  

| 기호/표현식 | 설명 | 
| --- | --- | 
|  . 또는 [] | 하위 연산자. | 
|  [] | 배열 아래 첨자 연산자. 인덱스는 0부터 시작합니다. | 

**예시**


****  

| 경로 | 설명 | 
| --- | --- | 
|  .store.book[0].author | 첫 번째 책의 저자. | 
|  .store.book[-1].author | 마지막 책의 저자. | 
|  .address.city | 도시 이름. | 
|  ["store"]["book"][0]["title"] | 첫 번째 책의 제목. | 
|  ["store"]["book"][-1]["title"] | 마지막 책의 제목. | 

**참고**  
이 문서에 인용된 모든 [Goessner](https://goessner.net/articles/JsonPath/) 콘텐츠는 [크리에이티브 커먼즈 라이선스](https://creativecommons.org/licenses/by/2.5/)에 해당합니다.

## 일반적인 오류 접두사
<a name="json-error-prefixes"></a>

각 오류 메시지에는 접두사가 있습니다. 다음은 일반적인 오류 접두사 목록입니다.


****  

| Prefix | 설명 | 
| --- | --- | 
|  ERR | 일반 오류. | 
|  LIMIT | 크기 제한을 초과한 경우 발생하는 오류입니다. 예: 문서 크기 제한 또는 중첩 깊이 제한이 초과되었습니다. | 
|  NONEXISTENT | 키 또는 경로가 존재하지 않습니다. | 
|  OUTOFBOUNDARIES | 배열 인덱스가 범위를 벗어났습니다. | 
|  SYNTAXERR | 구문 오류. | 
|  WRONGTYPE | 잘못된 값 유형. | 

## JSON-관련 지표
<a name="json-info-metrics"></a>

다음과 같은 JSON 정보 지표가 제공됩니다.


****  

| 정보 | 설명 | 
| --- | --- | 
|  json\$1total\$1memory\$1bytes | JSON 객체에 할당되는 총 메모리. | 
|  json\$1num\$1documents | Valkey 또는 Redis OSS의 총 문서 수. | 

핵심 지표를 쿼리하려면 다음과 같은 명령을 실행합니다.

```
info json_core_metrics
```

## ElastiCache for Valkey 및 Redis OSS가 JSON과 상호 작용하는 방법
<a name="json-differences"></a>

다음의 섹션에서는 ElastiCache for Valkey 및 Redis OSS가 JSON과 상호 작용하는 방법을 설명합니다.

### 연산자 우선순위
<a name="json-operator-precedence"></a>

필터링에 대한 조건식을 평가하는 경우 &&s가 먼저 평가되고 그 다음 \$1\$1s가 평가되는데, 이는 대부분의 언어에서 일반적으로 사용됩니다. 괄호 안의 연산이 먼저 실행됩니다.

### 최대 경로 중첩 제한 동작
<a name="json-max-path"></a>

 ElastiCache for Redis OSS의 최대 경로 중첩 제한은 128입니다. 따라서 `$.a.b.c.d...`와 같은 값은 128수준까지만 도달할 수 있습니다.

### 숫자 값 처리
<a name="json-about-numbers"></a>

JSON에는 정수와 부동 소수점 숫자에 대해 별도의 데이터 유형이 없습니다. 모두 숫자라고 부릅니다.

숫자 표현:

입력 시 JSON 번호가 수신되면 해당 번호는 부호가 있는 64비트 정수 또는 64비트 IEEE 배정밀도 부동 소수점과 같은 두 개의 내부 이진 표현 중 하나로 변환됩니다. 원래 문자열 및 모든해당 서식은 보관되지 않습니다. 따라서 JSON 응답의 일부로 숫자가 출력되면 해당 숫자는 내부 이진 표현에서 일반 서식 규칙을 사용하는 인쇄 가능한 문자열로 변환됩니다. 이러한 규칙은 수신된 문자열과 다른 문자열이 생성될 수 있습니다.

산술 명령어 `NUMINCRBY`과 `NUMMULTBY`:
+ 두 숫자가 모두 정수이고 결과가 `int64`의 범위를 벗어나는 경우 자동으로 64비트 IEEE 배정밀도 부동 소수점 숫자가 됩니다.
+ 숫자 중 하나 이상이 부동 소수점인 경우 결과는 64비트 IEEE 배정밀도 부동 소수점 숫자입니다.
+ 결과가 64비트 IEEE 배정밀도 범위를 초과한 경우 명령은 `OVERFLOW` 오류를 반환합니다.

사용할 수 있는 명령의 자세한 목록은 [지원되는 Valkey 및 Redis OSS 명령JSON 명령](json-list-commands.md) 섹션을 참조하세요.

### 직접 배열 필터링
<a name="json-direct-array-filtering"></a>

ElastiCache for Valkey 및 Redis OSS는 직접 객체 배열을 필터링합니다.

`[0,1,2,3,4,5,6]`과 같은 데이터 및 `$[?(@<4)]`와 같은 경로 쿼리, 또는 `{"my_key":[0,1,2,3,4,5,6]}`과 같은 데이터 및 `$.my_key[?(@<4)]`와 같은 경로 쿼리의 경우 ElastiCache는 두 경우 모두 [1,2,3]을 반환합니다.

### 배열 인덱싱 동작
<a name="json-direct-array-indexing"></a>

ElastiCache for Valkey 및 Redis OSS는 배열에 대해 포지티브 및 네거티브 인덱스 모두를 허용합니다. 길이가 5인 배열의 경우 0이 첫 번째 요소, 1이 두 번째 요소를 쿼리하는 식입니다. 음수는 배열의 끝에서 시작하므로 -1은 다섯 번째 요소를 쿼리하고, -2는 네 번째 요소를 쿼리하는 식입니다.

고객의 예측 가능한 행동을 보장하려면 ElastiCache는 배열 인덱스를 반올림이나 반내림하지 않습니다. 따라서 길이가 5인 배열이 있는 경우 인덱스 5 이상 또는 -6 이하를 직접 호출하면 결과가 생성되지 않습니다.

### 엄격한 구문 평가
<a name="json-strict-syntax-evaluation"></a>

MemoryDB에서는 경로의 하위 집합에 유효한 경로가 포함되어 있더라도 잘못된 구문으로 JSON 경로를 허용하지 않습니다. 이는 고객에게 올바른 행동을 유지하는 것과 같습니다.