문서 작업 가이드
JSONPath로 큰 API 응답 디버깅하기
큰 API 응답에서 요청 ID, 상태, 오류 코드, 페이지 링크처럼 증상과 관련된 필드만 추출해 재현 가능한 디버깅 기록을 만듭니다.
작성 및 검수 SimpleWebUtils게시일: 검토일:
이 작업 흐름을 검증한 방법
JSONPath 테스터 - JSON 값과 경로 추출에서 다음 가이드 픽스처로 검증을 시작했습니다: “페이지형 API 응답에서 디버깅 필드만 확인”. “원본 응답과 HTTP 문맥 보관”부터 “환경별 결과를 같은 표현식으로 비교”까지 실행해 생성 결과를 기대값과 대조했습니다. 별도 한계 검토에는 “처음부터 너무 넓게 조회”, “응답 헤더를 무시” 항목을 사용했습니다.
세 경로는 각각 req_9f21, active와 pending, page=2 URL을 반환했고, 관련 없는 응답 필드를 디버깅 출력에 펼치지 않았습니다. 잘못된 JSON은 문법 오류로 남았고, 없는 경로는 빈 값을 성공처럼 보여 주지 않고 no-match 상태로 구분했습니다.
문제 상황
API 응답에 수백 개 필드가 있으면 전체 문서를 눈으로 비교하는 동안 실제 원인을 놓치기 쉽습니다. 배열 안의 오류 코드, 환경마다 달라지는 상태, 누락된 다음 페이지 링크, 로그와 대조할 요청 ID를 각각 좁혀 확인해야 디버깅 속도가 빨라집니다.
공식 출처와 표준
다음 공식 문서는 이 작업 흐름에서 다루는 형식과 보안 경계의 기준입니다. 도구별 실행 검증은 위에 별도로 기록합니다.
- RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format
RFC Editor / IETF
- RFC 9535: JSONPath: Query Expressions for JSON
RFC Editor / IETF
이럴 때 사용하세요
- 실패한 API 응답이 유효한 JSON이지만 너무 커서 눈으로 비교하기 어려울 때
- 같은 payload에서 요청 ID, 상태, 오류 코드, 페이지 링크를 따로 확인해야 할 때
- 프런트엔드 오류가 환경마다 달라지는 중첩 필드 하나에 의존할 때
- 전체 운영 응답 대신 재현 가능한 짧은 디버깅 기록을 공유해야 할 때
단계
- 1단계
원본 응답과 HTTP 문맥 보관
응답 본문을 복사하고 상태 코드, content-type, cache, CORS, 요청 ID 헤더처럼 증상과 관련된 정보를 함께 기록합니다. 헤더가 의심되면 HTTP Header Parser로 본문과 분리해 확인하세요.
- 2단계
JSON 문법 먼저 확인
응답이 한 줄로 압축돼 있으면 JSON Formatter로 구조를 읽고, 로그에서 복사했거나 일부가 잘렸다면 JSON Validator로 오류 행과 열을 먼저 수정합니다.
- 3단계
증상과 연결된 필드만 추출
$.meta.requestId, $.data.items[*].status, $.errors[*].code, $.links.next처럼 질문 하나에 답하는 표현식을 각각 실행합니다. 오류 배열을 좁혀야 하면 $.errors[?(@.severity == "critical")].code 같은 필터를 사용합니다.
- 4단계
환경별 결과를 같은 표현식으로 비교
개발, 스테이징, 운영, 실패한 fixture에 동일한 표현식을 실행합니다. 전체 응답 diff보다 일치 경로와 값만 비교하면 어떤 필드가 사라지거나 달라졌는지 빠르게 확인할 수 있습니다.
- 5단계
수정 사항에 표현식과 결과 첨부
Pull request, 테스트 케이스, 지원 기록에 JSONPath 표현식과 필요한 결과만 남깁니다. 운영 데이터의 이메일, 토큰, 계정 ID는 공유 전에 반드시 가리세요.
예시
페이지형 API 응답에서 디버깅 필드만 확인
입력
{
"meta": { "requestId": "req_9f21" },
"data": { "items": [
{ "id": 1, "status": "active" },
{ "id": 2, "status": "pending" }
] },
"links": { "next": "https://api.example.com/users?page=2" }
}출력
$.meta.requestId -> req_9f21
$.data.items[*].status -> active, pending
$.links.next -> https://api.example.com/users?page=2흔한 실수
처음부터 너무 넓게 조회
$..id처럼 넓은 재귀 표현식은 사용자, 주문, 요청 ID를 한꺼번에 섞을 수 있습니다. 증상과 직접 관련된 경로부터 시작한 뒤 필요한 경우에만 범위를 넓히세요.
응답 헤더를 무시
JSON 본문이 정상이어도 cache, CORS, content-type, 인증 헤더가 브라우저 오류의 원인일 수 있습니다. 네트워크 동작이 문제라면 본문과 헤더를 함께 확인하세요.
운영 payload 전체를 공유
일치한 값만 추출해도 사용자 정보나 토큰이 포함될 수 있습니다. 브라우저 로컬 처리와 별개로 이슈나 메신저에 붙여 넣기 전 민감 정보를 가려야 합니다.
자주 묻는 질문
브라우저 검색 대신 JSONPath를 쓰는 이유는 무엇인가요?
텍스트 검색은 같은 이름의 키 위치만 찾지만 JSONPath는 실제 값과 정규화된 원본 경로를 함께 반환합니다. 같은 검사를 여러 환경에서 반복하기 쉽습니다.
API 테스트 실패에도 사용할 수 있나요?
네. 기대 payload와 실제 payload에 동일한 표현식을 실행하면 fixture나 assertion을 바꾸기 전에 어느 필드가 다른지 좁힐 수 있습니다.
버그 리포트에 JSONPath 표현식을 넣어야 하나요?
표현식으로 문제가 재현된다면 함께 넣는 편이 좋습니다. 큰 응답 전체보다 짧은 표현식, 일치 경로, 필요한 값만 제공하는 것이 검토하기 쉽습니다.