ABAP

RAP Function vs Action, 뭐가 다른가 #shorts #SAP #ABAP

▶ YouTube에서 보기

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

아직 댓글이 없습니다.