RAP Action과 Function의 핵심 차이
SAP RAP에서 Action과 Function은 비즈니스 로직을 OData 서비스로 노출하는 두 가지 방식입니다. 이 둘을 구분하지 못하면 OData V4 표준을 위반하거나, 클라이언트가 예상치 못한 캐싱 동작을 경험할 수 있습니다.
핵심 원칙: OData 표준에서의 정의
-- OData V4 표준 정의:
-- Action: 부작용(Side Effect)이 있는 오퍼레이션 → HTTP POST
-- Function: 부작용이 없는 오퍼레이션 → HTTP GET
-- 잘못된 사용 예:
-- Function으로 데이터를 변경하면 → GET 요청으로 변경 = OData 표준 위반
-- Action으로 단순 조회 → POST 요청으로 조회 = 불필요한 오버헤드 + 캐싱 불가
Action 선언과 구현
-- BDef에서 Action 선언
define behavior for ZC_Shipment alias Shipment {
-- 배송 출발 처리: 상태 변경 (Side Effect 있음)
action dispatchShipment
parameter ZD_DispatchParam
result [1] $self;
-- 배송 취소: 상태 변경 + 재고 복원 (Side Effect 있음)
action cancelShipment
parameter ZD_CancelShipmentParam
result [1] $self;
}
-- Action 구현 (FOR MODIFY)
CLASS zbp_shipment DEFINITION.
PUBLIC SECTION.
METHODS dispatchshipment FOR MODIFY
IMPORTING keys FOR ACTION Shipment~dispatchShipment.
ENDCLASS.
CLASS zbp_shipment IMPLEMENTATION.
METHOD dispatchshipment.
LOOP AT keys ASSIGNING FIELD-SYMBOL().
" 파라미터 읽기
DATA(lv_carrier) = -%param-carrier_code.
DATA(lv_tracking) = -%param-tracking_number.
" 배송 상태 변경
MODIFY ENTITIES OF ZC_Shipment IN LOCAL MODE
ENTITY Shipment
UPDATE FIELDS ( status dispatched_at carrier_code tracking_no )
WITH VALUE #( (
%tky = -%tky
status = 'DISPATCHED'
dispatched_at = cl_abap_context_info=>get_system_date( )
carrier_code = lv_carrier
tracking_no = lv_tracking
) ).
ENDLOOP.
ENDMETHOD.
ENDCLASS.
Function 선언과 구현
-- BDef에서 Function 선언
define behavior for ZC_Shipment alias Shipment {
-- 예상 도착일 계산: 조회만 (Side Effect 없음)
function calculateETA(
P_Origin: abap.char(10),
P_Destination: abap.char(10)
) result [1] ZD_ETAResult;
-- 배송 가능 운송사 목록: 조회만
function getAvailableCarriers
result [0..*] ZD_CarrierInfo;
}
-- Function 구현 (FOR READ)
CLASS zbp_shipment DEFINITION.
PUBLIC SECTION.
METHODS calculateeta FOR READ
IMPORTING keys FOR FUNCTION Shipment~calculateETA
RESULT result.
ENDCLASS.
CLASS zbp_shipment IMPLEMENTATION.
METHOD calculateeta.
LOOP AT keys ASSIGNING FIELD-SYMBOL().
DATA(lv_origin) = -%param-p_origin.
DATA(lv_dest) = -%param-p_destination.
" 도착 예정일 계산 (읽기 전용 로직)
DATA(lv_distance) = get_distance( lv_origin, lv_dest ).
DATA(lv_eta_days) = CAST i( lv_distance / 500 ). " 하루 500km 가정
DATA(lv_eta_date) = cl_abap_context_info=>get_system_date( ) + lv_eta_days.
APPEND VALUE #(
%tky = -%tky
%param = VALUE ZD_ETAResult(
estimated_arrival = lv_eta_date
transport_days = lv_eta_days
distance_km = lv_distance
)
) TO result.
ENDLOOP.
ENDMETHOD.
ENDCLASS.
Unbound Function vs Bound Function
-- Bound Function: 특정 인스턴스에 대해 실행
function calculateETA(P_Origin: abap.char(10))
result [1] ZD_ETAResult;
-- GET /Shipments('SHP-001')/ZC_Shipment.calculateETA(P_Origin='SEOUL')
-- Static(Unbound) Function: 엔티티 무관하게 실행
static function getShippingZones
result [0..*] ZD_ZoneInfo;
-- GET /ZC_Shipment/getShippingZones()
-- 특정 인스턴스 없이 서비스 레벨에서 호출
요약 비교표
- Action: POST / FOR MODIFY / 데이터 변경 / 트랜잭션 참여
- Function: GET / FOR READ / 읽기 전용 / 트랜잭션 무관
- Bound: 특정 인스턴스 키 필요 (/Entity('key')/Method)
- Static/Unbound: 인스턴스 무관 (/Entities/Method)
공식 문서
RAP Actions와 Functions 상세는 SAP RAP 공식 문서에서 확인하세요.
댓글 0
아직 댓글이 없습니다.