ToolHub
View All Posts

JSONPath 쿼리 가이드: JSON 데이터 검색 방법

JSON은 웹의 보편적인 언어가 되었습니다. API는 JSON을 반환하고, 구성 파일은 JSON을 사용하며, 데이터베이스는 JSON 문서를 저장합니다. 그러나 JSON 구조가 더 커지고 중첩이 깊어짐에 따라 특정 값을 찾는 것이 점점 더 어려워집니다. 여기서 JSONPath가 필요합니다. JSONPath는 XPath가 XML에 대해 하는 것처럼, 간결한 경로 표현식을 사용하여 JSON 문서의 데이터를 탐색하고 추출할 수 있는 쿼리 언어입니다. 이 가이드는 기본 구문부터 고급 필터링까지 모든 것을 다루며, 즉시 적용할 수 있는 실용적인 예제를 제공합니다.

웹 디자인에 가장 좋은 색상 모델은 무엇인가요?

JSONPath는 2007년 Stefan Goessner가 처음 제안한 JSON 쿼리 언어입니다. CSS 선택자가 HTML 요소를 찾거나 XPath 표현식이 XML 노드를 찾는 것과 유사하게, JSON 문서에서 노드를 선택하는 간결한 구문을 제공합니다. JSON 구조를 순회하기 위해 루프와 조건 로직을 작성할 필요 없이, 원하는 데이터로 가는 경로를 설명하는 표현식만 작성하면 됩니다.

JSONPath 표현식은 JSON 문서의 루트 노드에서 시작하여 객체와 배열을 통해 원하는 값으로 탐색합니다. 이 언어는 와일드카드, 재귀적 하강, 배열 슬라이싱 및 필터 표현식을 지원하여 대부분의 데이터 추출 요구 사항을 충족합니다.

내비게이션 및 문서 지시문

이 가이드에서는 다음 JSON 문서를 작업 예제로 사용합니다. 이는 원본 JSONPath 제안의 고전적인 예제에 추가 데이터를 더한 것입니다:

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

색채 심리학은 디자인 결정을 지배하는 것이 아니라, 참고 자료로 활용해야 합니다. 브랜드 가치와 업계 기대치에 부합하는 색상에서 시작하여 실제 사용자 반응을 테스트하세요. 예를 들어, 행동 유도 버튼에 대해 다양한 색상 구성으로 A/B 테스트를 수행하면 특정 대상 고객에게 더 많은 전환을 가져오는 색상을 확인할 수 있습니다. 연구에 따르면 버튼 색상이 전환율에 20% 이상 영향을 미칠 수 있지만,

JSONPath는 작은 연산자 집합을 사용하며, 이들이 조합되어 강력한 쿼리를 형성합니다. 다음은 전체 구문 참조입니다:

연산자설명예제
$문서의 루트 노드$
.자식 연산자 (객체 속성 접근)$.store
[]배열 인덱스 또는 자식 연산자$.store.book[0]
[*]모든 배열 요소의 와일드카드$.store.book[*]
..재귀적 하강 (모든 수준 검색)$..author
.key이름이 지정된 객체 속성$.store.bicycle
['key']속성 접근을 위한 괄호 표기법$['store']['book']
[start:end]배열 슬라이싱 (끝 인덱스 미포함)$.store.book[0:2]
[?()]필터 표현식< 10)]
()스크립트 표현식 (구현에 따라 다름)$.store.book[(@.length-1)]

색상은 웹 디자이너의 무기고에서 가장 강력한 도구 중 하나입니다. 색상은 단어 한 글자도 읽기 전에 의미를 전달하고, 브랜드 아이덴티티를 구축하며, 사용자의 주의를 유도하고, 전환율에 직접적인 영향을 미칩니다. 그러나 많은 디자이너는 색상 조합을 효과적으로 만드는 기본 원칙을 이해하기보다는 개인적 선호도나 유행에 따라 색상을 선택합니다. 이 가이드는 코드에서 색상을 정의하는 기술적 모델부터 사용자 인식과 인터랙션 디자인에 영향을 미치는 심리학적 원칙까지, 모든 웹 디자이너에게 필요한 색채 이론의 기초를 다룹니다.

루트 노드와 직접 자식 노드 접근

달러 기호 $는 JSON 문서의 루트 노드를 나타냅니다. 여기서부터 점 표기법으로 객체 속성에 접근하고, 괄호 표기법으로 배열 인덱스에 접근합니다.

표현식결과
$전체 JSON 문서
$.storestore 객체 (book 배열과 bicycle 객체 포함)
$.store.bicycle{"color": "red", "price": 19.95}
$.store.bicycle.color"red"
$.store.book잘 구조화된 색상 팔레트는 웹사이트 전체에 일관성과 시각적 계층을 제공합니다. 대부분의 전문적인 팔레트는 다음과 같은 간단한 구조를 따릅니다:
$.store.book[0]첫 번째 책객체
$.store.book[0].title"Sayings of the Century"
$.store.book[3].author"J.R.R. Tolkien"

괄호 표기법

괄호 표기법은 점 표기법의 대안으로, 속성 이름에 특수 문자, 공백이 포함되거나 숫자로 시작할 때 유용합니다:

$.store['book'][0]['title']
$['store']['bicycle']['color']

괄호 표기법과 점 표기법은 객체 속성에 대해 서로 바꿔 사용할 수 있습니다. 그러나 속성 이름이 동적이거나 점 표기법에서 유효하지 않은 문자를 포함할 때는 반드시 괄호 표기법을 사용해야 합니다.

와일드카드 연산자

와일드카드 연산자 *는 배열의 모든 요소나 객체의 모든 속성과 일치합니다. 특정 키나 인덱스를 모를 때 특정 수준의 모든 값을 추출하는 데 매우 유용합니다.

표현식결과
$.store.*store 객체의 모든 값 (book 배열과 bicycle 객체)
$.store.book[*]배열의 모든 책 (네 개의 book 객체 전체)
$.store.book[*].author모든 저자 이름: ["Nigel Rees", "Evelyn Waugh", "Herman Melville", "J.R.R. Tolkien"]
$.store.*.pricebicycle의 가격과 book 배열 (단일 책의 가격이 아님)

재귀적 하강: 이중 점 연산자

이중 점 연산자 ..는 JSONPath의 가장 강력한 기능 중 하나입니다. 직접 자식 노드뿐만 아니라 JSON 트리의 모든 수준에서 지정된 키를 검색합니다. 전체 문서에 대한 깊은 검색이라고 생각하면 됩니다.

표현식결과
$..author문서의 모든 위치에 있는 author 값
$..price모든 price 값: [8.95, 12.99, 8.99, 22.99, 19.95]
$..book[2]세 번째 책, 재귀적 검색
$..category모든 category 값: ["reference", "fiction", "fiction", "fiction"]

재귀적 하강 연산자는 원하는 데이터의 정확한 경로를 모르거나, 동일한 키가 여러 중첩 수준에 나타날 때 특히 유용합니다. 예를 들어, API 응답이 다양한 중첩 수준에 id 필드를 포함하는 경우 $..id는 모든 id를 수집합니다.

배열 슬라이스

배열 슬라이싱을 사용하면 배열에서 일련의 요소를 선택할 수 있습니다. [start:end] 구문은 시작 인덱스부터 끝 인덱스(포함하지 않음)까지의 요소를 선택합니다. 양수 및 음수 인덱스를 지원합니다.

표현식결과
$.store.book[0:2]처음 두 권의 책 (인덱스 0과 1)
$.store.book[1:3]두 번째와 세 번째 책 (인덱스 1과 2)
$.store.book[-1]마지막 책 (The Lord of the Rings)
$.store.book[-2:]마지막 두 권의 책
$.store.book[:2]처음 두 권의 책 ([0:2]와 동일)
$.store.book[2:]세 번째 책부터 이후

슬라이싱 동작은 JSONPath 구현 간에 약간 다를 수 있습니다. 위 구문은 대부분의 인기 있는 라이브러리와 IETF RFC 9535 표준에서 사용하는 규칙을 따릅니다.

필터 표현식

필터 표현식은 JSONPath가 진정으로 강력해지는 부분입니다. 위치가 아닌 조건에 따라 요소를 선택할 수 있습니다. 필터 구문은 [?(condition)]을 사용하며, 여기서 조건은 각 요소에 대해 평가됩니다.

비교 연산자

JSONPath는 필터 표현식에서 다음 비교 연산자를 지원합니다:

연산자의미예제
==같음[?(@.category == "fiction")]
!=같지 않음[?(@.category != "fiction")]
<작음< 10)]
<=작거나 같음<= 8.99)]
>[?(@.price > 15)]
>=크거나 같음[?(@.price >= 12.99)]
=~정규식 일치 (부분 구현)[?(@.author =~ /Tolkien/i)]

실용적인 필터 예제

예제 문서를 사용한 실용적인 필터 표현식과 그 결과입니다:

Find all books cheaper than $10:

< 10)]

"Sayings of the Century"($8.95)와 "Moby Dick"($8.99) 책을 반환합니다.

Find all fiction books:

$.store.book[?(@.category == "fiction")]

"Sword of Honour", "Moby Dick", "The Lord of the Rings" 세 권의 책을 반환합니다.

Find books with an ISBN:

$.store.book[?(@.isbn)]

isbn 속성이 있는 책인 "Moby Dick"과 "The Lord of the Rings"를 반환합니다. 이는 필터가 속성의 존재 여부를 확인하기 때문입니다.

Find the most expensive book:

$.store.book[?(@.price > 20)]

"The Lord of the Rings"($22.99)를 반환합니다.

필터의 논리 연산자

논리 연산자를 사용하여 조건을 결합할 수 있습니다:

< 10 && @.category == "fiction")]
$.store.book[?(@.price > 15 || @.category == "reference")]

첫 번째 표현식은 10달러 미만의 소설 책을 찾습니다("Moby Dick"만 해당). 두 번째는 15달러를 초과하거나 참고 카테고리에 속하는 책을 찾습니다("Sayings of the Century"와 "The Lord of the Rings" 반환).

JSONPath와 XPath

JSONPath는 명시적으로 XPath를 모델로 하며, 두 언어는 개념적으로 많은 유사점이 있습니다. XML 처리에 익숙하다면 이 관계를 이해하는 것이 도움이 됩니다.

기능JSONPathXPath
루트 기호$/
자식 접근.key 또는 ['key']/element
배열 인덱스[0][1] (1부터 시작)
와일드카드**
재귀적 하강..//
필터[?(condition)][condition]
속성해당 없음 (JSON에는 속성이 없음)@attr
현재 노드@ (필터 내에서). 또는 current()
부모지원 안 함..
지원 안 함13개 축 (ancestor, following 등)
공격자가 악성 스크립트를 서버에 저장합니다(예: 댓글 또는 프로필 필드). 다른 사용자가 페이지를 볼 때, 스크립트가 해당 브라우저에서 실행됩니다. CSP는 인라인 스크립트를 차단하고 스크립트 소스를 신뢰할 수 있는 소스로 제한하여 이를 방지합니다. 공격자의 스크립트가 데이터베이스에 저장되어 있더라도, 브라우저는 허용된 소스와 일치하지 않기 때문에 실행을 거부합니다.색상 모델: RGB, HSL, HEX 및 CMYK요소, 속성, 텍스트 노드

주요 차이점은 XPath가 요소, 속성, 텍스트 노드, 네임스페이스 및 처리 명령이 있는 풍부한 트리 모델에서 작동한다는 점입니다. JSONPath는 더 간단한 객체(키-값 매핑)와 배열(순서 있는 목록) 모델에서 작동합니다. 이 단순성은 JSONPath를 배우기 쉽게 만들지만, 복잡한 쿼리에서는 XPath만큼 표현력이 풍부하지 않습니다.

JSONPath 실전

API 테스트

JSONPath는 API 테스트에 필수적입니다. API에 요청을 보내고 대형 JSON 응답을 받을 때, JSONPath를 사용하면 전체 구조를 수동으로 탐색하지 않고도 특정 값을 검증할 수 있습니다. 대부분의 API 테스트 도구가 JSONPath를 네이티브로 지원합니다.

예를 들어, 테스트에서 첫 번째 책의 가격이 10달러 미만인지 검증할 수 있습니다:

// Using a JSONPath assertion in testing
response.jsonPath().get("store.book[0].price").should(equals(8.95));

// Find all books by a specific author
response.jsonPath().get("store.book[?(@.author == 'Herman Melville')].title");
// Returns: ["Moby Dick"]

데이터 변환

서로 다른 데이터 형식을 사용하는 시스템을 통합할 때, JSONPath는 특정 필드를 추출하고 변환하는 데 도움을 줍니다. 복잡한 순회 코드를 작성하지 않고도 한 JSON 구조에서 값을 추출하여 다른 구조로 매핑할 수 있습니다.

구성 관리

복잡한 구성 파일은 종종 깊게 중첩된 JSON을 포함합니다. JSONPath를 사용하면 전체 구조를 로드하고 구문 분석하지 않고도 특정 구성 값을 쿼리할 수 있습니다. jq와 같은 도구는 JSONPath와 유사한 구문을 사용하여 명령줄 파이프라인에서 JSON을 처리합니다.

모니터링 및 알림

관측 가능성 시스템에서 JSONPath 쿼리는 JSON 형식의 로그와 API 응답에서 메트릭을 추출할 수 있습니다. JSONPath 쿼리가 임계값을 초과하는 값을 반환할 때 트리거되는 알림을 설정할 수 있습니다.

JSONPath 구현

JSONPath는 거의 모든 프로그래밍 언어에서 사용할 수 있습니다. 다음은 가장 인기 있는 라이브러리입니다:

언어라이브러리설치
JavaScriptjsonpath-plusnpm install jsonpath-plus
Pythonjsonpath-ngpip install jsonpath-ng
JavaJsonPath (Jayway)Maven: com.jayway.jsonpath
C#Json.NET (Newtonsoft)NuGet: Newtonsoft.Json
Gogjsongo get github.com/tidwall/gjson
PHPjsonpathcomposer require softcreatr/jsonpath
Rubyjsonpathgem install jsonpath

JavaScript예제

< 10)]',
  json: data
});
// Returns books with price < 10

Python Example

from jsonpath_ng import parse

data = { /* our sample JSON */ }

# Find all authors
author_expr = parse('$..author')
authors = [match.value for match in author_expr.find(data)]
# ["Nigel Rees", "Evelyn Waugh", "Herman Melville", "J.R.R. Tolkien"]

# Find cheap books
cheap_expr = parse('$.store.book[?(@.price < 10)]')
cheap_books = [match.value for match in cheap_expr.find(data)]

Common Pitfalls and Tips

팁: 복잡한 JSONPath 표현식을 다룰 때는 단계적으로 구축하세요. $.store와 같은 간단한 경로로 시작하여 유효한지 확인한 다음, $.store.book, $.store.book[*], $.store.book[*].price 순으로 점진적으로 확장하고, 마지막으로 필터를 추가하세요. 이렇게 하면 디버깅이 더 쉬워집니다.

일반적인 함정과 팁

2024년, IETF는 RFC 9535를 발표하여 JSONPath를 공식적으로 표준화했습니다. 이 사양은 각 구현 간에 존재하던 많은 모호성과 불일치를 해결합니다. 표준의 주요 측면은 다음과 같습니다:

새 프로젝트를 시작하는 경우, 최대 호환성과 예측 가능한 동작을 위해 RFC 9535를 구현하는 라이브러리를 우선 선택하세요.

JSON 데이터를 빠르게 쿼리해야 하나요? 무료 온라인 JSONPath 테스터를 사용하여 JSON 문서에 대해 실시간으로 표현식을 평가해 보세요.

JSONPath 파인더 사용해 보기

IETF 표준: RFC 9535

Python예제

JSONPath는 XPath가 XML에 대한 것과 유사한 JSON 쿼리 언어입니다. 경로 표현식을 사용하여 JSON 문서에서 특정 값을 탐색하고 추출합니다. $.store.book[0].title과 같은 JSONPath 표현식을 사용하면 사용자 정의 파싱 코드를 작성하지 않고도 복잡한 중첩 JSON 구조에서 데이터를 정확하게 찾을 수 있습니다.

웹 디자인에 가장 좋은 색상 모델은 무엇인가요?

JSONPath는 JSON의 객체와 배열 구조를 위해 설계되었으며, XPath는 XML의 요소와 속성 트리를 위해 설계되었습니다. JSONPath는 $를 루트 노드로 사용하고, 점 표기법으로 객체에 접근하며, 괄호 표기법으로 배열에 접근합니다. XPath는 /를 경로 구분자로 사용하고, @로 속성에 접근합니다. JSONPath는 더 간단하지만 XPath만큼 기능이 풍부하지는 않습니다.

JSONPath와 XPath는 어떻게 다른가요?

JSONPath에서 이중 점(..)은 재귀적 하강 연산자입니다. 직접 자식 노드뿐만 아니라 JSON 구조의 모든 수준에서 명명된 키를 검색합니다. 예를 들어, $..author는 중첩 깊이와 관계없이 전체 문서의 모든 위치에서 author 키를 찾습니다.

JSONPath에서 이중 점(..)은 무엇을 의미하나요?

<, ><=, >< 10)]은 10달러 미만의 모든 책을 찾습니다.

JSONPath로 조건에 따라 데이터를 필터링할 수 있나요?

JSONPath는 2007년 Stefan Goessner가 처음 제안했으며 공식 사양이 없어 구현 간 차이가 있었습니다. 2024년, IETF가 RFC 9535를 발표하여 JSONPath를 공식적으로 표준화했습니다. 최신 구현은 이 표준으로 수렴하고 있지만, 일부 오래된 라이브러리는 여전히 약간의 구문 차이가 있을 수 있습니다.