๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
BTP

Custom CDS Entry ๋ž€?

2026.05.0646
๐Ÿ’กSummary Custom CDS Entity = ABAP Class ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต Basic CDS(์ผ๋ฐ˜ CDS) = DB ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต Custom CDS Entity ๋Š” ์™ธ๋ถ€์—์„œ Odata/RAP๋กœ ์กฐํšŒ ๋˜๋Š” CRUD ์š”์ฒญ์‹œ ABAP Class์—์„œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ADT์—์„œ Custom Entity๋ฅผ ๊ทธ๋ƒฅ F8๋กœ ์กฐํšŒ์‹œ ๋ฐ์ดํ„ฐ ์กฐํšŒ๊ฐ€ ์•ˆ๋˜๋Š”๊ฒƒ. DB๊ฐ€ ์—†์œผ๋‹ˆ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ ์ˆ˜ ์—†๊ณ  ABAP Class์—์„œ ๋จผ์ € ์ฒ˜๋ฆฌ ๋œ ์ดํ›„์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ

Custeom CDS Entity๋Š” SQL ๊ตฌ์กฐ๊ฐ€ ์•„๋‹˜.

๋”ฐ๋ผ์„œ entity ํ™•์ธ ์‹œ select from ... ๊ฐ€ ์—†์Œ

๋Œ€์‹  Annotation ์œผ๋กœ @ObjectModel.query.implementedBy: ๋ฅผ ํ†ตํ•ด ABAP Class๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋จ

@EndUserText.label: 'API Based Custom Entity'
@ObjectModel.query.implementedBy: 'ABAP:ZCL_ABAP_CLASS'  "<- ABAP Class
define root custom entity ZI_CUSTOM_CDS                  "<- select from ... ๊ฐ€ ์—†์Œ
{
  key Id    : abap.char(20);
      Name  : abap.char(50);
      Value : abap.char(100);
}
โš ๏ธ ์ฃผ์˜ - โ€™Custom Entity๊ฐ€ SQLํ˜•์‹์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒโ€™ ์ด์ง€, โ€˜ABAP Class์—์„œ SQL์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒโ€™ ์ด ์•„๋‹˜.

  • ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋กœ์ง์„ ABAP ํด๋ž˜์Šค๊ฐ€ ๊ตฌํ˜„
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์Œ
  • ABAP SQL๋กœ ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ
  • ์ฃผ๋กœ RAP unmanaged query ๊ฐ™์€ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์‚ฌ์šฉ

์™ธ๋ถ€์—์„œ ํ˜ธ์ถœ์„ ํ•œ๋‹ค๊ณ ?

๐Ÿ’ก ์™ธ๋ถ€์—์„œ OData/RAP ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค ๋Š” ๋œป์€,์™ธ๋ถ€๊ฐ€ ์กฐํšŒ ์š”์ฒญ(request) ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด์ง€, ABAP Class์— ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๋„ฃ์–ด์ค€๋‹ค ๋Š” ๋œป์€ ์•„๋‹™๋‹ˆ๋‹ค.

1. OData/RAP ์„œ๋น„์Šค ํ˜ธ์ถœ

  • ์™ธ๋ถ€๊ฐ€ SAP endpoint๋ฅผ ํ˜ธ์ถœ
  • ์˜ˆ: GET /.../SalesOrders
  • SAP ๋‚ด๋ถ€์—์„œ ABAP Class๊ฐ€ ์‹คํ–‰๋จ
  • ABAP Class๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒ/๊ฐ€๊ณตํ•ด์„œ ์‘๋‹ต ๋ฐ˜ํ™˜
  • ์™ธ๋ถ€๋Š” โ€œ์š”์ฒญโ€๋งŒ ํ•จ

์ฆ‰:

์™ธ๋ถ€ -> ์กฐํšŒ ์š”์ฒญ

ABAP Class -> ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ํ›„ ์‘๋‹ต

2. ABAP Class์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด์ฃผ๋Š” ๊ตฌ์กฐ

  • ์™ธ๋ถ€๊ฐ€ payload ์ž์ฒด๋ฅผ SAP์— ์ „๋‹ฌ
  • SAP๊ฐ€ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์„œ ์ €์žฅ/์ฒ˜๋ฆฌ
  • ๋ณดํ†ต POST, PATCH, CREATE, UPDATE ๊ฐ™์€ ์ž…๋ ฅ ์‹œ๋‚˜๋ฆฌ์˜ค
  • ์ด๊ฑด ์กฐํšŒ์šฉ Custom Entity ์™€๋Š” ๋‹ค๋ฅธ ์„ฑ๊ฒฉ

์ฆ‰ ํ˜ผ๋™๋  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์€:

  • ์„œ๋น„์Šค ํ˜ธ์ถœ = ์‹คํ–‰ ํŠธ๋ฆฌ๊ฑฐ
  • ๋ฐ์ดํ„ฐ ์ฃผ์ž… = ์ž…๋ ฅ payload ์ „๋‹ฌ

Custom Entity ๋Š” ์ฃผ๋กœ ์ฒซ ๋ฒˆ์งธ์ž…๋‹ˆ๋‹ค.

์™ธ๋ถ€๊ฐ€ ํ•˜๋Š” ์ผ์€:

  • โ€œ์ด ๋ฐ์ดํ„ฐ ๋ณด์—ฌ์ค˜โ€
  • โ€œ์ด ์กฐ๊ฑด์œผ๋กœ ์กฐํšŒํ•ด์ค˜โ€

๊ทธ๋Ÿฌ๋ฉด ABAP Class๊ฐ€:

  • API ํ˜ธ์ถœ
  • ํ…Œ์ด๋ธ” ์กฐํšŒ
  • ๊ฐ€๊ณต
  • ์‘๋‹ต ๋ฐ˜ํ™˜
flowchart LR
  A["์™ธ๋ถ€ ์‹œ์Šคํ…œ"] -->|์กฐํšŒ ์š”์ฒญ OData/RAP| B["SAP Service Endpoint"]
  B --> C["Custom CDS Entity"]
  C -->|implementedBy| D["ABAP Query Provider Class"]
  D --> E["API ํ˜ธ์ถœ / ํ…Œ์ด๋ธ” ์กฐํšŒ / ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต"]
  E --> D
  D -->|์‘๋‹ต ๋ฐ์ดํ„ฐ ๋ฐ˜ํ™˜| B
  B --> A


Table Function ๊ณผ Custom Entity ์ฐจ์ด์ 

๐Ÿ’ก ๊ฒ‰์œผ๋กœ๋Š” ๋น„์Šทํ•˜์ง€๋งŒ ํ•ต์‹ฌ์ด ๋‹ค๋ฆ„. Custom Entity ์™€ Table Function ์€ โ€œ ์–ด๋””์„œ ์‹คํ–‰๋˜๋А๋ƒ โ€์™€ โ€œ ๋ฌด์—‡์œผ๋กœ ์žฌ์‚ฌ์šฉ๋˜๋А๋ƒ โ€์˜ ์ฐจ์ด๊ฐ€ ์žˆ์Œ.

๊ณต์‹ ๊ทผ๊ฑฐ:

  • Custom Entity๋Š” transient์ด๊ณ  ABAP SQL์ด๋‚˜ ๋‹ค๋ฅธ CDS์˜ data source๋กœ ๋ชป ์”๋‹ˆ๋‹ค: Custom Entities
  • Table Function์€ AMDP/SQLScript๋กœ DB์—์„œ ์‹คํ–‰๋˜๊ณ  ๋‹ค๋ฅธ CDS๋‚˜ ABAP SQL์˜ data source๋กœ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: Table Functions

๋Œ“๊ธ€

1
์ต๋ช…_9c0de4892026.05.06

์ข‹์€ ์ž๋ฃŒ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.