JSONPath란 무엇인가요?
JSONPath는 JSON 문서를 위한 쿼리 언어로, XML에 XPath가 있듯이 JSON의 동등한 언어입니다. Stefan Goessner가 2007년에 파서 없이 JSON 트리 내의 노드를 가리키는 짧고 읽기 쉬운 방법으로 제안했습니다. 식은 루트 선택자 $로 시작하고 원하는 노드를 선택할 때까지 속성 접근자, 배열 서브스크립트, 와일드카드, 재귀 하강, 필터 조건을 연결합니다. 2024년 IETF가 구현 간에 분열된 구문을 표준화하기 위해 RFC 9535를 발표했습니다; 이 테스터는 Goessner 초안, 대부분의 RFC 9535, 그리고 추가 확장 연산자를 포함하는 널리 사용되는 JavaScript 구현체인 jsonpath-plus로 실행됩니다.
JSONPath 작동 방식
JSONPath 식은 왼쪽에서 오른쪽으로 읽히며 JSON 문서를 한 번에 한 단계씩 탐색합니다. 각 단계는 이전 단계에서 살아남은 노드 집합을 가져와 더 좁힙니다. 전체 평가 파이프라인:
- 루트 선택자
$로 고정합니다. 모든 식은 여기서 시작하여 객체든 배열이든 최상위 값을 가리킵니다. 선행$없는 베어 속성 이름은 유효한 JSONPath가 아닙니다. - 점 표기법(
$.store.book) 또는 대괄호 표기법($['store']['book'])으로 하위 멤버로 이동합니다. 키에 공백, 하이픈, 또는 유효한 식별자가 아닌 문자가 포함된 경우 대괄호 표기법이 필요합니다. - 재귀 하강 연산자
..로 모든 수준을 한 번에 검색합니다.$..author식은 깊이에 관계없이 트리의 어느 곳에서든 모든author값을 수집합니다. 이것이 JMESPath에 없는 연산자입니다. - 인덱스(
[0], jsonpath-plus에서 마지막 항목은[-1])로 배열 요소를 선택하거나,[start:end]표기법([0:3]은 처음 세 개를 반환)으로 슬라이스하거나, 와일드카드[*]로 모든 요소를 가져옵니다. [?(...)]내부의 술어로 요소를 필터링합니다. 술어 내부에서@는 현재 요소를 참조하므로[?(@.price<10)]는price필드가 10 미만인 항목만 유지합니다. 필터는 경로의 나머지와 구성되므로 필터 후 하강하거나, 하강 후 필터링할 수 있습니다.- 출력 형식을 선택합니다. 값은 일치하는 데이터 자체를 반환합니다. 경로는 엔진이 해석한 내용을 볼 수 있도록 각 일치 항목의 JSONPath를 반환합니다. 포인터는 각 일치 항목에 대해 동등한 RFC 6901 JSON 포인터를 반환하며, 하위 소비자가 JSON 패치 또는 JSON 스키마 유효성 검사기일 때 유용합니다.
이 JSONPath 테스터를 사용하는 이유
- JSON이 브라우저를 벗어나지 않습니다. 쿼리가 페이지 내에서 실행되므로 프로덕션 픽스처, 고객 PII, 출시 전 API 응답이 사용자의 기기에 머뭅니다.
- 엔진은 많은 프로덕션 테스트 스위트와 CI 검증을 지원하는 것과 동일한 라이브러리인
jsonpath-plus9.x입니다. 여기서 보는 결과가 빌드 파이프라인이 보게 될 결과와 일치합니다. - 세 가지 출력 모드가 일반적인 하위 소비자를 커버합니다: 복사-붙여넣기를 위한 원시 값, 엔진의 해석을 디버깅하기 위한 경로, JSON 패치 및 JSON 스키마 워크플로를 위한 RFC 6901 포인터.
- 필터 식은
preventEval: true로 실행되므로 붙여넣은 쿼리가 호스트 페이지에 대해 임의의 JavaScript를 실행할 수 없습니다. Slack 메시지, Jira 티켓, 또는 동료의 클립보드에서 식이 왔을 때 중요합니다.
JSONPath의 주요 활용 사례
JSONPath는 코드가 직접 재귀 하강을 작성하지 않고 JSON 페이로드에서 필드를 꺼내야 하는 모든 곳에 등장합니다:
- Postman 테스트: Postman의 테스트 탭은 검증을 위해
pm.response.json()과 JSONPath 스타일 접근을 함께 제공합니다. 팀은$.data.user.email같은 단일 식으로 응답에서 필드를 꺼내 CI에서 검증합니다. - k6 부하 테스트: k6 스크립트는
check()블록 내에서jsonpath()를 호출하여 응답 본문에서 값을 추출하고 SLA 임계값을 검증합니다. Postman에서 계약을 증명한 것과 동일한 식이 k6에서 부하 테스트를 게이트할 수 있습니다. - 데이터 변환을 위한 JSON DSL: AWS Step Functions는
InputPath,ResultPath,Parameters내에서 JSONPath를 평가하여 상태 사이에서 이벤트 페이로드를 재구성합니다. Argo Workflows는withParam에서 JSONPath를 사용하여 배열에서 태스크를 팬아웃합니다. Kubernetes의kubectl -o jsonpath는 같은 구문을 사용하여 클러스터 객체에서 필드를 추출합니다.
실제 예시
정식 Goessner 픽스처는 각각 category, author, title, price를 가진 네 권의 책이 있는 서점 문서입니다. 그 픽스처에 대해 $.store.book[?(@.price<10)].title 식은 세 단계로 실행됩니다. 먼저 $.store.book이 네 권 모두의 배열로 해석됩니다. 다음으로 필터 [?(@.price<10)]가 10 미만으로 가격이 책정된 책(8.95의 항목)만 유지합니다. 마지막으로 .title이 그 책의 제목을 추출합니다. 결과는 ["Sayings of the Century"]입니다. 경로로 전환하면 ["$['store']['book'][0]['title']"]를 반환하고, 포인터는 ["/store/book/0/title"]를 반환합니다.
여기서 식을 프로토타이핑한 다음 Postman, k6, kubectl, 또는 Step Functions 상태 머신에 바로 넣으세요. 붙여넣고, 쿼리하고, 복사하세요. 아무것도 네트워크를 넘지 않습니다.
JSONPath란 무엇인가요?
JSONPath는 JSON 문서를 위한 쿼리 언어로, XML의 XPath에 유사합니다. Stefan Goessner가 2007년에 제안하고 IETF가 2024년 RFC 9535로 표준화했으며, $(문서 루트)로 시작하는 간결한 식 구문을 사용하고 점 표기법, 배열 서브스크립트, 와일드카드, 슬라이스, 재귀 하강(..), 필터 식([?(...)])을 지원하여 JSON 트리 내의 노드를 선택합니다.
JSONPath와 JMESPath 또는 jq의 차이점은 무엇인가요?
세 가지 모두 JSON을 쿼리하지만 문법과 목표가 다릅니다. JMESPath는 AWS CLI/SDK 표준입니다: JSONPath보다 엄격하고, 재귀 하강이 없으며, 예측 가능한 부작용 없는 프로젝션을 위해 만들어졌습니다. jq는 JSON을 쿼리할 뿐만 아니라 변환, 축소, 스트리밍하는 튜링 완전 스크립팅 언어입니다. JSONPath는 그 사이에 위치합니다: 재귀 하강과 필터 덕분에 JMESPath보다 표현력이 높고, jq보다 가벼우며, 범용 테스트 도구(Postman, Playwright, REST Assured, kubectl, Step Functions)에서 가장 널리 지원되는 구문입니다. 이 테스터는 JSONPath를 구현합니다.
이 테스터는 어떤 방언을 사용하나요?
이 테스터는 jsonpath-plus 9.x를 실행합니다. 이 라이브러리는 Goessner 2007 명세를 구현하고, 대부분의 RFC 9535를 포함하며, 타입 검사(@.string(), @.number(), @.boolean())와 부모 탐색(^) 같은 확장 연산자를 추가합니다. preventEval: true 플래그가 항상 설정되어 있어 필터 술어가 JavaScript의 eval() 내장 함수 대신 안전한 인터프리터를 통해 실행됩니다. 붙여넣은 쿼리가 이 페이지에 대해 임의 코드를 실행할 수 없습니다.
개별 일치 값을 복사할 수 있나요?
네. 클립보드에 복사 버튼은 전체 결과 블록을 JSON 배열로 복사합니다. 단일 값을 가져오려면 출력 모드를 값으로 전환하고, 결과 textarea에서 원하는 줄을 선택하고 브라우저의 일반 복사 단축키(Ctrl/Cmd + C)를 사용하세요. 출력은 일반 JSON 텍스트이므로 코드 편집기, 터미널, Postman 테스트, 또는 Slack 메시지에 깔끔하게 붙여넣어집니다.