SAP

[SAP] CAP Entity 모델링 키워드

JDonly 2024. 7. 14. 10:00

엔터티(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 요소로 구성됩니다.