CAP for Node

DB 컬럼 없이 계산값 노출 — 한 줄로 3가지 #shorts #SAP #CAP

이 글이 답하는 질문

  • DB 컬럼을 추가하지 않고 계산된 값을 API 응답에 포함하려면?
  • CDS virtual element와 projection 계산식, 어느 걸 써야 하나?

직접 해보기

1. CDS에서 virtual element 선언

entity에 virtual 키워드를 붙이면 DB 테이블에 컬럼이 생성되지 않습니다. 런타임에 값을 직접 채워야 합니다.

// db/schema.cds
entity Orders : cuid {
  price    : Decimal(10,2);
  quantity : Integer;
  virtual total : Decimal(10,2);  // DB 컬럼 없음
}

2. Node.js 핸들러에서 계산값 채우기

virtual field는 DB에서 읽어오지 않으므로 after READ 핸들러에서 직접 할당합니다.

// srv/orders-service.js
module.exports = cds.service.impl(async function () {
  const { Orders } = this.entities;

  this.after('READ', Orders, (orders) => {
    orders.forEach(o => {
      o.total = (o.price ?? 0) * (o.quantity ?? 0);
    });
  });
});

3. Projection에서 DB 레벨 계산식 사용

View/Projection에서는 계산식을 인라인으로 쓸 수 있습니다. DB가 직접 계산하므로 핸들러가 필요 없습니다.

// db/schema.cds
view OrderSummary as select from Orders {
  key ID,
  price,
  quantity,
  price * quantity as total : Decimal(10,2)
};

삽질 노트

  • virtual 필드에 @UI.Hidden이 없으면 Fiori Elements가 자동으로 컬럼으로 표시합니다. 의도치 않게 노출된다면 어노테이션으로 숨기세요.
  • Projection 계산식은 DB 레벨이라 $filter$orderby에 사용 가능하지만, virtual element는 불가합니다.
  • after READ 핸들러는 단건과 목록 모두 처리해야 합니다. 항상 배열처럼 다루세요.

핵심 한 줄

필터·정렬이 필요하면 Projection 계산식을, 비즈니스 로직이 필요하면 virtual element + 핸들러를 선택하세요.

더 파볼 주제

  • CDS Annotations로 computed field UI 제어
  • CAP custom handler — before/on/after 실행 순서

댓글 0

아직 댓글이 없습니다.