Skip to content

JSON Diff 비교

두 JSON 파일을 브라우저에서 즉시 Diff 비교하세요. 나란히 보기 하이라이팅, RFC 6902 JSON Patch 출력, 타임스탬프·ID 같은 노이즈 필드 무시. 비공개, 업로드 없음.

트래킹 없음 브라우저 실행 무료
Ignore paths:
고급 옵션
Array 모드
Reviewed for RFC 6902/6901 compliance and edge cases including null vs missing keys, type drift, floating-point precision, and array key alignment. — Go Tools API Tooling Team · May 4, 2026

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 YAMLYAML 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. 1

    두 JSON 문서 붙여넣기

    원본(왼쪽)과 수정본(오른쪽) JSON을 붙여넣으세요. 입력하는 동안 라이브 Diff가 렌더링됩니다; 대용량 입력(>200 KB)은 수동 Diff 버튼으로 전환됩니다.

  2. 2

    노이즈 필터링

    프리셋(Timestamps / IDs / Trace)을 클릭하거나 Ignore paths에 Extended JSON Pointer 패턴을 붙여넣어 관련 없는 필드를 제거하세요.

  3. 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에 모든 게 변경됐다고 나오는 이유는?
세 가지 주요 원인이 있습니다: (1) 키 순서가 다른 경우 — JSON Diff는 키 순서를 동일하게 처리하지만 텍스트 Diff 도구는 그렇지 않습니다; (2) 요청마다 변하는 타임스탬프/UUID/자동 ID — Ignore paths에 추가하세요; (3) 배열 순서 문제로 인덱스 기반 비교가 맞지 않을 때 — Array 모드를 'Match by key'로 전환하세요.
JSON Diff에서 타임스탬프와 ID를 무시하려면 어떻게 하나요?
위쪽의 Ignore paths 입력란을 사용하세요. 'Timestamps' 또는 'IDs' 프리셋을 클릭하면 /createdAt, /updatedAt, /*Id, /*At, /requestId를 한 번에 필터링할 수 있습니다. 고급 필터링을 위해 Extended JSON Pointer 패턴을 한 줄씩 직접 입력할 수도 있습니다.
JSON Patch와 시각적 Diff의 차이점은 무엇인가요?
시각적(나란히 보기) Diff는 사람이 변경 사항을 눈으로 검토하기 위한 것입니다. JSON Patch (RFC 6902)는 기계용으로, fast-json-patch나 rfc6902 npm 패키지로 적용 가능한 구조화된 ops 배열(add/remove/replace)입니다. 같은 Diff에서 두 가지 출력을 제공합니다.
JSON Diff에서 null과 키 없음을 동일하게 처리하나요?
아닙니다. {"a":null}과 {}는 다릅니다 — 전자는 명시적 null이 있고, 후자는 키가 없습니다. 두 경우에 실제 시스템이 다르게 동작하므로 이 도구는 이를 구별합니다.
배열은 인덱스 기준으로 비교하나요, 키 기준으로 비교하나요?
기본값은 인덱스 기준(Sequential)입니다. 'Match by key'로 전환하고 키 필드(보통 id)를 입력하면 순서에 관계없이 요소를 정렬합니다. K8s 환경 변수, package-lock 항목, 또는 논리적으로 집합인 목록에 활용하세요.
Diff를 RFC 6902 JSON Patch로 내보낼 수 있나요?
네. JSON Patch 탭은 유효한 RFC 6902 ops 배열을 출력합니다. Ignore paths가 설정되어 있으면 패치가 필터링되며(탭에 '(filtered: excludes {n} ignored paths)' 표시) 원본을 완전히 복원하지는 않습니다. 완전한 패치를 얻으려면 Ignore paths를 비워두세요.
JSON Patch와 JSON Merge Patch (RFC 7396)의 차이점은 무엇인가요?
RFC 6902(JSON Patch)는 순서가 있는 ops 배열로 명시적이고 되돌릴 수 있습니다. RFC 7396(Merge Patch)은 단일 병합 문서로 더 간단하지만 키 제거와 null 설정을 구별할 수 없습니다. JSON Diff는 RFC 6902를 출력합니다.
대용량 JSON 파일(>10 MB)은 어떻게 비교하나요?
5 MB를 초과하는 파일은 실질적인 브라우저 메모리 한계를 넘습니다. 라이브 모드는 200 KB에서 비활성화됩니다; 수십 MB 파일은 커맨드라인 jq나 Node의 fast-json-patch를 사용하세요.
도구가 내 JSON을 서버에 전송하나요?
아닙니다. 모든 비교는 브라우저에서 로컬로 실행됩니다. 입력값은 디스크, 네트워크, localStorage, URL 파라미터에 기록되지 않습니다. 페이지를 새로고침하면 지워집니다. Share Link 버튼은 설정(Array 모드, Ignore paths)만 URL로 인코딩하며 데이터는 포함되지 않습니다.
Diff에서 42와 "42"가 다른 이유는 무엇인가요?
JSON Diff는 타입 엄격 모드입니다: 숫자 42와 문자열 "42"는 같지 않습니다. 이를 통해 백엔드 직렬화 불일치(일부 엔드포인트는 숫자 ID, 다른 곳은 문자열 반환)를 포착하며, Diff에서 'type' 수정으로 표시됩니다.
주석(JSONC)이나 후행 쉼표가 있는 JSON도 비교할 수 있나요?
표준 JSON(RFC 8259)은 주석과 후행 쉼표를 허용하지 않습니다. 이 도구는 네이티브 JSON.parse를 사용하므로 둘 다 거부합니다. 먼저 JSON Formatter로 주석을 제거하세요.
id 같은 키로 중첩된 객체 배열을 비교하려면 어떻게 하나요?
Array 모드를 'Match by key'로 설정하고 id를 입력하세요. Diff가 id 값으로 정렬됩니다. v1은 모든 배열 깊이에 동일한 키 필드를 적용하며, 해당 필드가 없는 내부 배열은 순차 방식으로 폴백되어 경고 칩을 표시합니다.
부동소수점 정밀도(0.1 + 0.2)도 처리하나요?
네, Numeric tolerance로 처리합니다. 기본값은 Object.is를 사용하는 0으로, -0과 +0을 구별합니다. tolerance를 작은 엡실론(예: 1e-9)으로 설정하면 0.1 + 0.2가 0.3과 같다고 비교됩니다. Tolerance는 숫자 리프 노드에만 적용됩니다.

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)을 즉시 변환합니다. 온라인에서 무료로 사용할 수 있으며 모든 처리는 브라우저에서 이루어집니다.