RAP

RAP Determination vs Validation ์ฐจ์ด #shorts #SAP #RAP

๐Ÿ“– ๊ฐœ์š” โ€” ์ด ๊ธ€์—์„œ ๋‹ค๋ฃจ๋Š” ๊ฒƒ

RAP(ABAP RESTful Application Programming Model)์˜ Behavior Definition์„ ์ฒ˜์Œ ๋‹ค๋ฃจ๋‹ค ๋ณด๋ฉด ๊ฐ€์žฅ ์ž์ฃผ ๋งˆ์ฃผ์น˜๋Š” ๊ฐˆ๋ฆผ๊ธธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. "์ด ๋กœ์ง์€ Determination์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋‚˜, Validation์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋‚˜?" ๋‘˜ ๋‹ค ์ €์žฅ ํ๋ฆ„ ์–ด๋”˜๊ฐ€์—์„œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๋กœ์ง์ด๋ผ๋Š” ์  ๋•Œ๋ฌธ์— ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‰ฝ์ง€๋งŒ, ๋ชฉ์ ๊ณผ ๋™์ž‘ ์›๋ฆฌ๊ฐ€ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด ๊ธ€์€ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ๋‚˜์—ดํ•˜๋Š” ๋Œ€์‹ , ๋‘ ๊ฐœ๋…์˜ ์ฐจ์ด๋ฅผ ํŒ๋‹จ ๊ธฐ์ค€ ์ค‘์‹ฌ์œผ๋กœ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • Determination๊ณผ Validation์˜ ๋ชฉ์  ์ฐจ์ด๋ฅผ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค
  • ๋ฐœ๋™ ์‹œ์ (on modify / on save)๊ณผ ์ €์žฅ ์‹œํ€€์Šค ๋‚ด ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์ดํ•ดํ•œ๋‹ค
  • ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ์—ฌ๋ถ€์™€ ์ €์žฅ ๊ฑฐ๋ถ€ ๊ฐ€๋Šฅ ์—ฌ๋ถ€์˜ ๋น„๋Œ€์นญ์„ ์ดํ•ดํ•œ๋‹ค
  • ์‹ค๋ฌด์—์„œ ์ž์ฃผ ๋‚˜์˜ค๋Š” ํ˜ผ์šฉ ์‹ค์ˆ˜ ํŒจํ„ด์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค

๐Ÿ“š ์‹œ์ž‘ ์ „์— ์•Œ๊ณ  ์žˆ์œผ๋ฉด ์ข‹์€ ๊ฒƒ

์ด ๊ธ€์€ intermediate ๋‚œ์ด๋„๋กœ, ๋‹ค์Œ ๋‚ด์šฉ์„ ์ด๋ฏธ ์ ‘ํ•ด ๋ณธ ๋…์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. CDS View Entity ๊ธฐ๋ณธ ๋ฌธ๋ฒ•, Managed RAP ๋น„์ฆˆ๋‹ˆ์Šค ์˜ค๋ธŒ์ ํŠธ์˜ ๊ตฌ์กฐ(Behavior Definition + Behavior Implementation ํด๋ž˜์Šค), ๊ทธ๋ฆฌ๊ณ  EML(Entity Manipulation Language)์˜ READ/MODIFY ๊ตฌ๋ฌธ ๊ธฐ์ดˆ์ž…๋‹ˆ๋‹ค. Determination์ด๋‚˜ Validation์„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด ๋ณธ ๊ฒฝํ—˜์€ ์—†์–ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ๊ตฌํ˜„ ์ „์— ์ด ๊ธ€๋กœ ๊ฐœ๋… ์ง€๋„๋ฅผ ๋จผ์ € ๊ทธ๋ ค ๋‘๋Š” ํŽธ์ด ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ์ค„์—ฌ ์ค๋‹ˆ๋‹ค.

๐Ÿ”ง ํ™˜๊ฒฝ๊ณผ ์ค€๋น„๋ฌผ

์ด ๊ธ€์˜ ์˜ˆ์ œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ ํ™˜๊ฒฝ์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

  • SAP BTP ABAP Environment ๋˜๋Š” SAP S/4HANA 2022 ์ด์ƒ(์˜จํ”„๋ ˆ๋ฏธ์Šค/Private Cloud, ABAP Platform 2022 ์ด์ƒ) โ€” ๋‘ ํ™˜๊ฒฝ ๋ชจ๋‘ strict(2) ๋ชจ๋“œ์˜ Managed RAP์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค
  • ABAP Development Tools(ADT) โ€” Eclipse ๊ธฐ๋ฐ˜. Behavior Definition์€ SE80/GUI์—์„œ ํŽธ์ง‘ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ADT๊ฐ€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค
  • Managed ๊ตฌํ˜„ ํƒ€์ž…์˜ RAP ๋น„์ฆˆ๋‹ˆ์Šค ์˜ค๋ธŒ์ ํŠธ 1๊ฐœ โ€” ์ด ๊ธ€์—์„œ๋Š” ์‚ฌ๋‚ด ์„ค๋น„ ์ˆ˜๋ฆฌ ์š”์ฒญ ๊ด€๋ฆฌ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฃจํŠธ ์—”ํ‹ฐํ‹ฐ ZR_FCM_RepReq(๋ณ„์นญ RepairRequest), ์ €์žฅ ํ…Œ์ด๋ธ” zfcm_repreq, ์ฃผ์š” ํ•„๋“œ๋Š” ์†์ƒ ๋“ฑ๊ธ‰(DamageGrade), ์˜ˆ์ƒ ์ˆ˜๋ฆฌ๋น„(EstimatedCost), ์šฐ์„ ์ˆœ์œ„(PriorityCode), ์ƒํƒœ(Status)์ž…๋‹ˆ๋‹ค

ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” released API๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ œ์•ฝ์ด ์žˆ์ง€๋งŒ, Determination/Validation ๋ฌธ๋ฒ• ์ž์ฒด๋Š” ์˜จํ”„๋ ˆ๋ฏธ์Šค์™€ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ํ•ต์‹ฌ ๊ฐœ๋… โ€” "์ฑ„์›Œ ๋„ฃ๋Š” ๋กœ์ง"๊ณผ "๋ง‰์•„์„œ๋Š” ๋กœ์ง"

๋น„์œ ๋กœ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ˆ˜๋ฆฌ ์š”์ฒญ์„œ๋ฅผ ์ ‘์ˆ˜ํ•˜๋Š” ์ฐฝ๊ตฌ๋ฅผ ์ƒ์ƒํ•ด ๋ณด์„ธ์š”. ์ฐฝ๊ตฌ์—๋Š” ๋‘ ๋ช…์˜ ์ง์›์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Determination์€ ์„œ๋ฅ˜๋ฅผ ๋Œ€์‹  ์ฑ„์›Œ ์ฃผ๋Š” ์ง์›์ž…๋‹ˆ๋‹ค. ์‹ ์ฒญ์ž๊ฐ€ ์†์ƒ ๋“ฑ๊ธ‰์„ ์ ์œผ๋ฉด ๊ทธ์— ๋งž๋Š” ์šฐ์„ ์ˆœ์œ„ ์นธ์„ ์ž๋™์œผ๋กœ ์ฑ„์›Œ ๋„ฃ์Šต๋‹ˆ๋‹ค. ์„œ๋ฅ˜๋ฅผ ๋ฐ˜๋ คํ•˜๋Š” ๊ถŒํ•œ์€ ์—†์Šต๋‹ˆ๋‹ค.
Validation์€ ์ ‘์ˆ˜ ๋„์žฅ์„ ์ฐ๊ธฐ ์ง์ „์— ์„œ๋ฅ˜๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ์ง์›์ž…๋‹ˆ๋‹ค. ์˜ˆ์ƒ ์ˆ˜๋ฆฌ๋น„๊ฐ€ ์˜ˆ์‚ฐ ํ•œ๋„๋ฅผ ๋„˜์œผ๋ฉด ์ ‘์ˆ˜๋ฅผ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ์„œ๋ฅ˜ ๋‚ด์šฉ์„ ๊ณ ์น  ๊ถŒํ•œ์€ ์—†์Šต๋‹ˆ๋‹ค.

์ด ๋น„์œ ๊ฐ€ ๋‘ ๊ฐœ๋…์˜ ํ•ต์‹ฌ ๋น„๋Œ€์นญ์„ ๊ทธ๋Œ€๋กœ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Determination์€ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ƒยท๋ณด์ •ํ•˜๋Š” ๋กœ์ง์ด๊ณ , Validation์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ฆํ•˜๊ณ  ์ €์žฅ์„ ๊ฑฐ๋ถ€ํ•˜๋Š” ๋กœ์ง์ž…๋‹ˆ๋‹ค. ์ด์ œ ๋น„๊ต ์ถ•์„ ํ‘œ๋กœ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋น„๊ต ์ถ•DeterminationValidation
๋ชฉ์ ํ•„๋“œ ๊ฐ’ ์ž๋™ ๊ณ„์‚ฐยทํŒŒ์ƒยท์ดˆ๊ธฐํ™”์ผ๊ด€์„ฑ ๊ฒ€์ฆ, ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ์˜ ์ €์žฅ ์ฐจ๋‹จ
๋ฐœ๋™ ์‹œ์ on modify ๋˜๋Š” on save ์„ ํƒ ๊ฐ€๋Šฅon save๋งŒ ๊ฐ€๋Šฅ
๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ๊ฐ€๋Šฅ (EML MODIFY ... IN LOCAL MODE)๋ถˆ๊ฐ€ โ€” ์ฝ๊ธฐ ์ „์šฉ, ๋ณ€๊ฒฝ ์‹œ๋„ ์‹œ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜
์ €์žฅ ๊ฑฐ๋ถ€๋ถˆ๊ฐ€ โ€” ์‹œ๊ทธ๋‹ˆ์ฒ˜์— failed ํŒŒ๋ผ๋ฏธํ„ฐ ์ž์ฒด๊ฐ€ ์—†์Œ๊ฐ€๋Šฅ โ€” failed์— ํ‚ค๋ฅผ ๋„ฃ์œผ๋ฉด ์ €์žฅ ๋กค๋ฐฑ
๋ฉ”์‹œ์ง€ ์ „๋‹ฌreported๋กœ ์•ˆ๋‚ด์„ฑ ๋ฉ”์‹œ์ง€๋งŒ ๊ฐ€๋Šฅreported + failed๋กœ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์™€ ๊ฑฐ๋ถ€๋ฅผ ํ•จ๊ป˜
DB ์ฝ๊ธฐ๊ฐ€๋Šฅ (EML READ, SELECT ๋ชจ๋‘)๊ฐ€๋Šฅ โ€” ์ฝ๊ธฐ๋Š” ์ž์œ , ์“ฐ๊ธฐ๋งŒ ๊ธˆ์ง€
์‹คํ–‰ ์ˆœ์„œon modify๋Š” ๋ณ€๊ฒฝ ์งํ›„, on save๋Š” ์ €์žฅ ์‹œํ€€์Šค์˜ finalize ๋‹จ๊ณ„์ €์žฅ ์‹œํ€€์Šค์˜ check_before_save ๋‹จ๊ณ„ โ€” Determination on save ์ดํ›„
ํŠธ๋ฆฌ๊ฑฐcreate, update, delete, fieldcreate, update, delete, field

๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋‘ ์ค„๋งŒ ๋‹ค์‹œ ๊ฐ•์กฐํ•ฉ๋‹ˆ๋‹ค. ์ฒซ์งธ, ์‹คํ–‰ ์ˆœ์„œ์ž…๋‹ˆ๋‹ค. ์ €์žฅ ๋ฒ„ํŠผ์ด ๋ˆŒ๋ฆฌ๋ฉด RAP ์ €์žฅ ์‹œํ€€์Šค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ finalize(Determination on save ์‹คํ–‰) โ†’ check_before_save(Validation ์‹คํ–‰) โ†’ ๋ฒˆํ˜ธ ์กฐ์ • โ†’ ์‹ค์ œ DB ์ €์žฅ ์ˆœ์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ฆ‰ Validation์€ ํ•ญ์ƒ Determination on save๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋งˆ์ง€๋ง‰์œผ๋กœ ์†๋ณธ ๋’ค์— ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ "Determination์ด ์ฑ„์šด ๊ฐ’์„ Validation์ด ๊ฒ€์ฆํ•œ๋‹ค"๋Š” ์„ค๊ณ„๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์„ฑ๋ฆฝํ•ฉ๋‹ˆ๋‹ค. ๋‘˜์งธ, ๊ถŒํ•œ์˜ ๋น„๋Œ€์นญ์ž…๋‹ˆ๋‹ค. Determination์€ ๊ณ ์น  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ง‰์„ ์ˆ˜ ์—†๊ณ , Validation์€ ๋ง‰์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ณ ์น  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด ๋น„๋Œ€์นญ์„ ๊ธฐ์–ตํ•˜๋ฉด "์–ธ์ œ ๋ฌด์—‡์„ ์“ฐ๋Š”๊ฐ€"์— ๋Œ€ํ•œ ๋‹ต์˜ 8ํ• ์ด ๋‚˜์˜ต๋‹ˆ๋‹ค.

ํŒ๋‹จ ๊ธฐ์ค€์„ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์š”์•ฝํ•˜๋ฉด ์ด๋ ‡์Šต๋‹ˆ๋‹ค. "๊ฒฐ๊ณผ์ ์œผ๋กœ ํ•„๋“œ์— ๊ฐ’์ด ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋ฉด Determination, ๊ฒฐ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ค๋ฅ˜๊ฐ€ ๋ณด์—ฌ์•ผ ํ•˜๋ฉด Validation."

๐Ÿ’ป ์‹ค์ „ ์˜ˆ์ œ 3๋‹จ๊ณ„ โ€” ์ฐจ์ด๊ฐ€ ๋“œ๋Ÿฌ๋‚˜๋Š” ์ตœ์†Œ ์ฝ”๋“œ

1๋‹จ๊ณ„: Behavior Definition์—์„œ ๋‘ ๊ฐœ๋… ์„ ์–ธํ•˜๊ธฐ

์„ค๋น„ ์ˆ˜๋ฆฌ ์š”์ฒญ ์‹œ๋‚˜๋ฆฌ์˜ค์˜ Behavior Definition์ž…๋‹ˆ๋‹ค. ์†์ƒ ๋“ฑ๊ธ‰์ด ๋ฐ”๋€Œ๋ฉด ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ž๋™ ์‚ฐ์ถœํ•˜๊ณ (Determination), ์ €์žฅ ์‹œ์ ์— ์˜ˆ์ƒ ์ˆ˜๋ฆฌ๋น„์˜ ์˜ˆ์‚ฐ ํ•œ๋„๋ฅผ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค(Validation).

managed implementation in class zbp_fcm_repreq unique;
strict ( 2 );

define behavior for ZR_FCM_RepReq alias RepairRequest
persistent table zfcm_repreq
lock master
authorization master ( instance )
etag master LastChangedAt
{
  create;
  update;
  delete;

  // ์†์ƒ ๋“ฑ๊ธ‰์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐ
  determination setPriority on modify { field DamageGrade; }

  // ์ €์žฅ ์ง์ „, ์ƒ์„ฑ ์‹œ์™€ ์ˆ˜๋ฆฌ๋น„ ๋ณ€๊ฒฝ ์‹œ ์˜ˆ์‚ฐ ํ•œ๋„ ๊ฒ€์‚ฌ
  validation checkCostLimit on save { create; field EstimatedCost; }
}

์„ ์–ธ๋งŒ ๋ด๋„ ์ฐจ์ด๊ฐ€ ๋ณด์ž…๋‹ˆ๋‹ค. Determination์€ on modify๋ฅผ ์„ ํƒํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ์ฆ‰์‹œ ๋ฐ˜์‘ํ•˜๊ฒŒ ํ–ˆ๊ณ , Validation์€ ๋ฌธ๋ฒ•์ƒ on save๋งŒ ํ—ˆ์šฉ๋˜๋ฏ€๋กœ ์ €์žฅ ์ง์ „์—๋งŒ ๊ฐœ์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ค‘๊ด„ํ˜ธ ์•ˆ์˜ ํŠธ๋ฆฌ๊ฑฐ(create, field ...)๋Š” "์–ธ์ œ ์ด ๋กœ์ง์„ ๊นจ์šธ ๊ฒƒ์ธ๊ฐ€"๋ฅผ ์ •์˜ํ•˜๋Š” ๋ถ€๋ถ„์œผ๋กœ, ๋‘ ๊ฐœ๋…์ด ๋™์ผํ•œ ๋ฌธ๋ฒ•์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

2๋‹จ๊ณ„: ๊ตฌํ˜„์—์„œ ๋“œ๋Ÿฌ๋‚˜๋Š” ์‹œ๊ทธ๋‹ˆ์ฒ˜์˜ ๋น„๋Œ€์นญ โ€” ๋ฉ”์‹œ์ง€์™€ ๋กœ๊น…

Behavior Implementation ํด๋ž˜์Šค์˜ ๋กœ์ปฌ ํ•ธ๋“ค๋Ÿฌ์ž…๋‹ˆ๋‹ค. ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๋‚˜๋ž€ํžˆ ๋†“๊ณ  ๋ณด๋ฉด ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋‘ ๊ฐœ๋…์— ๋ถ€์—ฌํ•œ ๊ถŒํ•œ ์ฐจ์ด๊ฐ€ ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค.

CLASS lhc_repairrequest DEFINITION INHERITING FROM cl_abap_behavior_handler.
  PRIVATE SECTION.
    " Determination: failed ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์•„์˜ˆ ์—†๋‹ค โ†’ ์ €์žฅ ๊ฑฐ๋ถ€ ๋ถˆ๊ฐ€
    METHODS setpriority FOR DETERMINE ON MODIFY
      IMPORTING keys FOR repairrequest~setpriority.

    " Validation: failed/reported๊ฐ€ ์ž๋™ ํฌํ•จ๋œ๋‹ค โ†’ ๊ฑฐ๋ถ€ + ๋ฉ”์‹œ์ง€ ๊ฐ€๋Šฅ
    METHODS checkcostlimit FOR VALIDATE ON SAVE
      IMPORTING keys FOR repairrequest~checkcostlimit.
ENDCLASS.

CLASS lhc_repairrequest IMPLEMENTATION.

  METHOD setpriority.
    " ํŠธ๋ฆฌ๊ฑฐ๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฝ๊ณ 
    READ ENTITIES OF zr_fcm_repreq IN LOCAL MODE
      ENTITY repairrequest
        FIELDS ( damagegrade ) WITH CORRESPONDING #( keys )
      RESULT DATA(lt_req).

    " ํŒŒ์ƒ ๊ฐ’์„ ๊ณ„์‚ฐํ•ด ๋‹ค์‹œ ์จ ๋„ฃ๋Š”๋‹ค (Determination๋งŒ ๊ฐ€๋Šฅํ•œ ๋™์ž‘)
    MODIFY ENTITIES OF zr_fcm_repreq IN LOCAL MODE
      ENTITY repairrequest
        UPDATE FIELDS ( prioritycode )
        WITH VALUE #( FOR ls_req IN lt_req
                      ( %tky         = ls_req-%tky
                        prioritycode = COND #( WHEN ls_req-damagegrade >= 4
                                               THEN 'URGENT'
                                               ELSE 'NORMAL' ) ) ).
  ENDMETHOD.

  METHOD checkcostlimit.
    CONSTANTS lc_limit TYPE p LENGTH 10 DECIMALS 2 VALUE '5000000.00'.

    READ ENTITIES OF zr_fcm_repreq IN LOCAL MODE
      ENTITY repairrequest
        FIELDS ( estimatedcost ) WITH CORRESPONDING #( keys )
      RESULT DATA(lt_req).

    LOOP AT lt_req INTO DATA(ls_req) WHERE estimatedcost > lc_limit.
      " ์ €์žฅ ๊ฑฐ๋ถ€: failed์— ํ‚ค ์ถ”๊ฐ€ (Validation๋งŒ ๊ฐ€๋Šฅํ•œ ๋™์ž‘)
      APPEND VALUE #( %tky = ls_req-%tky ) TO failed-repairrequest.

      " ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: ํ•„๋“œ ๋‹จ์œ„๋กœ ์ง€์ •ํ•˜๋ฉด UI์—์„œ ํ•˜์ด๋ผ์ดํŠธ๋จ
      APPEND VALUE #( %tky = ls_req-%tky
                      %msg = new_message_with_text(
                               severity = if_abap_behv_message=>severity-error
                               text     = '์˜ˆ์ƒ ์ˆ˜๋ฆฌ๋น„๊ฐ€ ๊ฒฐ์žฌ ํ•œ๋„๋ฅผ ์ดˆ๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค' )
                      %element-estimatedcost = if_abap_behv=>mk-on
                    ) TO reported-repairrequest.
    ENDLOOP.
  ENDMETHOD.

ENDCLASS.

์ฃผ๋ชฉํ•  ํฌ์ธํŠธ๊ฐ€ ์„ธ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ฒซ์งธ, setpriority์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜์—๋Š” failed๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Determination ์•ˆ์—์„œ ์•„๋ฌด๋ฆฌ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•ด๋„ ์ €์žฅ์„ ๋ง‰์„ ๋ฐฉ๋ฒ•์ด ๋ฌธ๋ฒ• ์ฐจ์›์—์„œ ๋ด‰์ธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘˜์งธ, checkcostlimit๋Š” ๋ฐ์ดํ„ฐ๋ฅผ READ๋งŒ ํ•˜๊ณ  MODIFYํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ €์žฅ ์‹œํ€€์Šค ์ค‘์—๋Š” ์ธ์Šคํ„ด์Šค ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์•„, Validation์—์„œ MODIFY๋ฅผ ์‹œ๋„ํ•˜๋ฉด ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ์…‹์งธ, ๋‘ ๋ฉ”์„œ๋“œ ๋ชจ๋‘ IN LOCAL MODE๋กœ ์ž๊ธฐ BO์— ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ๋กœ์ง์ด ๊ถŒํ•œยท๊ธฐ๋Šฅ ์ œ์–ด๋ฅผ ๋‹ค์‹œ ํ†ต๊ณผํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋ฉฐ, ์‹ค๋ฌด์—์„œ๋Š” ์ด ์ง€์ ์„ ๋กœ๊น… ํฌ์ธํŠธ๋กœ ํ™œ์šฉํ•ด Application Log(BALI ๊ณ„์—ด API)์— ๊ณ„์‚ฐ ๊ทผ๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ ์‚ฌ์œ ๋ฅผ ๋‚จ๊ธฐ๋Š” ํŒจํ„ด์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

3๋‹จ๊ณ„: ํ”„๋กœ๋•์…˜ ๊ด€์  โ€” ๋Œ€๋Ÿ‰ ์ฒ˜๋ฆฌ, ์ˆœ์„œ ์˜์กด, ํ…Œ์ŠคํŠธ

๋‘ ๊ฐœ๋…์˜ ์ฐจ์ด๋Š” ํ”„๋กœ๋•์…˜ ์„ค๊ณ„์—์„œ ๋” ํฌ๊ฒŒ ๋ฒŒ์–ด์ง‘๋‹ˆ๋‹ค.

๋Œ€๋Ÿ‰ ์ฒ˜๋ฆฌ(mass-enabled) ์ž‘์„ฑ. Determination๊ณผ Validation ๋ชจ๋‘ keys๊ฐ€ ํ…Œ์ด๋ธ”๋กœ ๋“ค์–ด์˜ต๋‹ˆ๋‹ค. API๋‚˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์œผ๋กœ ์ˆ˜๋ฐฑ ๊ฑด์ด ํ•œ ๋ฒˆ์— ๋“ค์–ด์™€๋„ ๋ฉ”์„œ๋“œ๋Š” ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋ฏ€๋กœ, ์œ„ ์˜ˆ์ œ์ฒ˜๋Ÿผ READ ํ•œ ๋ฒˆ โ†’ ๋‚ด๋ถ€ LOOP ๊ตฌ์กฐ๋ฅผ ์ง€์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค. LOOP ์•ˆ์—์„œ ๊ฑด๋ณ„ SELECT๋ฅผ ํ•˜๋Š” ์ˆœ๊ฐ„ ์„ฑ๋Šฅ์ด ๋ฌด๋„ˆ์ง‘๋‹ˆ๋‹ค. ํŠนํžˆ Determination on modify๋Š” ์‚ฌ์šฉ์ž์˜ ํ•„๋“œ ๋ณ€๊ฒฝ๋งˆ๋‹ค ๋ผ์šด๋“œํŠธ๋ฆฝ์ด ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ๋ฌด๊ฑฐ์šด ์กฐํšŒ๋Š” on save๋กœ ๋ฏธ๋ฃจ๋Š” ํŒ๋‹จ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ˆœ์„œ๋ฅผ ์ด์šฉํ•œ ์„ค๊ณ„. Determination on save๊ฐ€ Validation๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋œ๋‹ค๋Š” ์ˆœ์„œ๋ฅผ ํ™œ์šฉํ•˜๋ฉด, "Determination์ด ApproverGroup์„ ์‚ฐ์ถœ โ†’ Validation์ด ์‚ฐ์ถœ๋œ ๊ฒฐ์žฌ ๊ทธ๋ฃน์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์ฆ"์ฒ˜๋Ÿผ ํŒŒ์ƒ๊ณผ ๊ฒ€์ฆ์„ ์•ˆ์ „ํ•˜๊ฒŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ Validation์ด ๋จผ์ € ์‹คํ–‰๋œ๋‹ค๊ณ  ์ฐฉ๊ฐํ•˜๊ณ  ์„ค๊ณ„ํ•˜๋ฉด ๊ฒ€์ฆ์ด ํ•ญ์ƒ ์˜› ๊ฐ’์„ ๋ณด๋Š” ๋ฒ„๊ทธ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ. ๋‘ ๋กœ์ง ๋ชจ๋‘ cl_abap_behavior_test_environment ๊ธฐ๋ฐ˜์˜ ABAP Unit์œผ๋กœ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Determination์€ "MODIFY ํ›„ READํ–ˆ์„ ๋•Œ ํŒŒ์ƒ ํ•„๋“œ ๊ฐ’์ด ๊ธฐ๋Œ€์™€ ๊ฐ™์€๊ฐ€", Validation์€ "COMMIT ENTITIES๊ฐ€ ์‹คํŒจํ•˜๊ณ  reported์— ๋ฉ”์‹œ์ง€๊ฐ€ ์Œ“์˜€๋Š”๊ฐ€"๋กœ ๋‹จ์–ธ ํฌ์ธํŠธ ์ž์ฒด๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋ณด์•ˆ ๊ด€์ ์—์„œ ํ•œ ๊ฐ€์ง€ ๋ง๋ถ™์ด๋ฉด, ์ธ์Šคํ„ด์Šค ๊ถŒํ•œ ํ†ต์ œ๋Š” Validation์ด ์•„๋‹ˆ๋ผ authorization master (instance)์™€ ๊ถŒํ•œ ํ•ธ๋“ค๋Ÿฌ์˜ ๋ชซ์ž…๋‹ˆ๋‹ค. Validation์œผ๋กœ ๊ถŒํ•œ ๊ฒ€์‚ฌ๋ฅผ ํ‰๋‚ด ๋‚ด๋Š” ๊ฒƒ์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

โš ๏ธ ํ”ํ•œ ์‹ค์ˆ˜์™€ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… FAQ

Q1. Validation ์•ˆ์—์„œ ์ž˜๋ชป๋œ ๊ฐ’์„ ๋ฐœ๊ฒฌํ–ˆ์œผ๋‹ˆ ๊ทธ ์ž๋ฆฌ์—์„œ ๊ณ ์ณ ์ฃผ๊ณ  ์‹ถ์€๋ฐ์š”?
์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ €์žฅ ์‹œํ€€์Šค์˜ ๊ฒ€์ฆ ๋‹จ๊ณ„์—์„œ๋Š” ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ๊ธˆ์ง€๋˜์–ด ์žˆ์–ด EML MODIFY๊ฐ€ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ต๋‹ˆ๋‹ค. "๊ณ ์ณ ์ฃผ๋Š” ๊ฒŒ ๋งž๋Š” ๋กœ์ง"์ด๋ผ๋ฉด ๊ทธ ์ž์ฒด๊ฐ€ Validation์ด ์•„๋‹ˆ๋ผ Determination์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค. ๊ฐ’ ๋ณด์ •์€ Determination์œผ๋กœ ์˜ฎ๊ธฐ๊ณ , Validation์€ ๋ณด์ • ํ›„์—๋„ ๋‚จ๋Š” ์œ„๋ฐ˜๋งŒ ๊ฑฐ๋ถ€ํ•˜๋„๋ก ์—ญํ• ์„ ๋‚˜๋ˆ„์„ธ์š”.

Q2. Determination์—์„œ ์กฐ๊ฑด์ด ์•ˆ ๋งž์œผ๋ฉด ์ €์žฅ์„ ๋ง‰๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Determination ์‹œ๊ทธ๋‹ˆ์ฒ˜์—๋Š” failed๊ฐ€ ์—†์–ด์„œ ๋ฌด์—‡์„ ํ•ด๋„ ์ €์žฅ์€ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. reported์— ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋„ฃ์–ด๋„ ์ €์žฅ ์ž์ฒด๋Š” ์„ฑ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž์—๊ฒŒ ํ˜ผ๋ž€๋งŒ ์ค๋‹ˆ๋‹ค. ์ €์žฅ ์ฐจ๋‹จ์ด ๋ชฉ์ ์ด๋ฉด ๊ฐ™์€ ์กฐ๊ฑด์„ Validation์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Q3. Determination on modify๊ฐ€ ์˜ˆ์ƒ๋ณด๋‹ค ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
ํŠธ๋ฆฌ๊ฑฐ ํ•„๋“œ๊ฐ€ ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด ์ •์ƒ ๋™์ž‘์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ž๊ธฐ ์ž์‹ ์ด ๋งŒ๋“  ๋ณ€๊ฒฝ์œผ๋กœ ๋ฌดํ•œ ์žฌํŠธ๋ฆฌ๊ฑฐ๋˜์ง€๋Š” ์•Š์ง€๋งŒ, Determination A๊ฐ€ ๋ฐ”๊พผ ํ•„๋“œ๊ฐ€ Determination B์˜ ํŠธ๋ฆฌ๊ฑฐ์ด๊ณ  B๊ฐ€ ๋‹ค์‹œ A์˜ ํŠธ๋ฆฌ๊ฑฐ ํ•„๋“œ๋ฅผ ๋ฐ”๊พธ๋Š” ์ƒํ˜ธ ์ฐธ์กฐ ๊ตฌ์กฐ๋Š” ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ค์šด ์‹คํ–‰ ํ๋ฆ„์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ฐ Determination์„ ๋ช‡ ๋ฒˆ ์‹คํ–‰๋ผ๋„ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™์€ ๋ฉฑ๋“ฑ(idempotent) ๋กœ์ง์œผ๋กœ ์ž‘์„ฑํ•˜๊ณ , ํŠธ๋ฆฌ๊ฑฐ ํ•„๋“œ๋ฅผ ์ตœ์†Œํ•œ์œผ๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

Q4. Determination์„ on save๋กœ ์„ ์–ธํ–ˆ๋”๋‹ˆ ํ™”๋ฉด์— ๊ณ„์‚ฐ ๊ฐ’์ด ๋ฐ”๋กœ ์•ˆ ๋ณด์ž…๋‹ˆ๋‹ค.
์˜๋„๋œ ๋™์ž‘์ž…๋‹ˆ๋‹ค. on save๋Š” ์ €์žฅ ์‹œํ€€์Šค์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ ์ €์žฅ ์ „ ํ™”๋ฉด์—๋Š” ๋ฐ˜์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅ ์ค‘์— ํŒŒ์ƒ ๊ฐ’์„ ๋ด์•ผ ํ•œ๋‹ค๋ฉด on modify๋กœ ๋ฐ”๊พธ๊ณ , Fiori Elements UI๋ผ๋ฉด side effect ์• ๋…ธํ…Œ์ด์…˜์œผ๋กœ ํ™”๋ฉด ๊ฐฑ์‹ ์„ ํ•จ๊ป˜ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ํ™”๋ฉด ๋ฐ˜์˜์ด ํ•„์š” ์—†๋Š” ๋ฒˆํ˜ธ ์ฑ„๋ฒˆยท์ง‘๊ณ„์„ฑ ๋กœ์ง์ด๋ผ๋ฉด on save๊ฐ€ ๋ผ์šด๋“œํŠธ๋ฆฝ ๋ถ€๋‹ด์ด ์ ์Šต๋‹ˆ๋‹ค.

๐Ÿš€ ์—ฌ๊ธฐ์„œ ๋” ๋‚˜์•„๊ฐ€๊ธฐ

๋‘ ๊ฐœ๋…์˜ ๊ฒฝ๊ณ„๊ฐ€ ์žกํ˜”๋‹ค๋ฉด ์ž์—ฐ์Šค๋Ÿฌ์šด ๋‹ค์Œ ์ฃผ์ œ๋Š” ์„ธ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ฒซ์งธ, Validation์˜ ์ด๋ฒคํŠธ ์‹œ์  ๋ถ„๋ฆฌ โ€” ๊ฐ™์€ on save๋ผ๋„ ํŠธ๋ฆฌ๊ฑฐ ๊ตฌ์„ฑ์— ๋”ฐ๋ผ ๋™์ž‘์ด ๋‹ฌ๋ผ์ง€๋Š” ์„ธ๋ถ€๋ฅผ ํŒŒ๊ณ ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด ๋ธ”๋กœ๊ทธ์˜ Validation ์‹ฌํ™” ๊ธ€ ์ฐธ๊ณ ). ๋‘˜์งธ, Action๊ณผ Feature Control โ€” ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ๋กœ์ง๊ณผ ๋ฒ„ํŠผ ํ™œ์„ฑํ™” ์ œ์–ด๋Š” Determination/Validation๊ณผ ๋˜ ๋‹ค๋ฅธ ์ถ•์ž…๋‹ˆ๋‹ค. ์…‹์งธ, Draft ํ™œ์„ฑํ™” ์‹œ์˜ ๋™์ž‘ ๋ณ€ํ™” โ€” Draft BO์—์„œ๋Š” Determination/Validation์ด draft ์ธ์Šคํ„ด์Šค์—๋„ ์ ์šฉ๋˜๋ฏ€๋กœ prepare ๋‹จ๊ณ„์™€์˜ ๊ด€๊ณ„๋ฅผ ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ unmanaged/managed with additional save ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ €์žฅ ์‹œํ€€์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ํ™•์žฅ๋˜๋Š”์ง€๋„ ์ข‹์€ ํ›„์† ์ฃผ์ œ์ž…๋‹ˆ๋‹ค.

๐Ÿ“š ๋” ์ฝ์–ด๋ณผ ์ž๋ฃŒ

๋Œ“๊ธ€ 0

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.