[SAP] CAP Entity 모델링 키워드
엔터티(entity)를 정의할 때 사용하는 모델링 키워드.
SAP CAP 모델링에서 다양한 키워드를 사용하여 엔티티, 서비스, 관계등을 정의한다.
* [ 요약 ] *
- cuid : 전역적으로 고유한 ID를 자동으로 생성
- managed : 메타데이터를 자동으로 관리
- aspect : 여러 엔티티에서 재사용할 수 있는 엔티티
- type : 커스텀 데이터 타입을 정의
- association : 두 개의 엔티티(테이블)를 연결 / 외래 키(Foreign Key)와 유사한 역할
- composition : 한 엔티티가 다른 엔티티를 포함하는 관계(두 엔티티 간의 강한 관계)
- context : 관련 영역을 그룹핑
- localized : 다국어 지원이 가능하도록 설정
- event : 주로 서비스나 데이터 모델에서 발생하는 이벤트
- function : 서비스 내에서 수행할 수 있는 비즈니스 로직을 정의
- action : 특정 기능을 수행
- extends : 데이터 모델에서 다른 엔티티나 타입을 확장하여 새로운 필드나 기능을 추가
- using : 외부 데이터 소스나 라이브러리를 사용
- view : 가상의 테이블이나 집합을 정의
- element : 엔티티나 구조체에서 하위 요소를 정의
[ cuid (Canonical Unique ID) ]
cuid는 Canonical Unique Identifier의 약자로, 전역적으로 고유한 ID를 자동으로 생성해주는 속성입니다.
이는 엔티티의 기본 키로 사용됩니다.
cuid는 주로 UUID (Universally Unique Identifier) 형식으로 생성되며, 각 레코드가 유일한 식별자를 가지게 합니다.
예를 들어, entity Books : cuid라고 선언하면 Books 엔티티는 자동으로 ID 필드를 가지며, 이 필드는 전역적으로 고유한 값으로 설정됩니다.
entity Books : cuid {
title : localized String;
author : Association to Authors;
}
## Books 엔티티는 전역적으로 고유한 ID를 자동 생성합니다.
[ managed ]
managed는 엔티티가 자동으로 관리되는 속성을 포함하고 있음을 나타냅니다.
즉, 생성 및 수정 시간, 생성자 및 수정자 등의 메타데이터를 자동으로 관리해주는 속성들을 추가합니다.
예를 들어, entity Orders : cuid, managed라고 선언하면 Orders 엔티티는 자동으로 createdAt, createdBy, modifiedAt, modifiedBy 등의 필드를 가지며, 이는 데이터가 생성되거나 수정될 때 자동으로 설정되고 업데이트됩니다.
entity Orders : cuid, managed {
descr : String;
Items : Composition of many {
book : Association to Books;
quantity : Integer;
}
}
## Orders 엔티티는 생성 및 수정 메타데이터를 자동으로 관리합니다.
[ aspect ]
Address aspect는 여러 엔티티에서 재사용할 수 있는 엔티티입니다.
하지만 기본 엔티티와 다른점은, aspect는 특정 공통 속성 그룹을 정의하여 여러 엔티티에 재사용할 수 있게 하는 일종의 "속성 모듈"입니다. 이를 통해 코드의 재사용성을 높이고 일관성을 유지할 수 있습니다.
aspect를 사용하면 공통된 속성을 여러 엔티티에 쉽게 추가할 수 있지만, aspect 자체는 독립적인 엔티티로 동작하지 않습니다. 대신 다른 엔티티에 포함되어 속성을 확장하는 데 사용됩니다.
aspect는 공통된 속성을 여러 엔티티에 포함시켜 재사용할 수 있게 해주지만, 그 자체로는 독립적으로 사용될 수 없습니다.
aspect Address {
street : String;
city : String;
country: String;
}
entity Customers : cuid {
name : String;
address : Address;
}
entity Suppliers : cuid {
companyName : String;
address : Address;
}
## Customers와 Suppliers엔티티가 공통적으로 주소 정보를 가지게 됩니다.
## Address aspect:
Address는 독립적으로 사용되지 않습니다.데이터베이스에 Address라는 테이블이 생성되지 않습니다.
## Customers와 Suppliers 엔티티:
Customers와 Suppliers는 각각 address라는 속성을 가지고 있습니다.
이 address 속성은 Address aspect를 포함합니다.데이터베이스에는 Customers와 Suppliers 테이블이 생성되며, 각각의 테이블에 address_street, address_city, address_country 컬럼이 포함됩니다.
--> 쿼리 예시 )
SELECT name, address_street, address_city, address_country FROM Customers;
SELECT companyName, address_street, address_city, address_country FROM Suppliers;
[ entity ]
entity Authors : cuid {
name : String;
name2 : String;
books : Composition of many Books on books.author = $self;
}
entity Books : cuid {
title : localized String;
author : Association to Authors;
}
## '$self' 는 기본적으로 현재 엔티티의 기본 키를 참조합니다.
## 특정 컬럼값과 매핑시키고 싶다면 ?
-> books : Composition of many Books on books.author_name2 = name2;
[ type ]
커스텀 데이터 타입을 정의합니다. 이를 통해 코드의 재사용성과 가독성을 높이고, 데이터 모델의 일관성을 유지할 수 있습니다.
type Currency : String(3);
type DateOnly : Date;
entity Products : cuid {
name : String;
price : Decimal(10, 2);
currency : Currency;
startDate: DateOnly;
}
entity Orders : cuid {
orderNumber : Integer;
totalPrice : Decimal(10, 2);
orderDate : DateOnly;
}
[ association ]
association은 데이터 모델링에서 두 개의 엔티티(테이블)를 연결하는 개념으로 사용됩니다.
특히 외래 키(Foreign Key)와 유사한 역할을 합니다. 이를 통해 두 엔티티 간의 관계를 정의하고, 이 관계를 통해 데이터베이스에서 데이터를 관리하거나 조회할 수 있습니다.
단방향, 양방향 association을 선택하여 적용시킬 수 있습니다.
entity Authors : cuid {
ID : Integer;
name : String;
}
entity Books : cuid {
ID : Integer;
title : String;
author : Association to Authors;
}
## Books 엔티티에서 Authors 엔티티로의 관계를 정의합니다.
[ composition ]
Composition은 데이터 모델링에서 한 엔티티가 다른 엔티티를 포함하는 관계를 나타냅니다.
이 관계에서 포함된 엔티티는 포함하는 엔티티 없이는 존재할 수 없습니다.
Composition은 두 엔티티 간의 강한 관계를 나타내며, 주로 "부분-전체" 관계를 표현하는 데 사용됩니다.
* 부모-자식 관계
Composition에서는 한 엔티티를 부모(Parent) 엔티티라고 하고, 다른 엔티티를 그 부분으로 포함되는 자식(Child) 엔티티라고 합니다.
* 생명 주기 의존성
부모 엔티티가 생성될 때 자식 엔티티도 함께 생성되며, 부모 엔티티가 삭제될 때 자식 엔티티도 함께 삭제됩니다.
즉, 자식 엔티티는 부모 엔티티의 생명 주기에 의존적입니다.
* 강한 연관성
Composition 관계에서는 부모 엔티티와 자식 엔티티 간의 연결이 강력하며, 자식 엔티티는 여러 부모 엔티티와 연결될 수 없습니다. 각 자식 엔티티는 오직 하나의 부모 엔티티에 속합니다.
* 부분-전체 관계
Composition은 보통 부분-전체 관계를 표현합니다.
즉, 부모 엔티티는 여러 부분(자식 엔티티)으로 구성되며, 이들 부분이 모여서 전체를 이룹니다.
entity Order : cuid {
ID : Integer;
orderDate : Date;
items : Composition of many OrderItem on items.order = $self;
}
entity OrderItem : cuid {
ID : Integer;
product : String;
quantity : Integer;
order : Association to Order;
}
## Order 엔티티: 각 주문에 대한 정보를 포함합니다.
## items는 OrderItem 엔티티를 여러 개 포함하는 Composition 관계입니다.
## 주문이 생성될 때 해당 주문에 속하는 OrderItem도 함께 생성되며, 주문이 삭제될 때 함께 삭제됩니다.
## OrderItem 엔티티: 각 주문 항목에 대한 정보를 포함합니다.
## order는 해당 주문 항목이 속하는 Order 엔티티를 참조하는 association입니다.
⚡Composition vs. Association
- Composition (구성):
- 정의: Composition은 하나의 엔티티(전체)가 다른 하나 이상의 엔티티(부분)로 구성된 강한 관계를 나타냅니다.
- 의존성: 부분(자식 엔티티)의 생명 주기가 전체(부모 엔티티)에 의존적입니다. 부모가 없으면 자식도 존재할 수 없습니다.
- 소유권: 부모 엔티티가 자식 엔티티를 소유하며, 자식 엔티티의 생성과 삭제를 관리합니다.
- 예시: 주문(Order) 엔티티가 여러 주문 상품(OrderItem) 엔티티들로 구성됩니다. 주문이 없으면 상품도 없고, 상품은 특정 주문에 속해있습니다.
- Association (연관):
- 정의: Association은 두 엔티티 간의 더 약한 관계를 나타냅니다. 두 엔티티는 연결되어 있지만 서로 독립적으로 존재할 수 있습니다.
- 의존성: 연관된 엔티티 간에는 생명 주기 의존성이 없습니다. 각 엔티티는 독립적으로 존재하며 필요에 따라 연결될 수 있습니다.
- 소유권: 연관에서는 소유권이나 강한 의존성이 의미되지 않습니다. 단순히 두 엔티티가 서로를 참조하거나 연결하는 관계를 의미합니다.
- 예시: 직원(Employee) 엔티티와 부서(Department) 엔티티가 연관됩니다. 직원은 한 부서에 속할 수 있지만 부서와 직원은 독립적으로 존재할 수 있습니다.
이렇게 Composition은 더 강한 관계를 나타내며, 전체와 부분 사이의 강한 종속성을 갖습니다.
반면 Association은 더 유연하게 엔티티를 연결하며, 각 엔티티의 독립성을 보장합니다.
데이터 모델을 설계할 때 이러한 관계의 차이를 잘 이해하고 적절히 활용하는 것이 중요합니다.
[ context ]
Context는 데이터 모델링에서 모델의 일부분을 구분지을 수 있는 상호 독립적인 영역이나 관점을 나타냅니다.
각 context는 모델의 일부를 정의하고, 이해하고, 관리하는 데 도움을 줍니다. / ( 관련 영역을 그룹으로 묶는다.)
## 사용 예시:
## 한 데이터베이스에서 "주문 관리"와 "재고 관리"는 서로 다른 context일 수 있습니다.
## 각 context는 다른 엔티티, 관계, 규칙을 포함할 수 있으며, 이를 통해 각각의 기능을 독립적으로 관리할 수 있습니다.
// 주문 관리 context
context OrderManagement {
entity Order : cuid {
ID : Integer;
orderDate : Date;
items : Composition of many OrderItem on items.order = $self;
}
entity OrderItem : cuid {
ID : Integer;
product : String;
quantity : Integer;
order : Association to Order;
}
}
// 재고 관리 context
context InventoryManagement {
entity Product : cuid {
ID : Integer;
name : String;
quantity : Integer;
}
entity Warehouse : cuid {
ID : Integer;
location : String;
products : Association to many Product on products.warehouse = $self;
}
}
## OrderManagement context: 주문 관리를 위한 context로, 주문과 주문 상품을 관리하는 엔티티들을 포함합니다.
## InventoryManagement context: 재고 관리를 위한 context로, 제품과 창고를 관리하는 엔티티들을 포함합니다.
[ localized ]
다국어 지원이 가능하도록 설정
entity Books : cuid {
title : localized String;
}
[ event ]
이벤트는 특정 상황이나 조건이 발생했음을 나타내는 것으로, CAP 모델링에서 주로 서비스나 데이터 모델에서 발생하는 이벤트를 다룹니다.
service MyService {
entity MyEntity {
key ID : Integer;
field1 : String;
}
event MyEvent @cds.persistence.exists;
}
## 위 예시에서 MyEvent는 데이터베이스에 MyEntity가 존재할 때 발생하는 이벤트를 정의합니다.
[ function ]
function 함수는 서비스 내에서 수행할 수 있는 비즈니스 로직을 정의하는 데 사용됩니다.
service MyService {
function calculateTax(amount: Integer) returns Integer;
}
## 위 예시에서 calculateTax 함수는 정수형 amount를 입력으로 받아 세금을 계산하여 정수형 결과를 반환하는 함수입니다.
[ action ]
action은 서비스의 특정 기능을 수행하도록 정의되는 것으로, 주로 데이터의 변경을 목적으로 합니다.
service MyService {
action resetPassword(userId: UUID);
}
## 위 예시에서 resetPassword 액션은 UUID 형식의 userId를 입력으로 받아 해당 사용자의 비밀번호를 재설정하는 기능을 수행합니다
[ extends ]
extends 확장은 데이터 모델에서 다른 엔티티나 타입을 확장하여 새로운 필드나 기능을 추가할 수 있도록 합니다.
entity ExtendedEntity extends BaseEntity {
newField: String;
}
## 위 예시에서 ExtendedEntity는 BaseEntity라는 기본 엔티티를 확장하여 newField라는 새로운 필드를 추가한 엔티티입니다.
[ using ]
using은 CAP 모델링에서 데이터 모델이나 서비스 정의에서 외부 데이터 소스나 라이브러리를 사용하는 데 사용됩니다.
using {
currencyService as "@sap/cds/common.CurrencyService";
}
## 위 예시에서 currencyService는 외부의 @sap/cds/common.CurrencyService를 사용하여 특정 기능을 구현하도록 설정합니다.
using { Currency } from './Types';
entity Products : cuid { name : String; price : Decimal(10, 2); currency : Currency; }
## 다른 파일에서 정의된 타입을 가져옵니다.
[ view ]
뷰는 데이터를 조회하기 위한 가상의 테이블이나 집합을 정의하는 데 사용됩니다.
entity Customer {
key ID : Integer;
name : String;
address : String;
}
view CustomerDetails as select from Customer {
ID,
name,
address
} where address like 'New%';
## 위 예시에서 CustomerDetails 뷰는 Customer 엔티티에서 주소가 'New'로 시작하는 고객의 ID, 이름, 주소를 조회하는 가상의 테이블입니다.
[ element ]
요소는 엔티티나 구조체에서 하위 요소를 정의할 때 사용됩니다.
entity Order {
key ID : Integer;
items : Composition of many OrderItem;
}
entity OrderItem {
key ID : Integer;
product : String;
quantity : Integer;
}
## 위 예시에서 items는 Order 엔티티의 구성 요소로서, 여러 개의 OrderItem 요소로 구성됩니다.