이 글에서 다루는 것
S/4HANA Cloud(Public Edition) 환경에서 ABAP 개발을 시작한 개발자들이 가장 많이 부딪히는 벽은 "이 API가 왜 안 되지?"입니다. On-Premise ABAP에서 자유롭게 쓰던 CL_GUI_FRONTEND_SERVICES, SO_NEW_DOCUMENT_SEND_API1, 심지어 SY-UNAME 같은 시스템 필드조차 ATC(ABAP Test Cocktail) 경고에 걸립니다. 이 글에서는 Cloud ABAP에서 실제로 마주치는 3가지 핵심 제약과 판단 기준, 그리고 Released 대안을 사용한 실전 예제를 다룹니다.
- Released API와 Not-Released API의 판단 기준 이해
- ABAP Cloud Tier가 무엇이고 왜 도입되었는지 파악
- Y/Z Local Object 제약과 Namespace 정책 대응
- ATC를 활용한 사전 검증 워크플로 구축
미리 알고 있어야 할 것
이 글은 ABAP 문법(클래스, 인터페이스, CDS View)을 어느 정도 다뤄본 개발자를 대상으로 합니다. ADT(ABAP Development Tools for Eclipse) 사용 경험, RAP(RESTful Application Programming Model)의 기본 개념, 그리고 On-Premise ABAP과 Cloud ABAP의 차이에 대한 개괄적 이해가 있으면 좋습니다. S/4HANA Cloud Public Edition과 Private Edition의 차이도 미리 확인해두세요.
환경 및 버전 정보
이 글의 예제는 다음 환경 기준으로 검증되었습니다. 릴리스 사이클에 따라 세부 동작이 달라질 수 있으므로 각자 환경의 릴리스 노트를 함께 확인하는 것을 권장합니다.
- SAP S/4HANA Cloud Public Edition: 2025 릴리스 기준
- ABAP Platform: ABAP Cloud (Steampunk on BTP 또는 Embedded Steampunk in S/4HANA Cloud)
- 개발 도구: ADT for Eclipse 2025-03 이상 (Eclipse 2024-12+)
- Language Version:
ABAP for Cloud Development(필수 설정) - ATC 변형(Variant):
ABAP_CLOUD_DEVELOPMENT_DEFAULT
참고로 On-Premise S/4HANA 2023 이상에서도 개발자 확장(Developer Extensibility)을 통해 ABAP Cloud 개발이 가능하며, 이 경우 언어 버전이 동일하게 ABAP for Cloud Development로 설정됩니다. 이 언어 버전을 사용하는 순간부터 아래에서 다룰 3가지 제약이 모두 적용됩니다.
핵심 개념: ABAP Cloud Tier와 3계층 확장 모델
ABAP Cloud를 이해하는 핵심은 SAP가 밀고 있는 3-Tier Extensibility Model입니다. 아파트에 비유하자면, On-Premise ABAP은 개인 소유 단독주택이라 벽을 부수든 지붕을 뜯든 자유였다면, S/4HANA Cloud는 관리사무소가 있는 아파트입니다. 관리사무소(SAP)가 정해준 인테리어 자재(Released API)만 쓸 수 있고, 그렇지 않으면 승강기가 멈추거나(업그레이드 실패) 다음 리모델링(릴리스 업그레이드)에서 원상복구됩니다.
Tier 1 — Developer Extensibility (Cloud ABAP): S/4HANA 스택 내부에서 Released Object만 사용해 커스텀 개발. 업그레이드 안정성 최우선.
Tier 2 — Side-by-Side Extensibility (BTP ABAP Environment): SAP BTP에 독립된 ABAP 시스템(Steampunk)을 두고 Communication Scenario로 S/4HANA와 연동.
Tier 3 — Classic Extensibility: 기존 SAP GUI 기반 커스텀. Private Edition에서만 제한적으로 허용되며 Public Edition에선 원칙적으로 봉인.
여기서 개발자가 실제로 부딪히는 3가지 벽은 다음과 같습니다.
- Released API 판정 기준: 내가 쓰려는 클래스/함수가 Cloud에서 허용되는지 어떻게 알 수 있는가
- Classic ABAP 자산 사용 불가:
SELECT * FROM VBAK도 안 되는 이유 - Local Object / Namespace 제약:
$TMP사용 제한, Y/Z Prefix 정책
실전 예제 1단계 — Released API 확인과 기본 대체
가장 흔한 실수는 On-Premise에서 쓰던 SY-UNAME이나 SY-DATUM을 그대로 옮기는 것입니다. Cloud ABAP에서는 이런 시스템 필드 대신 CL_ABAP_CONTEXT_INFO라는 Released 클래스를 사용해야 합니다. 아래는 판매 주문 승인 로그를 남기는 간단한 예제입니다.
CLASS zcl_so_approval_logger DEFINITION
PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS log_approval
IMPORTING iv_sales_order_id TYPE string
RETURNING VALUE(rv_log) TYPE string.
ENDCLASS.
CLASS zcl_so_approval_logger IMPLEMENTATION.
METHOD log_approval.
DATA(lv_user) = cl_abap_context_info=>get_user_technical_name( ).
DATA(lv_stamp) = cl_abap_context_info=>get_system_date( ).
DATA(lv_time) = cl_abap_context_info=>get_system_time( ).
rv_log = |SO { iv_sales_order_id } approved by { lv_user } | &&
|at { lv_stamp } { lv_time }|.
ENDMETHOD.
ENDCLASS.
Released 여부를 확인하는 방법은 3가지입니다.
- ADT의 API State: 클래스 우클릭 → Properties → API State가
Released로 표시되는지 확인 - ABAP Doc 헤더: 클래스 정의 상단에
"! @scope SAP_API표시 확인 - Repository View: ADT의 "Released Objects" 노드에서 카테고리별 탐색
실전 예제 2단계 — 이메일 발송 시나리오와 ATC 검증
실무에서 자주 필요한 이메일 발송을 예로 들어보겠습니다. On-Premise에서는 CL_BCS 계열 클래스를 썼지만, Cloud에서는 CL_BCS_MAIL_MESSAGE(Released)를 사용하는 것이 권장됩니다. 오류 처리와 로깅을 함께 포함한 실무 예제입니다.
CLASS zcl_purchase_notify DEFINITION
PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS send_po_alert
IMPORTING iv_po_number TYPE string
iv_recipient TYPE string
iv_amount TYPE p LENGTH 15 DECIMALS 2
RAISING cx_bcs_mail.
ENDCLASS.
CLASS zcl_purchase_notify IMPLEMENTATION.
METHOD send_po_alert.
TRY.
DATA(lo_mail) = cl_bcs_mail_message=>create_instance( ).
lo_mail->set_subject(
iv_subject = |PO { iv_po_number } 승인 요청 (금액 { iv_amount })|
).
lo_mail->set_main(
io_body = cl_bcs_mail_bodypart=>create_instance(
iv_content = |구매 오더 { iv_po_number } 의 승인이 필요합니다.|
iv_content_type = 'text/plain'
iv_encoding = 'UTF-8'
)
).
lo_mail->add_recipient(
iv_address = iv_recipient
iv_copy = abap_false
).
lo_mail->send( iv_with_error_screen = abap_false ).
CATCH cx_bcs_mail INTO DATA(lx_err).
DATA(lo_log) = cl_bali_log=>create_with_header(
io_header = cl_bali_header_setter=>create(
iv_object = 'ZPO_NOTIFY'
iv_subobject = 'SEND_MAIL'
iv_external_id = iv_po_number
)
).
lo_log->add_exception( io_exception = lx_err ).
RAISE EXCEPTION lx_err.
ENDTRY.
ENDMETHOD.
ENDCLASS.
이 코드를 저장한 후 ADT에서 Run As → ABAP Test Cockpit With… 를 선택하고 변형에 ABAP_CLOUD_DEVELOPMENT_DEFAULT를 지정하면 Not-Released 오브젝트 참조 여부를 자동으로 검출합니다. 관련 ATC 체크 카테고리는 USAGE_OF_RELEASED_APIS이며 우선순위(Priority) 1로 표시되어 개발 초기부터 차단됩니다.
실전 예제 3단계 — 프로덕션 레벨: 대량 처리와 트랜잭션 안전성
Cloud ABAP에서는 COMMIT WORK 직접 호출이 원칙적으로 지양되며, RAP의 SAVE 단계를 통해 트랜잭션을 관리하는 것이 권장됩니다. 아래는 판매주문 배치 처리를 EML(Entity Manipulation Language)로 구현한 예입니다.
CLASS zcl_so_batch_creator DEFINITION
PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
TYPES: BEGIN OF ty_input,
customer TYPE string,
material TYPE string,
quantity TYPE i,
END OF ty_input,
tt_input TYPE STANDARD TABLE OF ty_input WITH EMPTY KEY.
METHODS create_many
IMPORTING it_input TYPE tt_input
RETURNING VALUE(rv_count) TYPE i.
ENDCLASS.
CLASS zcl_so_batch_creator IMPLEMENTATION.
METHOD create_many.
DATA lt_create TYPE TABLE FOR CREATE zi_sales_order.
LOOP AT it_input INTO DATA(ls_row).
APPEND VALUE #(
%cid = |CID_{ sy-tabix }|
customer = ls_row-customer
material = ls_row-material
quantity = ls_row-quantity
) TO lt_create.
ENDLOOP.
MODIFY ENTITIES OF zi_sales_order
ENTITY sales_order
CREATE FROM lt_create
FAILED DATA(lt_failed)
REPORTED DATA(lt_reported)
MAPPED DATA(lt_mapped).
IF lt_failed IS INITIAL.
COMMIT ENTITIES RESPONSES
FAILED DATA(lt_commit_failed)
REPORTED DATA(lt_commit_reported).
rv_count = lines( lt_mapped-sales_order ).
ELSE.
ROLLBACK ENTITIES.
rv_count = 0.
ENDIF.
ENDMETHOD.
ENDCLASS.
프로덕션 관점에서 추가로 챙길 부분은 다음과 같습니다.
- Unit Test:
CL_ABAP_UNIT_ASSERT는 Released이므로 그대로 사용 가능. Test Double Framework(CDS_TEST_ENVIRONMENT)로 CDS 테스트 - Authorization:
AUTHORITY-CHECK대신 RAP의 Authorization Control(DEFINE BEHAVIOR내부의authorization절)을 활용 - Number Range:
NUMBER_GET_NEXT함수 모듈은 Not-Released. 대신CL_NUMBERRANGE_RUNTIME(Released)의number_get메서드 사용
자주 마주치는 함정과 FAQ
Q1. VBAK, MARA 같은 표준 테이블에 직접 SELECT를 날리면 왜 에러가 나나요?
표준 DDIC 테이블은 Public API로 릴리스되지 않았기 때문입니다. 대신 SAP가 제공하는 Released CDS View(예: I_SalesOrderTP, I_Product)를 사용해야 합니다. 이는 필드 구조 변경으로부터 커스텀 코드를 보호하는 안전 장치 역할을 합니다.
Q2. $TMP(Local Object)로 저장이 안 됩니다.
Cloud ABAP은 기본적으로 모든 오브젝트가 Transport에 연결되어야 합니다. Sandbox에서 시험용으로 만들 때도 개인 개발 패키지를 만들어 로컬 Transport에 담아야 합니다. Private Edition은 예외적으로 허용되기도 하지만 Public Edition은 엄격합니다.
Q3. 회사 정책상 Y/Z 대신 ZCUST_ 같은 프리픽스를 쓰고 싶은데 왜 막히나요?
S/4HANA Cloud Public Edition에서는 커스텀 오브젝트는 반드시 예약된 네임스페이스(기본 Y/Z 또는 SAP에 등록한 /CUSTOMER/ 형태의 정식 Namespace)에 있어야 합니다. 정식 네임스페이스는 SAP Support Portal에서 신청 후 시스템에 등록해야 사용할 수 있습니다.
Q4. Not-Released지만 꼭 필요한 기능이 있으면?
SAP Influence 포털에서 "Request an API Release"를 등록하는 것이 정식 경로입니다. 임시 대안으로는 BTP ABAP Environment(Tier 2)에서 로직을 구현하고 Communication Arrangement로 연동하는 방법이 있으나, 결국 그쪽도 동일한 Released 정책이 적용됩니다.
이어서 살펴보면 좋은 주제
Released API 판단 기준을 익혔다면 다음은 RAP의 Behavior Definition 심화, Communication Scenario / Communication Arrangement를 통한 외부 시스템 연동, 그리고 Custom Business Object(CBO)와 코드 기반 확장의 트레이드오프 비교를 권장합니다. 또한 ATC를 CI 파이프라인에 통합하는 abapGit + abaplint 조합도 함께 학습하면 팀 개발 품질이 크게 올라갑니다.
더 읽어볼 만한 링크
- SAP Help — Development in ABAP Cloud
- SAP Help — ABAP RESTful Application Programming Model
- SAP Help — Released APIs for ABAP Cloud
- SAP Help — ABAP Test Cockpit User Guide
- SAP Community — ABAP Cloud Topic Page
댓글 0
아직 댓글이 없습니다.