Composition vs Association — 차이 #shorts #SAP #CAP
Moderator
이 글이 답하는 질문
- CAP에서 Composition과 Association 중 어느 걸 써야 하나?
- 둘의 실제 동작 차이가 뭔가?
- Draft, cascade, OData expand에서 어떻게 달라지나?
핵심 차이 한눈에
| Composition | Association | |
|---|---|---|
| 관계 | 부모-자식 (강결합) | 독립 엔티티 참조 (약결합) |
| 자식 독립 존재 | 불가 — 부모 삭제 시 함께 삭제 | 가능 — 부모와 독립 |
| Draft 지원 | 자동 포함 | 포함 안 됨 |
| OData Deep Insert | 자동 지원 | 별도 요청 필요 |
| 대표 예시 | Order → OrderItems | Order → Customer |
직접 해보기
1. Composition — 자식이 부모에 종속
entity Orders : cuid {
status : String;
items : Composition of many OrderItems
on items.order = $self;
}
entity OrderItems : cuid {
order : Association to Orders;
product : String;
quantity : Integer;
}
2. Association — 독립 엔티티 참조
entity Orders : cuid {
status : String;
customer : Association to Customers; // 독립 참조
}
entity Customers : cuid {
name : String;
email : String;
// Orders 없어도 존재 가능
}
3. OData 요청 차이
// Composition — Deep Insert 한 번에
POST /Orders
{ "status":"New",
"items": [{"product":"A","quantity":2}] }
// Association — Customer 먼저 존재해야 함
POST /Orders
{ "status":"New", "customer_ID":"existing-uuid" }
삽질 노트
- Draft 기능은 Composition 관계에만 자동 적용 — Association 자식은 Draft에 포함 안 됨
- cascade delete는 Composition 전용 — Association에 적용하면 의도치 않은 데이터 삭제 위험
many없이Composition of OrderItem이면 단일 자식 — 실수 자주 발생
핵심 한 줄
Composition은 Order-Items처럼 함께 사는 관계, Association은 Order-Customer처럼 독립 참조.
더 파볼 주제
- CAP Draft 활성화 + Composition 깊이 탐구
- OData Deep Insert vs Individual POST 성능 비교