← 모두의 툴

JSONPath 완전정리 — 이 도구가 [0:2] 슬라이싱을 지원하지 않는 이유

가이드 · 2026-08-19 최종 확인

JSONPath는 XML의 XPath에 해당하는 JSON용 쿼리 언어입니다. 2007년 Stefan Goessner가 처음 제안한 뒤 오랫동안 "느슨한 표준"으로 여러 언어에서 조금씩 다르게 구현되다가, 2024년에야 RFC 9535로 정식 표준화됐습니다. 이 느슨함 때문에 구현체마다 지원 범위가 제각각인데, 이 가이드는 표준 문법 전체를 정리하면서 이 도구가 정확히 어디까지 지원하는지 실제 소스 코드를 기준으로 밝힙니다.

1. 기본 문법: 어디서나 통하는 것들

표기의미
$루트(최상위) 객체
.key 또는 ['key']자식 필드 접근
..key재귀 하강 — 모든 깊이에서 key를 찾음
*와일드카드 — 모든 자식 요소
[n]배열의 n번째 요소(음수는 뒤에서부터)

이 다섯 가지는 사실상 모든 JSONPath 구현체가 지원하는 최소 공통분모입니다.

2. 이 도구가 실제로 지원하는 문법 (소스 코드 확인)

이 도구는 경로 문자열을 문자 단위로 순회하며 토큰을 만드는 자체 파서를 사용합니다. 실제 로직을 보면 다음을 지원합니다: $(루트), .(자식), ..(재귀 하강, 연속된 마침표 두 개를 감지해 recursive 토큰 생성), *(와일드카드), [n](정수 인덱스, 음수 지원), 그리고 [?(@.key op val)] 형태의 필터 표현식(==, !=, >, >=, <, <= 지원, 정규식 /\?\(@\.(\w+)\s*(==|!=|>|>=|<|<=)\s*(.+)\)/로 파싱). 이 정도만으로도 $.store.books[*].title이나 $..price, [?(@.price > 10)] 같은 일반적인 쿼리는 문제없이 동작합니다.

3. 슬라이싱([0:2]) — 단순 미지원이 아니라 조용히 오해석됨

표준 JSONPath 일부 구현체(Python의 jsonpath-ng, JS의 jsonpath-plus 등)는 파이썬 슬라이스 문법을 빌린 [start:end] 또는 [start:end:step] 범위 슬라이싱을 지원합니다. 이 도구의 대괄호 처리 로직을 보면, 대괄호 안 내용이 *도 아니고 ?(로 시작하지도 않으면 parseInt(inner)로 정수 인덱스 취급을 시도합니다.

실제로 벌어지는 일: parseInt("0:2")는 자바스크립트에서 콜론을 만나는 순간 파싱을 멈추고 0을 반환합니다. isNaN(0)은 false이므로, 이 코드는 [0:2]를 "슬라이스 범위"가 아니라 그냥 인덱스 0으로 조용히 오해석해 첫 번째 요소 하나만 반환합니다. 에러도 안 뜨고 빈 결과도 아닌, 사용자가 의도한 것과 다른 결과가 아무 경고 없이 나오는 게 이 버그의 핵심입니다.

즉 "슬라이싱을 지원하지 않는다"는 이 도구의 FAQ 설명은 정확하지만, 실제 동작은 단순히 "안 됨"이 아니라 "다른 걸로 오해되어 그럴듯한 값이 나옴"이라는 점에서 사용자가 특히 주의해야 합니다. [0:2]로 여러 개를 뽑으려던 사용자가 결과 개수를 확인하지 않으면, 요소 하나만 받고도 슬라이싱이 됐다고 착각할 수 있습니다.

4. 이 도구에서 지원 안 되는 나머지 고급 문법

5. 실무 가이드: 이 도구로 안전하게 쓰는 법

이 도구에서 확실히 신뢰할 수 있는 문법은 $, ./[] 자식 접근, .. 재귀 하강, * 와일드카드, 단일 정수 인덱스(양수·음수), [?(@.key op val)] 필터 여섯 가지입니다. 슬라이싱이나 다중 인덱스, 복잡한 표현식이 필요하다면 이 도구 대신 실제 코드에서 jsonpath-plus(JS) 같은 완전한 라이브러리를 쓰는 것이 안전합니다. 특히 콜론(:)이 들어간 대괄호 표현식은 이 도구에 절대 입력하지 말고, 필요하면 인덱스를 하나씩 나눠서 여러 번 조회하세요.

자주 묻는 질문

Q. [0:2]를 입력하면 에러가 뜨나요?

A. 아니요. 에러 없이 조용히 인덱스 0번 요소 하나만 반환합니다. 슬라이싱을 시도했는데 결과가 1개만 나온다면 이 오해석 때문일 가능성이 높습니다.

Q. 필터 표현식에서 문자열 비교도 되나요?

A. 정규식 파서가 @.key op val에서 val 부분을 (.+)로 그대로 캡처한 뒤 비교하므로, 숫자든 문자열이든 값 자체는 넣을 수 있습니다. 다만 따옴표 처리나 논리 연산자(&&, ||) 결합은 지원하지 않습니다.

Q. RFC 9535 표준을 완전히 준수하나요?

A. 아닙니다. 이 도구는 자체 구현한 경량 파서로, RFC 9535가 정의하는 슬라이싱·다중 선택자·함수 확장 등 고급 기능은 지원하지 않습니다. 기본적인 자식/재귀/와일드카드/인덱스/필터만 지원합니다.

Q. JSONPath와 JMESPath는 같은 건가요?

A. 다릅니다. JSONPath는 XPath 스타일 경로 표기를 따르고 폭넓게 쓰이지만 표준화가 늦었고, JMESPath는 AWS CLI가 채택한 더 엄격한 스펙의 쿼리 언어입니다. 문법 자체가 서로 호환되지 않습니다.