JSON Diff 비교
두 JSON 파일을 브라우저에서 즉시 Diff 비교하세요. 나란히 보기 하이라이팅, RFC 6902 JSON Patch 출력, 타임스탬프·ID 같은 노이즈 필드 무시. 비공개, 업로드 없음.
고급 옵션
JSON Diff란 무엇인가요?
JSON Diff는 JSON의 데이터 모델을 존중하는 두 JSON 문서의 구조적 비교입니다 — 키는 순서가 없고, 타입은 엄격하며, 배열은 순서 기반이거나 키 기반일 수 있습니다. 키 재정렬이나 공백을 차이로 보고하는 텍스트 Diff와 달리, JSON Diff는 의미론적으로 의미 있는 결과를 생성합니다.
표준 기계 가독 형식은 JSON Patch (RFC 6902)로, 한 문서를 다른 문서로 변환하는 순서가 있는 ops 배열(add, remove, replace, move, copy, test)입니다. 경로는 JSON Pointer (RFC 6901)를 사용합니다. 밀접하게 관련된 것으로: JSON Merge Patch (RFC 7396) — 더 간단하지만 '키 제거'와 '키를 null로 설정'을 구별할 수 없습니다. 이 도구는 RFC 6902를 출력합니다.
JavaScript에서 JSON의 깊은 동등성 비교는 생각보다 어렵습니다. JSON.stringify(a) === JSON.stringify(b)는 키 재정렬에서 실패하고, -0 대 0에서 오해를 일으킵니다(둘 다 "0"으로 직렬화). 정확한 Diff는 키 집합 합집합을 사용해 두 트리를 병렬로 순회하고, 'in' 연산자로 null과 없는 키를 구별하며, 숫자에 대한 '동일'의 의미를 결정해야 합니다(기본값 Object.is, 허용 오차에는 엡실론).
이 도구는 전적으로 브라우저에서 실행됩니다. 입력값은 사용자 기기를 벗어나지 않습니다. API 응답, 내부 스키마, 독점 설정에 안전합니다.
인접 JSON 도구와 함께 사용하시나요? JSON Formatter로 포맷하고, JSON to YAML과 YAML to JSON으로 변환하세요.
// Two JSON documents that look different but are semantically equal
const a = '{"a":1,"b":2}';
const b = '{"b":2,"a":1}';
// Naive comparison — wrong
JSON.stringify(JSON.parse(a)) === JSON.stringify(JSON.parse(b));
// → false (key order differs)
// JSON Diff (this tool) — correct: key order is irrelevant
// → 0 differences
// JSON Patch (RFC 6902) for { "a": 1 } → { "a": 2 }
// [{ "op": "replace", "path": "/a", "value": 2 }] 주요 기능
나란히 보기 + JSON Patch
하나의 Diff에서 두 가지 뷰: 검토를 위한 시각적 하이라이팅과 자동화를 위한 RFC 6902 패치.
노이즈 필드 무시
원클릭 프리셋으로 /createdAt, /updatedAt, /*Id, /*At, requestId, traceId를 제거합니다. 커스텀 Extended JSON Pointer 패턴도 지원합니다.
키로 배열 매칭
인덱스가 아닌 id 필드로 객체 배열을 비교합니다 — K8s 환경 변수, package-lock 항목, 또는 논리적으로 비순서 목록에 활용하세요.
기본 타입 엄격 모드
1 ≠ "1". null ≠ 없는 키. 테스트 픽스처에 착지하는 순간 백엔드 직렬화 불일치를 포착합니다.
100% 브라우저 기반
입력값이 사용자 기기를 벗어나지 않습니다. 업로드 없음, JSON의 localStorage 저장 없음, 붙여넣은 내용에 대한 분석 없음.
데이터가 아닌 링크 공유
Share Link는 설정만 URL에 씁니다. JSON 입력값은 로컬로 유지됩니다.
예시
API 응답 회귀 테스트
{"user":{"id":1,"name":"Ada","createdAt":"2024-01-01"}} {"user":{"id":1,"name":"Ada Lovelace","createdAt":"2024-02-02"}} 변경점 2개(name + createdAt). Ignore paths에 /user/createdAt을 추가하면 name 변경만 남습니다.
설정 파일 감사 (키 순서 변경)
{"a":1,"b":2,"c":3} {"c":3,"a":1,"b":2} 데이터는 같고 키 순서만 다릅니다. JSON Diff는 키 순서를 의미상 무관하게 처리하므로 Diff 결과가 비어 있습니다.
객체 배열 (키로 매칭)
[{"id":1,"qty":3},{"id":2,"qty":5}] [{"id":2,"qty":5},{"id":1,"qty":4}] Array 모드를 'Match by key'로 전환하고 key=id로 설정하세요. 정렬 없이는 모든 요소가 변경된 것처럼 보이지만, 정렬 후에는 id=1의 qty만 변경됩니다.
JSON Patch 출력 (RFC 6902)
{"items":[{"id":1,"price":29.99}]} {"items":[{"id":1,"price":24.99}]} JSON Patch 탭으로 전환하면 fast-json-patch로 적용 가능한 [{"op":"replace","path":"/items/0/price","value":24.99}]를 얻을 수 있습니다.
사용 방법
- 1
두 JSON 문서 붙여넣기
원본(왼쪽)과 수정본(오른쪽) JSON을 붙여넣으세요. 입력하는 동안 라이브 Diff가 렌더링됩니다; 대용량 입력(>200 KB)은 수동 Diff 버튼으로 전환됩니다.
- 2
노이즈 필터링
프리셋(Timestamps / IDs / Trace)을 클릭하거나 Ignore paths에 Extended JSON Pointer 패턴을 붙여넣어 관련 없는 필드를 제거하세요.
- 3
필요한 뷰 선택
사람이 검토할 때는 나란히 보기, 자동화 적용에는 JSON Patch (RFC 6902). Share Link로 팀원에게 설정을 전송하세요.
일반적인 Diff 함정
키 순서 노이즈 (텍스트 Diff 증상)
Diff 도구가 {"a":1,"b":2}와 {"b":2,"a":1}을 다르다고 보고하면 라인 Diff를 하는 것이지 JSON Diff가 아닙니다. JSON 키는 순서가 없습니다 — 이 도구는 키 순서를 자동으로 무시합니다.
diff a.json b.json # text diff: 'everything changed'
JSON Diff (this tool): 0 differences
null과 없는 키 혼동
{"a":null}과 {}는 같지 않습니다. 동일하게 처리하면 실제 백엔드 버그를 숨깁니다.
{"a": null} == {} # collapsed by some tools {"a": null} ≠ {} # type-strict diff 키 정렬 없는 배열 순서
[{id:1},{id:2}]와 [{id:2},{id:1}]은 논리적 집합에서 '두 가지 변경'이 아닙니다. Sequential은 그렇게 보고합니다; Match by key로 전환하세요.
Sequential diff: 4 modified
Match by key (id): 0 differences
타입 불일치 (숫자 대 문자열)
백엔드는 때때로 ID를 일관성 없이 직렬화합니다 — 42 대 "42". 도구는 이를 'type' 수정으로 표시하여 조기에 불일치를 파악할 수 있습니다.
{"id": 42} vs {"id": "42"} # serialization bug Diff reports 'modified (type)' with both values
부동소수점 정밀도
IEEE 754에서 0.1 + 0.2 !== 0.3. tolerance=0(기본값)에서는 이를 표시합니다. 숫자 동등성을 의도하면 tolerance를 1e-9로 설정하세요.
tolerance=0: 0.30000000000000004 ≠ 0.3
tolerance=1e-9: equal
타임스탬프 및 UUID 노이즈
createdAt, updatedAt, requestId, traceId는 요청마다 변합니다. Ignore paths 프리셋을 사용하여 제거하세요.
Diff: 47 modifications (45 are timestamps)
Add /createdAt, /updatedAt, /requestId to Ignore paths → 2 real changes
주요 활용 사례
- API 응답 회귀 테스트
- 스테이징과 프로덕션 응답을 비교하고, 타임스탬프와 요청 ID를 무시하여 의미 있는 페이로드 변경만 노출합니다.
- CI 스냅샷 테스트 실패
- 실패한 Jest/Vitest 스냅샷에서 실제값과 기대값을 붙여넣으세요. 노이즈를 필터링하고 몇 초 만에 실제 변경 사항을 찾습니다.
- package-lock / yarn.lock 충돌
- 이름으로 의존성을 정렬하여 병합 충돌을 해결합니다; 키 순서와 관련 없는 필드가 더 이상 노이즈가 되지 않습니다.
- K8s / Helm Values 감사
- 이름으로 envs, volumeMounts, ports를 매칭합니다. 의도치 않은 순서 변경과 실제 설정 편집을 구별합니다.
- i18n 번역 커버리지
- en.json과 zh.json을 구조적으로 Diff 비교하여 값 노이즈 없이 누락되거나 추가된 번역 키를 찾습니다.
- Terraform / CDK Plan 검토
- 실행 간 plan 출력을 비교합니다; 숫자 허용 오차로 부동소수점 연산을 처리하고, ignore paths로 ARN과 타임스탬프를 제거합니다.
기술 세부사항
- RFC 6902 호환 패치 출력
- RFC 6901 경로로 유효한 JSON Patch ops(add/remove/replace)를 생성합니다. fast-json-patch@3.x 및 rfc6902 npm 패키지에 대해 검증되었습니다.
- 반복적 순회
- 명시적 스택 순회(재귀 없음)로 적대적 입력에서 스택 오버플로를 방지하기 위해 최대 100,000개 노드와 깊이 64로 제한합니다.
- Object.is 숫자 동등성
- 기본 숫자 허용 오차는 0으로 Object.is를 사용하여 -0과 +0을 구별합니다. 엡실론 기반 동등성을 위해 허용 오차를 0보다 크게 설정하세요.
모범 사례
- 검토 전에 필터링
- 먼저 Ignore paths를 추가하고(타임스탬프, ID, 트레이스 필드) Diff를 읽으세요. 노이즈가 많은 Diff를 검토하면 눈이 실제 변경 사항을 놓치도록 훈련됩니다.
- 논리적 집합에는 키로 매칭
- 배열이 비순서 집합(envs, users, dependencies)을 나타내면 키로 매칭하세요. 논리적 집합에서 순차 Diff는 거의 항상 잘못됩니다.
- 입력값이 아닌 링크 공유
- 동료에게 필터 설정을 보낼 때 Share Link를 사용하세요 — 민감한 JSON을 공유 문서에 붙여넣지 마세요. URL에는 설정만 포함됩니다.
자주 묻는 질문
필드 하나만 바꿨는데 Diff에 모든 게 변경됐다고 나오는 이유는?
JSON Diff에서 타임스탬프와 ID를 무시하려면 어떻게 하나요?
JSON Patch와 시각적 Diff의 차이점은 무엇인가요?
JSON Diff에서 null과 키 없음을 동일하게 처리하나요?
배열은 인덱스 기준으로 비교하나요, 키 기준으로 비교하나요?
Diff를 RFC 6902 JSON Patch로 내보낼 수 있나요?
JSON Patch와 JSON Merge Patch (RFC 7396)의 차이점은 무엇인가요?
대용량 JSON 파일(>10 MB)은 어떻게 비교하나요?
도구가 내 JSON을 서버에 전송하나요?
Diff에서 42와 "42"가 다른 이유는 무엇인가요?
주석(JSONC)이나 후행 쉼표가 있는 JSON도 비교할 수 있나요?
id 같은 키로 중첩된 객체 배열을 비교하려면 어떻게 하나요?
부동소수점 정밀도(0.1 + 0.2)도 처리하나요?
관련 도구
모든 도구 보기 →Base64 디코더 · 인코더 (Base64 Decoder & Encoder)
인코딩 & 포매팅
Base64를 온라인에서 무료로 인코딩하고 디코딩합니다. UTF-8과 이모지를 완벽 지원하는 실시간 변환으로, 100% 브라우저에서 처리되어 회원 가입이 필요 없습니다.
JSON 포맷터 (JSON Formatter)
인코딩 & 포매팅
브라우저에서 JSON을 즉시 포매팅하고 유효성 검사를 수행합니다. 온라인 도구로 구문 검사, 오류 감지, 최소화, 복사를 지원하며 데이터는 서버로 전송되지 않습니다.
JSON to YAML 변환기 (JSON to YAML Converter)
인코딩 & 포매팅
JSON을 붙여넣으면 즉시 YAML로 변환됩니다. 브라우저에서 실시간 변환, K8s/Compose 지원, 2/4칸 들여쓰기, Norway 안전 자동 인용, 100% 개인 정보 보호.
URL 인코더 · 디코더 (URL Encoder & Decoder)
인코딩 & 포매팅
URL을 실시간 인코딩·디코딩하고 내장 파서로 구조를 분석합니다. encodeURI와 encodeURIComponent 모드를 온라인에서 지원하며 데이터는 브라우저를 떠나지 않습니다.
YAML to JSON 변환기 (YAML to JSON Converter)
인코딩 & 포매팅
YAML을 붙여넣으면 즉시 JSON으로 변환됩니다. K8s 매니페스트, OpenAPI 명세, Helm values 지원, 앵커/별칭 완전 확장, 100% 개인 정보 보호.
진법 변환기 (Number Base Converter)
변환 도구
2진수, 16진수, 10진수, 8진수 및 임의 진법(2-36)을 즉시 변환합니다. 온라인에서 무료로 사용할 수 있으며 모든 처리는 브라우저에서 이루어집니다.