본문으로 바로가기
728x90

현대의 소프트웨어 개발 환경에서는 대규모 JSON 데이터를 관리하고 동기화하는 일이 빈번합니다. 특히 OpenAPI와 같은 API 명세서를 다룰 때, 각 버전 간의 변경 사항을 추적하고 효율적으로 관리하는 것이 중요합니다. 이런 작업을 위해 JSON-Patch는 매우 유용한 도구로 자리 잡고 있습니다. 이번 글에서는 JSON-Patch란 무엇인지, 그리고 제가 경험한 사례를 통해 이를 어떻게 효과적으로 활용할 수 있는지 공유하고자 합니다.

JSON-Patch란 무엇인가?

JSON-Patch는 JSON 문서의 특정 부분을 추가, 삭제, 변경, 교체할 수 있도록 설계된 경량화된 표준입니다. RFC 6902로 정의된 이 표준은 다음과 같은 특징을 가지고 있습니다:

  1. 작은 크기: 변경 사항만을 포함하기 때문에 네트워크 사용량을 최소화합니다.
  2. 구조화된 형식: 명령(operation)과 경로(path)를 기반으로 JSON 데이터를 수정합니다.
  3. 범용성: 다양한 언어와 프레임워크에서 사용 가능합니다.

JSON-Patch는 기본적으로 아래와 같은 6가지 연산자를 지원합니다:

  • add: 새로운 값을 추가합니다.
  • remove: 값을 제거합니다.
  • replace: 값을 교체합니다.
  • move: 값을 다른 위치로 이동합니다.
  • copy: 값을 복사합니다.
  • test: 특정 경로의 값이 예상한 값과 일치하는지 확인합니다.

다음은 간단한 예제입니다:

[
  { "op": "replace", "path": "/name", "value": "John Doe" },
  { "op": "add", "path": "/age", "value": 30 },
  { "op": "remove", "path": "/address" }
]

JSON-Patch와 OpenAPI: 실전 사례

최근에 OpenAPI 명세서를 커스터마이징할 일이 있었습니다. Swagger 문서를 받고 이를 클라이언트 사이드에서 수정해야 하는 상황이었는데, 이때 json-joy/lib/json-patch 라이브러리를 활용했습니다. 이 라이브러리는 JSON-Patch 표준을 구현한 강력한 도구로, 변경 사항을 효율적으로 관리할 수 있도록 도와줍니다.

OpenAPISpecification 클래스 설계

응집도를 높이기 위해 OpenAPISpecification이라는 클래스를 설계했습니다. 이 클래스는 Swagger 문서와 JSON-Patch를 다룰 수 있는 다양한 메서드를 제공합니다:

  • compare(spec1, spec2): 두 개의 명세서를 비교하여 차이를 반환합니다.
  • diff(): 현재 명세서와 다른 버전의 차이를 계산합니다.
  • get(path): 특정 경로의 값을 가져옵니다.
  • update(patch): JSON-Patch를 적용하여 명세서를 업데이트합니다.

특히, 이 클래스는 다음과 같은 방식으로 활용되었습니다:

  1. 명세서 버전 관리: 변경 사항을 JSON-Patch 형태로 기록하여, 이전 버전과의 차이를 명확히 확인하고 필요한 경우 쉽게 롤백할 수 있었습니다.
  2. 자동화된 업데이트: 클라이언트 애플리케이션에서 Swagger 명세서를 동적으로 수정해야 할 때, update 메서드를 통해 간단히 JSON-Patch를 적용할 수 있었습니다. 예를 들어, 특정 API 경로의 설명을 수정하거나 새로운 필드를 추가하는 작업이 수월해졌습니다.
  3. 테스트 및 검증: compare 메서드를 활용하여 명세서 간의 변경 사항을 검증하고, 누락된 수정 사항이나 예상치 못한 변경을 쉽게 발견할 수 있었습니다. 이를 통해 배포 전에 변경 사항의 안전성을 높일 수 있었습니다.

아래는 이를 활용한 주요 시나리오 중 하나입니다:

// 명세서 간의 차이점 확인
const spec1 = { paths: { "/users": { get: { description: "Get users" } } } };
const spec2 = { paths: { "/users": { get: { description: "Retrieve users list" } } } };

const openAPISpec = new OpenAPISpecification(spec1);
const patch = openAPISpec.diff(spec2);
console.log(patch);
// 결과: [ { op: 'replace', path: '/paths/users/get/description', value: 'Retrieve users list' } ]

// JSON-Patch를 적용하여 명세서 업데이트
openAPISpec.update(patch);
console.log(openAPISpec.spec);
// 업데이트된 명세서 출력

4. 팀 협업 향상: 프론트엔드와 백엔드 개발자 간에 명확한 통신 규칙을 정의하고, 서로 JSON-Patch를 주고받으며 효율적으로 대규모 JSON 데이터를 관리할 수 있었습니다. 예를 들어, 백엔드에서는 Spring 기반 라이브러리를 사용해 클라이언트가 보낸 패치를 적용하고, 클라이언트는 이를 UI에 실시간 반영했습니다.


JSON-Patch의 장점

  1. 효율성: 변경 사항만 처리하기 때문에 대규모 데이터 관리에 적합합니다.
  2. 유연성: 다양한 언어와 플랫폼에서 사용할 수 있습니다.
  3. 협업 향상: 클라이언트와 서버 간의 명확한 통신 규칙을 설정할 수 있습니다.

마무리

JSON-Patch는 단순하면서도 강력한 도구로, 특히 대규모 JSON 데이터를 다루는 환경에서 효율성을 극대화할 수 있습니다. 제가 경험한 OpenAPI 명세서 커스터마이징 사례는 이를 잘 보여주는 예입니다. 만약 JSON 데이터를 효과적으로 관리하고 싶은 개발자라면 JSON-Patch를 적극적으로 활용해 보시길 권장합니다.

더 나아가, 이러한 사례를 통해 데이터 관리의 효율성을 높이고, 팀 간 협업을 강화할 수 있는 방법을 고민해 보세요. 이 글이 JSON-Patch를 활용하고자 하는 개발자들에게 작은 영감이 되길 바랍니다.