13P by neo 2일전 | favorite | 댓글 1개
  • JSON Patch는 RFC 6902에 정의된 표준 형식으로, JSON 문서를 수정하는 방법임
    • HTTP를 통해 리소스를 부분적으로 업데이트하는 간단하고 효율적인 방법을 제공
    • 기존의 PUTPOST 메서드는 전체 데이터를 전송해야 했지만, PATCH 메서드는 부분 업데이트를 허용
  • JSON Patch는 JSON 문서에 대한 명확하고 간결한 변경 표현을 제공하여 대역폭을 줄이고 웹 애플리케이션의 성능을 향상시킴

JSON Patch의 작동 원리

  • JSON Patch는 JSON 문서에 대한 일련의 원자적 작업으로 작동함.
  • 각 작업은 op 필드와 path 필드를 포함하며, 이는 문서의 특정 위치에서 작업을 수행함.
  • 예를 들어, add 작업은 새로운 필드를 추가하고, replace 작업은 기존 필드를 대체함.

JSON Pointer

  • JSON Patch는 JSON Pointer를 사용하여 문서의 특정 부분을 식별함.
  • JSON Pointer는 슬래시(/)로 구분된 토큰 문자열로, 문서의 계층 구조를 식별함.
  • 예를 들어, /user/nameuser 객체 내의 name 필드를 식별함.

JSON Patch의 장단점

장점

  1. 정밀성: 복잡한 구조에서 특정 요소를 정확하게 수정 가능함.
  2. 효율성: 변경 사항만 전송하여 데이터 전송량과 지연 시간을 최소화함.
  3. 원자성: 작업 실패 시 전체 작업을 롤백 가능함.
  4. 멱등성: 안전하게 재시도 가능함.
  5. 복잡한 작업: 요소를 이동하거나 복사할 수 있음.
  6. 검증: API는 들어오는 패치를 검증하여 잘못된 요청을 줄임.
  7. 표준 기반: 다양한 클라이언트 및 서버와 쉽게 통합 가능함.
  8. 필드 수준 접근 제어: 세밀한 수준에서 수정 제한 가능함.
  9. 배치 작업: 여러 변경 사항을 하나의 요청으로 처리 가능함.

단점

  1. 복잡성: 복잡한 JSON 구조를 다루기 어려움.
  2. 유지보수 비용: API가 발전함에 따라 경로가 무효화될 수 있음.
  3. 디버깅 어려움: 여러 작업이 함께 배치될 경우 추적이 어려움.
  4. 객체 순서 보존: 이동 작업이 객체의 순서를 보장하지 않음.
  5. 보안 문제: 잘못된 요청 처리 시 취약점 발생 가능함.

JSON Patch 작업 예시

  • Add: 새로운 필드를 추가함.
  • Remove: 기존 필드를 제거함.
  • Replace: 기존 필드를 새로운 값으로 대체함.
  • Move: 요소를 다른 위치로 이동함.
  • Copy: 요소를 다른 위치로 복사함.
  • Test: 특정 경로에 값이 설정되어 있는지 테스트함.

도구 및 라이브러리에서의 JSON Patch

  • 다양한 프로그래밍 언어에서 JSON Patch를 지원하는 라이브러리가 존재함 : fast-json-patch, python-json-patch, JsonPatch library in .NET 등
  • JSON 패치를 배우기 위한 훌륭한 도구는 JSON 패치 명령을 실행하기 위한 무료 온라인 서비스인 jsonpatch.me 임. API도 있음

GN⁺의 정리

  • JSON Patch는 JSON 문서의 부분 업데이트를 효율적으로 수행할 수 있는 강력한 도구임.
  • 복잡한 JSON 구조를 다루는 데 어려움이 있을 수 있지만, 다양한 라이브러리와 도구를 통해 이를 극복할 수 있음.
  • JSON Patch는 데이터 전송량을 줄이고, 웹 애플리케이션의 성능을 향상시키는 데 유용함.
  • JSON Merge Patch와 같은 대안도 고려할 수 있으며, API 개발에 있어 JSON Patch의 사용은 효율성을 높일 수 있음.
Hacker News 의견
  • JSON Patch는 모든 JSON 문서를 수정할 수 있도록 설계되어 복잡하게 느껴짐. 데이터 세트를 약간 제한하면 문서를 더 간단하게 패치할 수 있음. 예를 들어, Firebase에서는 null 값을 저장할 수 없으며 null로 설정하면 삭제를 의미함. 이처럼 간단한 제한을 통해 PATCH를 쉽게 구현할 수 있음. "null은 삭제를 의미"라는 점 외에는 새로운 것을 배울 필요가 없다는 점이 API의 훌륭한 기능임.

  • JSON의 구분자로 /를 사용하는 것은 이상한 선택임. JSON은 JS의 하위 집합이므로 .를 구분자로 기대했음. /를 보면 백엔드 사람들이 작성한 사양일 것 같고, 경로를 URL로 만들어 상대/절대 경로의 모호성을 해결하려는 것 같음.

  • 경로가 문자열이 아닌 배열이어야 한다고 생각함. 그렇지 않으면 /를 키에서 이스케이프해야 하고 경로 문자열을 구문 분석해야 함. 이는 임의의 JSON 문서를 처리할 수 없게 만듦.

  • JSON Patch를 한 번 사용한 적이 있으며, 예상치 못한 문제를 빠르게 해결하기 위한 해킹으로 사용했음. 해외 계약자들이 텍스트 데이터를 단어 수준에서 주석을 달 수 있도록 웹 인터페이스를 구축했음. 데이터가 작은 청크로 주석이 달릴 예정이었으나, 전체 문서에 할당되면서 주석이 저장되지 않는 문제가 발생했음. JSON Patch를 발견하고 업로드 코드를 패치만 사용하도록 수정했음.

  • JSON Patch의 경로 지정 방식에서 배열의 항목을 인덱스가 아닌 식별 키-값 쌍으로 선택할 수 있는 표준 구문이 필요함. 이는 특히 항목을 추가하거나 이전 버전의 JSON 항목의 차이를 분석할 때 중요함.

  • JSON Patch의 강점 중 하나는 멱등성임. JSON Patch 작업은 의도하지 않은 부작용 없이 안전하게 재시도할 수 있음. 그러나 배열에 항목을 추가할 수 없다는 점은 놀라웠음.

  • MongoDB 업데이트 쿼리와 유사하게 작동함. 로컬 파일에서 전체 MongoDB를 실행하지 않고도 업데이트 언어를 사용할 수 있는지 궁금함.

  • JSONDiffpatch와 JSON Patch의 비교가 필요함. JSONDiffpatch는 브라우저와 노드/클라우드플레어 워커 등에서 잘 작동함.

  • JSON Patch를 외부 파트너에게 배우도록 설득하는 데 어려움이 있었음. 고객 대상 API에서 사용했으며, 사용자가 이해하고 채택하도록 많은 노력을 기울였음.

  • JSON Pointer 사양이 "URL-y"하게 느껴져 메타-JSON 구문을 건너뛸 수 있을 것 같음. "test"와 "copy"는 JSON Patch 사양에서 고유하며, 여러 편집을 한 번에 수행하는 "트랜잭션"도 가능함.