RAP에서 엔티티 번호를 어떻게 부여할 것인가
SAP RAP에서 엔티티 키(Primary Key)를 생성하는 방법은 두 가지입니다. 사용자가 직접 입력하는 External Numbering과, 시스템이 자동으로 생성하는 Internal Numbering입니다. 어떤 방식을 선택하느냐가 UX, 보안, 데이터 무결성에 영향을 줍니다.
External Numbering: 사용자가 직접 입력
-- Behavior Definition: External Numbering
managed implementation in class zbp_project unique;
define behavior for ZC_Project alias Project {
-- external numbering: 키 필드를 사용자가 입력
-- create 시 project_id를 반드시 입력해야 함
create;
update;
delete;
field ( mandatory ) project_id; -- 필수 입력
field ( readonly : update ) project_id; -- 생성 후 수정 불가
}
-- 사용자가 입력한 키 값 검증 (Validation)
CLASS zbp_project IMPLEMENTATION.
METHOD validateprojectid.
LOOP AT keys ASSIGNING FIELD-SYMBOL().
READ ENTITIES OF ZC_Project IN LOCAL MODE
ENTITY Project FIELDS ( project_id ) WITH CORRESPONDING #( keys )
RESULT DATA(lt_projects).
LOOP AT lt_projects ASSIGNING FIELD-SYMBOL().
" 프로젝트 ID 형식 검증 (PRJ- 로 시작해야 함)
IF NOT -project_id CP 'PRJ-*'.
APPEND VALUE #(
%tky = -%tky
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-error
text = 'Project ID는 PRJ- 로 시작해야 합니다'
)
) TO reported-project.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDMETHOD.
ENDCLASS.
Internal Numbering: 시스템이 자동 생성
-- Behavior Definition: Internal Numbering
managed with additional save
implementation in class zbp_sales_order unique;
define behavior for ZR_SalesOrder alias SalesOrder {
-- internal numbering: 시스템이 자동으로 키 생성
-- create 시 order_id를 입력하지 않아도 됨
create;
update;
delete;
field ( numbering : managed, readonly ) order_id;
-- numbering : managed = 시스템이 번호 부여
-- 번호 채번 Determination
determination setOrderId on save { create; }
}
-- Internal Numbering 구현 (번호 채번 로직)
CLASS zbp_sales_order IMPLEMENTATION.
METHOD setorderid.
LOOP AT keys ASSIGNING FIELD-SYMBOL().
READ ENTITIES OF ZR_SalesOrder IN LOCAL MODE
ENTITY SalesOrder FIELDS ( order_id ) WITH CORRESPONDING #( keys )
RESULT DATA(lt_orders).
LOOP AT lt_orders ASSIGNING FIELD-SYMBOL().
IF -order_id IS INITIAL.
" 번호 채번 (Number Range 활용)
DATA lv_number TYPE string.
CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
nr_range_nr = '01'
object = 'Z_SO_NR'
IMPORTING
number = lv_number.
DATA(lv_new_id) = 'SO-' && lv_number.
MODIFY ENTITIES OF ZR_SalesOrder IN LOCAL MODE
ENTITY SalesOrder
UPDATE FIELDS ( order_id )
WITH VALUE #( ( %tky = -%tky
order_id = lv_new_id ) ).
ENDIF.
ENDLOOP.
ENDLOOP.
ENDMETHOD.
ENDCLASS.
UUID를 키로 사용하는 방법
-- UUID 기반 Internal Numbering (가장 단순)
-- CDS 정의
define root view entity ZR_Task
as select from zbtp_task
{
key task_uuid : sysuuid_x16; -- UUID 타입 키
...
}
-- Behavior Definition
managed implementation in class zbp_task unique;
define behavior for ZR_Task alias Task {
create;
update;
delete;
-- UUID: 시스템이 자동 생성, 추가 구현 불필요
field ( numbering : managed, readonly ) task_uuid;
}
-- UUID는 별도 Number Range 불필요 -- cl_system_uuid=>create_uuid_x16_static()으로 자동 생성 -- GUID 방식 — 글로벌 유일성 보장 -- 단, URL에 노출 시 긴 GUID가 불편할 수 있음
선택 기준
- External: 의미 있는 코드가 필요한 경우 (마스터 데이터, 프로젝트 코드)
- Internal (Number Range): 순번이 의미 있는 경우 (주문번호 SO-00001)
- UUID: 단순성이 중요하고 순번이 불필요한 경우 (내부 트랜잭션)
- External은 중복 방지 검증 로직이 반드시 필요
공식 문서
RAP Numbering 가이드는 SAP RAP Numbering 공식 문서에서 확인하세요.
댓글 0
아직 댓글이 없습니다.