ABAP

RAP Bound vs Unbound Action 차이 3가지 #shorts #SAP #ABAP

RAP에서 Action이란 무엇인가

SAP RAP(RESTful Application Programming Model)에서 Action은 OData 서비스로 노출되는 비즈니스 로직 오퍼레이션입니다. 단순한 CRUD(Create, Read, Update, Delete)로 표현할 수 없는 비즈니스 동작을 Action으로 정의합니다. Action에는 두 종류가 있습니다. Bound Action은 특정 엔티티 인스턴스에 종속되고, Unbound Action은 엔티티와 독립적으로 실행됩니다.

Bound Action: 특정 인스턴스에 종속

-- Behavior Definition (BDef)
managed implementation in class zbp_sales_order unique;

define behavior for ZC_SalesOrder alias SalesOrder {
  use etag;

  -- Bound Action: 특정 주문 인스턴스에 대한 확정
  action confirmOrder result [1] $self;

  -- Bound Action: 주문 취소 (이유 필요)
  action cancelOrder parameter ZD_CancelOrderParam
                     result [1] $self;
}
-- OData 호출 형태 (Bound Action)
-- POST /SalesOrders('SO-001')/ZC_SalesOrder.confirmOrder
-- 특정 주문 'SO-001'에 대해 confirmOrder 실행

-- POST /SalesOrders('SO-001')/ZC_SalesOrder.cancelOrder
-- Body: { "CancelReason": "고객 요청" }

Bound Action은 인스턴스 키를 URL에 포함합니다. 특정 엔티티 하나의 상태를 변경하는 동작에 적합합니다.

Bound Action 구현

" ABAP 구현 클래스
CLASS zbp_sales_order DEFINITION.
  PUBLIC SECTION.
    METHODS confirmorder FOR MODIFY
      IMPORTING keys FOR ACTION SalesOrder~confirmOrder.
    METHODS cancelorder FOR MODIFY
      IMPORTING keys FOR ACTION SalesOrder~cancelOrder.
ENDCLASS.

CLASS zbp_sales_order IMPLEMENTATION.
  METHOD confirmorder.
    " keys: 대상 주문 키 목록 (배치 처리 가능)
    LOOP AT keys ASSIGNING FIELD-SYMBOL().
      " 주문 상태 변경
      MODIFY ENTITIES OF ZC_SalesOrder IN LOCAL MODE
        ENTITY SalesOrder
          UPDATE FIELDS ( status confirmed_at )
          WITH VALUE #( ( %tky          = -%tky
                          status        = 'CONFIRMED'
                          confirmed_at  = cl_abap_context_info=>get_system_date( ) ) ).
    ENDLOOP.
  ENDMETHOD.
ENDCLASS.

Unbound Action: 엔티티 독립적 실행

-- Behavior Definition (Unbound Action)
define behavior for ZC_SalesOrder alias SalesOrder {

  -- Unbound Action: 특정 기간 주문 일괄 마감
  static action closePeriodOrders parameter ZD_ClosePeriodParam
                                   result [0..*] $self;
}
-- OData 호출 형태 (Unbound Action)
-- POST /SalesOrders/ZC_SalesOrder.closePeriodOrders
-- Body: { "PeriodYear": "2026", "PeriodMonth": "04" }
-- 특정 인스턴스가 아닌 서비스 레벨에서 호출

Unbound Action 구현

" Unbound Action 구현
METHOD closeperiodorders.
  " 파라미터 읽기
  DATA(lv_year)  = keys[ 1 ]-%param-period_year.
  DATA(lv_month) = keys[ 1 ]-%param-period_month.

  " 해당 기간 모든 주문 조회
  SELECT order_id FROM zbtp_sales_order
    WHERE YEAR( created_at )  = @lv_year
      AND MONTH( created_at ) = @lv_month
      AND status = 'OPEN'
    INTO TABLE @DATA(lt_orders).

  " 일괄 마감 처리
  LOOP AT lt_orders ASSIGNING FIELD-SYMBOL().
    MODIFY ENTITIES OF ZC_SalesOrder IN LOCAL MODE
      ENTITY SalesOrder
        UPDATE FIELDS ( status closed_at )
        WITH VALUE #( ( order_id  = -order_id
                        status    = 'CLOSED'
                        closed_at = cl_abap_context_info=>get_system_date( ) ) ).
  ENDLOOP.
ENDMETHOD.

차이 3가지 요약

  • 차이 1 (URL 패턴): Bound는 인스턴스 키 포함 /Entity('key')/Action, Unbound는 컬렉션 레벨 /Entities/Action
  • 차이 2 (대상): Bound는 단일 또는 다수의 특정 인스턴스, Unbound는 인스턴스와 무관한 비즈니스 로직
  • 차이 3 (선언): Bound는 BDef의 entity 블록 안에, Unbound는 static action으로 선언

공식 문서

RAP Action 전체 가이드는 SAP RAP Actions 공식 문서에서 확인하세요.

댓글 0

아직 댓글이 없습니다.