본문으로 건너뛰기
AZ Tools

JSON 머지 패치 (RFC 7386)

RFC 7386 JSON 머지 패치를 적용하거나 생성하고, 변경 내역을 전부 나열합니다 — 키를 설정하는 게 아니라 삭제하는 null까지.

결과

머지가 한 일

  • /title — "Hello!"로 설정
  • /phoneNumber — "+01-123-456-7890"로 설정
  • /author/familyName — 삭제됨, 원래 "Doe"
  • /tags — ["example"]로 통째 교체

RFC 7386, 미디어 타입 application/merge-patch+json. 배열은 항상 통째로 교체되고 병합되지 않습니다.

사용법

  1. 대상 문서와 머지 패치를 붙여 넣으면 결과와 머지가 건드린 모든 키 목록이 나옵니다.
  2. 두 번째 모드로 바꿔 문서 둘을 붙여 넣으면 첫 번째를 두 번째로 만드는 패치가 나옵니다.
  3. 결과만 보지 말고 변경 목록을 보세요. 삭제와 애초에 없던 값은 출력에서 똑같이 보입니다.
  4. RFC 예시를 불러오면 세 규칙을 한 번에 볼 수 있습니다 — 교체된 문자열, 삭제된 중첩 키, 통째로 바뀐 배열.

자세한 설명

펼치기

문서에 머지 패치를 적용하거나, 한 문서를 다른 문서로 만드는 패치를 역으로 구하고, 머지가 키마다 실제로 무엇을 했는지 봅니다. JSON 머지 패치는 kubectl patch --type=merge가 보내고 많은 HTTP API가 받는 application/merge-patch+json 본문이며, 이름이 비슷해도 RFC 6902 JSON Patch와는 다른 형식입니다. 머지 패치는 연산 목록이 아니라 대상과 같은 모양의 문서라서 손으로 쓰기 훨씬 쉽고, 미묘하게 틀리기도 훨씬 쉽습니다. 놀라는 지점은 거의 규칙 세 개로 설명됩니다. null 값은 그 키를 null로 설정하는 게 아니라 삭제합니다. 즉 머지 패치로는 "이 필드를 null로 만들어라"를 아예 표현할 수 없고, API가 그게 필요하면 머지 패치는 틀린 형식입니다. 배열은 항상 통째로 교체되고 병합되지 않으므로, 목록에 한 항목을 더하거나 한 항목만 바꿀 방법이 없습니다. 그리고 객체가 아닌 패치는 대상 전체를 대체하므로, 패치로 null을 보내면 문서가 날아가고 문자열을 보내면 문자열만 남습니다. 이 툴은 그 일이 일어날 때마다 보여 줍니다 — 어떤 키가 설정됐는지, 어떤 키가 삭제됐고 원래 무엇이었는지, 어떤 값이 통째로 교체됐는지. 패치 생성은 규격이 정의하지 않으며, 자연스러운 최소 차이에는 같은 맹점이 거꾸로 있습니다. 리터럴 null이 들어 있는 대상은 재현할 수 없고, 이 툴은 그 필드를 조용히 삭제하는 패치를 내놓는 대신 그렇다고 말해 줍니다.

자주 묻는 질문

JSON Patch(RFC 6902)와 무엇이 다른가요?

RFC 6902는 add·remove·replace·move·copy·test 같은 명시적 연산 목록이고 각각 JSON Pointer 경로를 가지므로, 배열의 한 요소를 지목할 수 있고 값을 null로 설정할 수도 있습니다. 머지 패치는 대상을 그대로 닮은 문서라서 평범한 필드 수정에는 훨씬 짧고 읽기 쉽지만, 배열 내부를 지목할 수 없고 null도 설정할 수 없습니다. 정밀함이 필요하면 6902, 간결함이 필요하면 머지 패치입니다.

null로 만들려던 필드가 왜 삭제됐나요?

형식이 그렇게 정하고 있기 때문입니다. 머지 패치에서 null은 이 멤버를 제거하라는 뜻이고, 이스케이프나 다른 표기법은 없습니다. 값이 정말 null이 되어야 한다면 RFC 6902 JSON Patch를 쓰거나 API가 자체 센티넬을 받도록 해야 합니다. 머지 패치에는 그것을 표현할 방법이 없습니다.

배열에 항목 하나만 추가할 수 있나요?

없습니다. 배열은 통째로 교체되므로 패치가 새 배열 전체를 담아야 합니다. 이는 의도된 설계입니다. 위치로 병합하면 아주 단순한 수정 말고는 모호해지고, 신원으로 병합하려면 형식이 당신 데이터에서 신원이 무엇인지 알아야 합니다. 요소 단위 수정이 중요하면 RFC 6902가 배열 위치를 직접 지목합니다.

패치가 객체가 아니면 어떻게 되나요?

대상이 무엇이었든 전체를 대체합니다. null 패치는 null을, "bar" 패치는 "bar"를, 배열 패치는 그 배열을 만듭니다. 규격이 명시하고 있고, 이 툴은 패치가 그 모양일 때 경고합니다. PATCH 요청을 보내는 사람이 의도한 경우는 거의 없기 때문입니다.

생성된 패치가 유일하게 맞는 답인가요?

아닙니다. 규격은 패치를 적용하는 방법만 정의하고 만드는 방법은 정의하지 않으므로, 원본을 대상으로 바꾸는 패치라면 어느 것이든 유효합니다. 이 툴은 최소한의 것을 냅니다 — 값이 다른 멤버만, 그리고 대상이 버린 멤버마다 null 하나. 바뀌지 않은 멤버까지 다시 적은 더 큰 패치도 똑같이 올바르게 적용됩니다.

관련 도구