본문으로 건너뛰기

OpenAPI 변경 비교

OpenAPI Diff

두 OpenAPI 문서를 비교해 호환성을 깨는 변경과 추가만 된 변경을 구분해 보여 줍니다.

OpenAPI 문서 두 판본을 비교해서 변경을 호환성이 깨지는 것과 더해지는 것으로 나눕니다. 쓰는 기준은 페이지에 적혀 있습니다. 이전 문서가 받아 주던 요청이 이제 거부될 수 있거나, 이전 문서가 약속한 응답을 기존 클라이언트가 다룰 수 없게 되면 깨진 것입니다.

🔒 브라우저 안에서만 처리openapidiffapibreaking-change

이전 문서

이전 버전 파일 놓기

이 탭 안에서만 읽습니다.

새 문서

새 버전 파일 놓기

이 탭 안에서만 읽습니다.

호환성 깨짐

8

추가·보완

7

판정

메이저 버전 올려야 함

보기

GET /pets

  • 깨짐`in: query`의 `limit` 파라미터가 필수가 됐습니다.
  • 추가`in: query`의 `sort` 선택 파라미터가 추가됐습니다.
  • 변경요약이나 설명이 달라졌습니다.

GET /pets · responses["200"].content["application/json"]

  • 깨짐`[].id`의 타입이 integer에서 string으로 바뀌었습니다.
  • 깨짐`[].name` 속성이 선택이 됐습니다.
  • 깨짐`[].status`의 enum에 "pending" 값이 추가됐습니다.
  • 추가`[].owner` 선택 속성이 추가됐습니다.

GET /pets/{petId} · responses["200"].content["application/json"]

  • 깨짐`id`의 타입이 integer에서 string으로 바뀌었습니다.
  • 깨짐`name` 속성이 선택이 됐습니다.
  • 깨짐`status`의 enum에 "pending" 값이 추가됐습니다.
  • 추가`owner` 선택 속성이 추가됐습니다.

GET /pets/{petId}

  • 깨짐`404` 응답이 사라졌습니다.

DELETE /pets/{petId}

  • 추가작업이 추가됐습니다.

components.schemas.Owner

  • 추가스키마가 추가됐습니다.

info.version

  • 변경`1.0.0` → `2.0.0`

호환성이 깨진다고 판단하는 규칙

한 문장으로: 이전 문서가 받아 주던 요청이 거부될 수 있거나, 이전 문서가 약속한 응답을 기존 클라이언트가 못 다루게 되면 깨진 것입니다. 그래서 경로·작업·응답 코드·미디어 타입·응답 속성의 제거, 필수 파라미터·필수 요청 속성의 추가, 선택→필수, 타입 변경, 요청 enum 값 제거, 응답 enum 값 추가(클라이언트의 switch에 case가 없습니다), 응답 속성의 필수→선택은 깨짐이고, 그 반대 방향과 설명·태그·operationId·deprecated 표시는 호환입니다.

  • · 스키마는 문서 안의 $ref를 따라간 뒤 비교하므로 컴포넌트 이름만 바꾼 것은 변경이 아닙니다. 경로 파라미터도 이름이 아니라 위치로 맞춥니다.
  • · oneOf·anyOf·not 안은 통째로 비교해 달라졌으면 깨짐으로 표시합니다. 안쪽까지 들어가 판단하지는 않습니다.
  • · 다른 파일을 가리키는 $ref는 따라가지 않습니다. 파일을 하나로 합쳐서 넣으세요.

문서 하나를 점검하려면 OpenAPI 점검을 쓰세요.

사용 방법

  1. 이전 문서와 새 문서를 나란히 놓습니다

    둘 다 JSON이든 YAML이든 됩니다. 이 탭에서 파싱하므로 아직 공개하지 않은 명세가 기계 밖으로 나가지 않습니다.

  2. 판정을 읽습니다

    깨지는 변경과 더해지는 변경의 개수, 그리고 그것이 버전 번호에 무엇을 뜻하는지가 나옵니다. 메이저를 올릴지, 마이너면 되는지, 계약이 그대로라 올릴 것이 없는지입니다.

  3. 깨지는 것만 걸러서 읽습니다

    작업별로 묶여 있고 무엇이 바뀌었는지가 붙어 있습니다. 마크다운 복사는 풀 리퀘스트 설명에 넣기 좋은 형태입니다.

자주 묻는 질문

응답 enum에 값을 더하는 게 왜 깨지는 건가요?

기존 클라이언트의 switch에 그 값에 대한 case가 없기 때문입니다. *요청* enum에 값을 더하는 건 안전합니다. 서버가 전보다 더 받아 주는 것이니까요. 응답 enum에 더하면 들어 본 적 없는 값을 클라이언트에 보내는 것입니다. 방향이 판단을 가릅니다.

컴포넌트 이름을 바꿨는데 변경이 없다고 나옵니다.

맞습니다. 스키마는 `$ref`를 따라간 뒤에 비교하므로, 이름만 바뀌고 모양이 같으면 같은 계약입니다. `components`의 이름은 내부적인 것이고, 클라이언트가 보는 것은 풀어낸 모양입니다.

응답의 필수 속성이 선택이 되면 정말 깨지는 건가요?

클라이언트 입장에서는 그렇습니다. 그 필드가 항상 있다고 약속받았고 코드가 조건 없이 읽고 있는데, 선택이 되면 서버가 빼도 되는 것이 됩니다. 필수와 선택은 요청과 응답에서 방향이 뒤바뀌고, 사람들이 거꾸로 알고 있는 부분이 그것입니다.

`oneOf`와 `anyOf`는 어떻게 다루나요?

통째로 비교해서 조금이라도 다르면 깨짐으로 표시합니다. 한 유니온이 다른 유니온을 포함하는지 판단하는 절차는 일부러 시도하지 않습니다. 넘겨도 되는 잘못된 "깨짐"이, 넘길 수 없는 잘못된 "안전"보다 낫습니다.

이 도구로 이어지는 것

다음 단계

이 도구의 결과를 그대로 받을 수 있는 도구들입니다.