OpenAPI 변경 비교
OpenAPI Diff
두 OpenAPI 문서를 비교해 호환성을 깨는 변경과 추가만 된 변경을 구분해 보여 줍니다.
OpenAPI 문서 두 판본을 비교해서 변경을 호환성이 깨지는 것과 더해지는 것으로 나눕니다. 쓰는 기준은 페이지에 적혀 있습니다. 이전 문서가 받아 주던 요청이 이제 거부될 수 있거나, 이전 문서가 약속한 응답을 기존 클라이언트가 다룰 수 없게 되면 깨진 것입니다.
이전 문서
이전 버전 파일 놓기
이 탭 안에서만 읽습니다.
새 문서
새 버전 파일 놓기
이 탭 안에서만 읽습니다.
호환성 깨짐
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 점검을 쓰세요.
사용 방법
이전 문서와 새 문서를 나란히 놓습니다
둘 다 JSON이든 YAML이든 됩니다. 이 탭에서 파싱하므로 아직 공개하지 않은 명세가 기계 밖으로 나가지 않습니다.
판정을 읽습니다
깨지는 변경과 더해지는 변경의 개수, 그리고 그것이 버전 번호에 무엇을 뜻하는지가 나옵니다. 메이저를 올릴지, 마이너면 되는지, 계약이 그대로라 올릴 것이 없는지입니다.
깨지는 것만 걸러서 읽습니다
작업별로 묶여 있고 무엇이 바뀌었는지가 붙어 있습니다. 마크다운 복사는 풀 리퀘스트 설명에 넣기 좋은 형태입니다.
자주 묻는 질문
응답 enum에 값을 더하는 게 왜 깨지는 건가요?
기존 클라이언트의 switch에 그 값에 대한 case가 없기 때문입니다. *요청* enum에 값을 더하는 건 안전합니다. 서버가 전보다 더 받아 주는 것이니까요. 응답 enum에 더하면 들어 본 적 없는 값을 클라이언트에 보내는 것입니다. 방향이 판단을 가릅니다.
컴포넌트 이름을 바꿨는데 변경이 없다고 나옵니다.
맞습니다. 스키마는 `$ref`를 따라간 뒤에 비교하므로, 이름만 바뀌고 모양이 같으면 같은 계약입니다. `components`의 이름은 내부적인 것이고, 클라이언트가 보는 것은 풀어낸 모양입니다.
응답의 필수 속성이 선택이 되면 정말 깨지는 건가요?
클라이언트 입장에서는 그렇습니다. 그 필드가 항상 있다고 약속받았고 코드가 조건 없이 읽고 있는데, 선택이 되면 서버가 빼도 되는 것이 됩니다. 필수와 선택은 요청과 응답에서 방향이 뒤바뀌고, 사람들이 거꾸로 알고 있는 부분이 그것입니다.
`oneOf`와 `anyOf`는 어떻게 다루나요?
통째로 비교해서 조금이라도 다르면 깨짐으로 표시합니다. 한 유니온이 다른 유니온을 포함하는지 판단하는 절차는 일부러 시도하지 않습니다. 넘겨도 되는 잘못된 "깨짐"이, 넘길 수 없는 잘못된 "안전"보다 낫습니다.
이 도구로 이어지는 것
JSON 비교
JSON Diff
키 순서를 무시하고 두 JSON을 구조로 비교해 추가·삭제·변경된 경로를 알려 줍니다.
OpenAPI 점검
OpenAPI Linter
OpenAPI 문서에서 누락된 응답, 쓰이지 않는 스키마, 아무것도 가리키지 않는 참조처럼 코드 생성기를 깨뜨리는 결함을 점검합니다.
Semver 범위 확인
Semver Range Tester
범위에 맞는 버전을 확인하고 두 버전을 비교하며 목록을 우선순위대로 정렬합니다.
JSON 정렬·검사
JSON Formatter & Validator
JSON을 보기 좋게 정렬하거나 압축하고, 문법 오류가 난 줄과 열을 정확히 짚어 줍니다.
다음 단계
이 도구의 결과를 그대로 받을 수 있는 도구들입니다.
JSON 비교
JSON Diff
키 순서를 무시하고 두 JSON을 구조로 비교해 추가·삭제·변경된 경로를 알려 줍니다.
JSON 스키마 검증
JSON Schema Validator
문서를 JSON 스키마로 검증하고 실패한 위치를 경로와 함께 보여 줍니다.
OpenAPI 점검
OpenAPI Linter
OpenAPI 문서에서 누락된 응답, 쓰이지 않는 스키마, 아무것도 가리키지 않는 참조처럼 코드 생성기를 깨뜨리는 결함을 점검합니다.
Semver 범위 확인
Semver Range Tester
범위에 맞는 버전을 확인하고 두 버전을 비교하며 목록을 우선순위대로 정렬합니다.
JSON CSV 변환
JSON ⇄ CSV
중첩 JSON을 점 표기 열 이름으로 펼치거나, 표에서 객체를 다시 만듭니다.
JSON 정렬·검사
JSON Formatter & Validator
JSON을 보기 좋게 정렬하거나 압축하고, 문법 오류가 난 줄과 열을 정확히 짚어 줍니다.