설명
객체 스키마의 required는 해당 속성이 존재해야 한다는 뜻입니다. 속성에 default를 함께 지정하는 것 자체는 금지되지 않지만, 기본값 선언만으로 누락된 필수 속성이 채워지거나 검증을 통과하지는 않습니다. 실제 값의 적용은 클라이언트, 서버나 사용 도구의 동작에 달려 있습니다.
잠재적 영향
API 사용자가 기본값을 보고 필수 값을 생략하거나, 클라이언트와 서버가 서로 다른 시점에 기본값을 적용하면 검증 실패나 예상하지 못한 데이터 처리로 이어질 수 있습니다.
해결 방법
필수 여부를 실제 계약에 맞게 유지하고 기본값을 누가 언제 적용하는지 문서화하세요. 오해를 만드는 기본값은 제거하되 유효한 기본값을 일괄 금지하지 마세요. 값이 없을 때의 서버 처리와 클라이언트 동작을 확인하세요.
예시
OpenAPI 3.0 객체 스키마 발췌입니다. info와 paths는 생략했습니다. 변경 전의 id는 기본값이 있어도 필수 속성이며, 두 키워드의 조합 자체가 잘못된 것은 아닙니다.
변경 전
json
{
"openapi": "3.0.0",
"components": {
"schemas": {
"MyObject": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"default": "4056684e4e1347579362617ad82e5b4e"
}
}
}
}
}
}
변경 후
json
{
"openapi": "3.0.0",
"components": {
"schemas": {
"MyObject": {
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string",
"default": "guest"
}
}
}
}
}
}
변경 후에는 id의 기본값을 제거하고 선택 속성 name에 guest를 지정합니다. 이는 별도의 계약 선택이며, 선언만으로 name이 자동 입력되지는 않습니다.