aip-124
TL;DR
- API 리소스 계층 구조는 단일 부모를 가져야 함.
- 다대일 관계가 있는 경우 하나의 정식 부모를 선택해야 함.
- 다대다 관계는
repeated
필드 또는 서브 리소스로 모델링할 수 있음. - 서브 리소스는 추가 메타데이터가 필요할 때만 사용해야 함.
리소스 계층 구조 원칙
- API의 각 리소스는 하나의 정식 부모만 가져야 함.
- List 요청 시, 두 개 이상의 부모를 필요로 하지 않아야 함.
parent
필드는 필수(required) 필드로 지정해야 함.
다대일 관계 모델링
- 리소스가 여러 개의 부모를 가질 수 있는 경우, 단 하나의 정식 부모를 선택해야 함.
- 다른 연관된 리소스는 추가 필드로 관리해야 함.
- 예제:
message Book {
option (google.api.resource) = {
type: "library.googleapis.com/Book"
pattern: "publishers/{publisher}/books/{book}"
};
string name = 1 [(google.api.field_behavior) = IDENTIFIER];
string author = 2 [(google.api.resource_reference) = {
type: "library.googleapis.com/Author"
}];
}
다대다 관계 모델링
- 기본적으로
repeated
필드를 사용하여 다대다 관계를 표현할 수 있음. - 예제:
message Book {
option (google.api.resource) = {
type: "library.googleapis.com/Book"
pattern: "publishers/{publisher}/books/{book}"
};
string name = 1 [(google.api.field_behavior) = IDENTIFIER];
repeated string authors = 2 [(google.api.resource_reference) = {
type: "library.googleapis.com/Author"
}];
}
서브 리소스를 활용한 다대다 관계 모델링
repeated
필드가 제한적이거나, 추가적인 메타데이터가 필요할 경우 서브 리소스를 사용할 수 있음. - 예제:
message BookAuthor {
option (google.api.resource) = {
type: "library.googleapis.com/BookAuthor"
pattern: "publishers/{publisher}/books/{book}/authors/{book_author}"
};
string name = 1 [(google.api.field_behavior) = IDENTIFIER];
string author = 2 [(google.api.resource_reference) = {
type: "library.googleapis.com/Author"
}];
}
정리
- 리소스 계층 구조는 단일 부모 원칙을 따라야 함.
- 다대일 관계는 하나의 정식 부모를 설정하고, 다른 연관 관계는 추가 필드로 관리해야 함.
- 다대다 관계는
repeated
필드 또는 서브 리소스를 활용할 수 있으며, 추가적인 메타데이터가 필요할 때만 서브 리소스를 사용해야 함.