JSON 표준 가이드: RFC 6901, 6902 및 7396
JSON은 웹에서 데이터 교환의 사실상의 표준이 되었습니다. 하지만 API가 복잡해짐에 따라 단순한 JSON 객체만으로는 부족한 경우가 많습니다. 개발자에게는 JSON 문서의 특정 부분을 참조하고 해당 문서의 변경 사항을 설명하는 표준화된 방법이 필요합니다. 여기서 RFC 6901 (JSON Pointer), RFC 6902 (JSON Patch), **RFC 7396 (JSON Merge Patch)**이 등장합니다.
JSON Pointer와 Patch란 무엇인가요?
- RFC 6901 (JSON Pointer): JSON 문서 내의 특정 값을 식별하기 위한 문자열 구문을 정의합니다. 데이터의 "주소"와 같습니다.
- RFC 6902 (JSON Patch): JSON 문서에 적용할 일련의 작업을 표현하기 위한 JSON 문서 구조를 정의합니다. "차이점(diff)" 또는 "트랜잭션 로그"와 같습니다.
- RFC 7396 (JSON Merge Patch): 변경된 필드만 포함하여 대상 문서와 유사한 "패치" 문서를 보냄으로써 변경 사항을 설명하는 더 간단한 방법을 제공합니다.
1. RFC 6901: JSON Pointer
JSON Pointer는 슬래시(/)로 구분된 구문을 사용하여 JSON 객체의 계층 구조를 탐색합니다.
구문 규칙:
/는 루트를 나타냅니다./foo는 "foo" 키의 값을 가리킵니다./foo/0은 "foo" 배열의 첫 번째 요소를 가리킵니다.~1은 리터럴/를 나타내는 데 사용됩니다.~0은 리터럴~를 나타내는 데 사용됩니다.
예시:
{
"biscuits": [
{ "name": "Digestive" },
{ "name": "Choco" }
]
}
포인터 /biscuits/1/name은 "Choco"로 해석됩니다.
2. RFC 6902: JSON Patch
JSON Patch는 작업 객체의 배열입니다. 각 객체에는 op 필드가 있어야 합니다.
작업:
- add: 지정된 경로에 값을 추가합니다.
- remove: 경로의 값을 제거합니다.
- replace: 경로의 값을 교체합니다.
- move: 값을 한 경로에서 다른 경로로 이동합니다.
- copy: 값을 한 경로에서 다른 경로로 복사합니다.
- test: 경로의 값이 예상과 일치하는지 테스트합니다.
패치 예시:
[
{ "op": "replace", "path": "/biscuits/0/name", "value": "Oatmeal" },
{ "op": "add", "path": "/biscuits/-", "value": { "name": "Ginger" } }
]
/biscuits/-에서 -는 "배열의 끝"을 의미합니다.
3. RFC 7396: JSON Merge Patch
JSON Merge Patch는 RFC 6902보다 훨씬 간단합니다. 변경하려는 필드의 최종 상태를 나타내는 JSON 객체를 보내기만 하면 됩니다.
규칙:
- 패치에 null이 아닌 값을 가진 필드가 포함되어 있으면 해당 필드가 업데이트되거나 추가됩니다.
- 패치에
null값을 가진 필드가 포함되어 있으면 대상에서 해당 필드가 제거됩니다. - 배열 패치에는 적합하지 않습니다(배열 전체를 교체함).
예시:
대상:
{ "a": "b", "c": "d" }
패치:
{ "a": "z", "c": null, "e": "f" }
결과:
{ "a": "z", "e": "f" }
비교: Patch vs. Merge Patch
| 기능 | RFC 6902 (Patch) | RFC 7396 (Merge Patch) |
|---|---|---|
| 복잡성 | 높음 (작업 배열) | 낮음 (객체 기반) |
| 효율성 | 매우 높음 (정밀 수정) | 보통 (필드 수준) |
| 배열 지원 | 전체 지원 | 미흡 (배열 전체 교체) |
| 원자적 작업 | 있음 (test 작업) | 없음 |
| 용도 | 복잡한 상태 변경 | 단순한 속성 업데이트 |
자주 묻는 질문 FAQ
Q: 내 API에는 어떤 것을 사용해야 하나요? A: 정밀한 배열 조작이 필요하지 않은 단순한 리소스 업데이트에는 **JSON Merge Patch (7396)**를 사용하세요. 복잡한 리소스, 높은 성능 요구 사항 또는 원자적 "테스트 및 설정" 작업이 필요한 경우에는 **JSON Patch (6902)**를 사용하세요.
Q: URL에서 JSON Pointer를 사용할 수 있나요?
A: 네, URI 프래그먼트에서 JSON Pointer를 사용하는 것이 일반적입니다(예: example.com/schema.json#/definitions/user).
Q: 키에 특수 문자가 있는 경우 어떻게 처리하나요?
A: /에는 ~1을, ~에는 ~0을 사용하세요. 예를 들어 a/b라는 키는 /a~1b로 참조됩니다.
관련 도구
- JSON 포맷터 및 유효성 검사기 - Patch 또는 Merge Patch 문서를 검증하는 데 사용하세요.
- JSON CSV 변환기 - 분석을 위해 JSON 데이터를 평면화하세요.