JSON 경로

JSON 경로 (Path)

Redis JSON은 JSON 문서 안의 특정 요소에 접근하기 위해 JSONPath(제이슨 패스)를 사용해요. 데이터 타입 페이지에서 다뤘듯이, JSON 문서는 서버에 저장되고 클라이언트는 경로를 통해 문서의 일부를 읽고 쓸 수 있죠. 이 페이지에서는 Redis JSON에서 쓰는 경로 문법을 옆에서 설명해 드릴게요.

출처: Redis 공식 문서 — path

JSONPath 소개

Redis JSON은 JSON.SET, JSON.GET 같은 명령에서 경로(path)를 사용해 객체나 배열의 특정 요소에 접근합니다. 경로는 문서의 루트(root)부터 시작해 원하는 위치까지 어떻게 내려가는지를 나타내는 표현식이에요.

점 표기법 (Dot notation)과 괄호 표기법 (Bracket notation)

Redis JSON은 객체 키 접근(object key access)에 **점 표기법(dot notation)**과 **괄호 표기법(bracket notation)**을 모두 지원해요. 예를 들어 루트 아래 inventory의 자식인 headphones를 가리키는 경로는 이렇게 쓸 수 있습니다:

  • .inventory.headphones
  • inventory["headphones"]
  • ['inventory']["headphones"]

배열 요소에 접근하려면 인덱스를 대괄호([ ]) 안에 넣으면 돼요. 인덱스는 0부터 시작하며, 0이 첫 번째 요소, 1이 그다음 요소입니다. 음수 오프셋을 쓰면 배열의 끝에서부터 접근할 수 있어요. 예를 들어 -1은 마지막 요소, -2는 끝에서 두 번째 요소를 가리킵니다.

JSON 키 이름과 경로 호환성 (JSON key names and path compatibility)

정의상 JSON 키는 유효한 JSON 문자열이면 무엇이든 될 수 있어요. 반면 경로(path)는 전통적으로 JavaScript(그리고 Java)의 변수 이름 규칙에 기반합니다.

JSON은 임의의 키 이름을 가진 객체를 저장할 수 있지만, 이런 키에 레거시(legacy) 경로로 접근하려면 다음 명명 구문 규칙을 따라야 해요:

  1. 이름은 글자(letter), 달러 기호($), 또는 밑줄(_)로 시작해야 합니다
  2. 이름에는 글자, 숫자, 달러 기호, 밑줄이 포함될 수 있어요
  3. 이름은 대소문자를 구분합니다 (case-sensitive)

경로 평가의 시간 복잡도 (Time complexity of path evaluation)

경로에서 요소를 탐색(검색)하는 시간 복잡도는 다음으로 계산됩니다:

  1. 자식 레벨 (Child level) – 경로의 각 레벨마다 검색이 하나씩 추가됩니다
  2. 키 검색 (Key search) – O(N)†, 이때 N은 부모 객체의 키 수입니다
  3. 배열 검색 (Array search) – O(1)

즉, 경로를 탐색하는 전체 시간 복잡도는 O(N×M) 이에요. 여기서 N은 경로의 깊이(depth), M은 부모 객체 키의 수입니다.

† N이 작은 객체에서는 이 정도면 괜찮지만, 더 큰 객체에서는 접근을 최적화할 수 있습니다.

더 알아보기 (Learn more)