[QnA] ABAP Cloud vs Standard ABAP — BTP 개발 시 꼭 알아야 할 차이점 실전 Q&A



ABAP Cloud vs Standard ABAP — BTP 개발 시 꼭 알아야 할 차이점 실전 Q&A
📖 개요 및 학습 목표
SAP BTP ABAP Environment(Steampunk) 또는 S/4HANA Cloud Public Edition에서 개발을 시작한 베테랑 ABAPer가 가장 먼저 마주치는 벽은 "왜 내가 알던 ABAP 문법이 안 먹히지?"입니다. 이 튜토리얼은 현업에서 자주 묻는 5가지 핵심 질문을 Q&A 형식으로 풀어냅니다.
- ABAP Cloud의 Released API 개념과 Standard ABAP과의 근본 차이 이해
- SELECT, CALL FUNCTION, BAdI 등 핵심 구문의 Cloud 호환성 점검
- 온프레미스 코드를 BTP로 마이그레이션할 때 막히는 5대 포인트 파악
- RAP(RESTful Application Programming Model) 권장 이유 학습
- 실전 코드 비교를 통한 즉시 적용 가능한 패턴 습득
📚 선수 지식
- 기본 ABAP OO 문법 (CLASS, METHOD, INTERFACE)
- SAP GUI 또는 ADT(ABAP Development Tools for Eclipse) 사용 경험
- OpenSQL / CDS View 기초 개념
- BTP 계정 및 ABAP Environment 인스턴스 또는 S/4HANA Cloud Trial 접근 권한
🔧 환경 / 버전 / 준비물
- SAP BTP ABAP Environment: 2026 릴리스 기준 (Steampunk)
- S/4HANA Cloud Public Edition: 2402 이상 (Clean Core 원칙 강제 적용)
- ADT (ABAP Development Tools): Eclipse 2024-12 이상 + ADT 플러그인 최신 버전
- 비교 대상: Standard ABAP (S/4HANA On-Premise 2023 또는 ECC 6.0)
- Trial: ABAP Environment Trial Onboarding 튜토리얼로 무료 체험 가능
- 점검 도구: ADT의 ATC(ABAP Test Cockpit) — "ABAP Cloud Development" 체크 변형 활성화
일반적으로 BTP ABAP Environment는 분기마다 업그레이드되므로, 본 튜토리얼의 일부 Released API 목록은 시점에 따라 확장될 수 있습니다.
💡 핵심 개념
ABAP Cloud와 Standard ABAP의 가장 큰 차이는 "공개(Released) 객체만 사용 가능"이라는 단 한 줄로 요약됩니다. 이는 SAP가 추진하는 Clean Core 전략의 핵심입니다.
비유로 이해하기
Standard ABAP을 "내 집 부엌"이라고 한다면, ABAP Cloud는 "공유 주방"입니다. 내 집 부엌에서는 모든 서랍을 열어 칼이든 가스레인지든 마음대로 쓸 수 있지만, 공유 주방에서는 운영자가 "이 도구만 쓰세요"라고 표시한 도구(=Released API)만 사용해야 합니다. 대신 운영자는 그 도구의 안정성과 호환성을 약속(C1/C2/C3 계약)합니다.
3가지 Tier 모델 (도식)
- Tier 1 (Cloud Development): ABAP Cloud — Released API만 사용. Clean Core 100% 준수. 업그레이드 안전.
- Tier 2 (Cloud API Enablement): 미공개 객체를 "공개로 승격" 요청. SAP 승인 필요.
- Tier 3 (Classic Extensibility): 온프레미스 전용. BAdI, Enhancement, 직접 DB 접근 모두 허용. 단, 업그레이드 리스크 본인 부담.
Released 객체란?
SAP가 API 계약(C1: Use System-internally, C2: Use in Cloud Development, C3: Key User Extensibility)으로 안정성을 약속한 객체입니다. ADT에서 객체를 열고 F2를 누르면 "Released for Cloud Development" 표시가 나타납니다. 공식 Released Objects 디렉토리에서 검색도 가능합니다.
💻 실전 Q&A 5가지
❓ Q1. ABAP Cloud에서 SELECT * FROM MARA가 왜 안 되나요?
✅ 이유: MARA는 SAP의 내부 DB 테이블이며, ABAP Cloud는 공개(Released) 인터페이스만 허용합니다. 내부 테이블 구조는 SAP가 언제든 변경할 수 있고, 직접 접근을 허용하면 업그레이드 시 코드가 깨질 위험이 크기 때문입니다.
✅ 해결책: SAP가 제공하는 공개 CDS View(예: I_Material, I_Product)를 사용하세요. ADT에서 객체를 더블클릭한 후 F2를 눌러 "API State" 또는 "Released" 여부를 확인할 수 있습니다.
" ❌ Standard ABAP (On-Premise) - Cloud에서 ATC 에러 발생
SELECT * FROM mara INTO TABLE @DATA(lt_material)
WHERE matnr LIKE 'TEST%'.
" ✅ ABAP Cloud - 공개 CDS View 사용
SELECT Material,
MaterialType,
MaterialGroup,
CreationDate
FROM i_material
INTO TABLE @DATA(lt_material)
WHERE Material LIKE 'TEST%'
AND MaterialIsMarkedForDeletion = @abap_false.
✅ 참고: SAP Note 2570170 또는 help.sap.com Released Objects에서 사용 가능한 객체 목록을 검색하세요.
❓ Q2. CALL FUNCTION 'RFC_READ_TABLE'을 Cloud에서 못 쓰는 이유?
✅ 이유: RFC_READ_TABLE은 임의 테이블 이름을 받아 직접 SELECT하는 만능 FM입니다. 이는 Clean Core 원칙을 정면으로 위반하며, C1/C2 계약이 없는 미공개(Unreleased) Function Module이라 ABAP Cloud 컴파일러가 차단합니다.
✅ 해결책: Released BAPI 또는 OData 서비스, CDS View 기반으로 재설계해야 합니다. 확인 방법은 ADT에서 FM을 열고 F2로 "Release State"를 보거나, ATC 검사를 돌리면 즉시 위반 항목으로 잡힙니다.
" ❌ Cloud 불가 - 미공개 FM
" CALL FUNCTION 'RFC_READ_TABLE' ...
" ✅ Released BAPI 활용 (Material 조회 예시)
DATA ls_selrange TYPE bapie1matselection.
ls_selrange-sign = 'I'.
ls_selrange-option = 'CP'.
ls_selrange-matnr = 'TEST*'.
CALL FUNCTION 'BAPI_MATERIAL_GETLIST'
TABLES
matnrselection = VALUE #( ( ls_selrange ) )
matnrlist = DATA(lt_result).
" ✅ 더 권장: CDS View + OData 노출
" → RAP Service Binding을 통해 외부 호출도 가능
❓ Q3. 온프레미스 코드를 BTP ABAP으로 마이그레이션할 때 가장 많이 막히는 부분은?
✅ 실제 현장에서 자주 발생하는 5대 이슈:
- 미공개 FM/BAPI 사용:
RFC_READ_TABLE, 사내 Z_FM 등이 무방비 호출됨 - DYNPRO/SAPGUI 화면 코드:
MODULE,CALL SCREEN,PARAMETERS등 SAP GUI 의존 구문은 Fiori로 재작성 필요 - 직접 DB 테이블 SELECT: VBAK, MARA 등 내부 테이블 접근 → I_SalesOrder, I_Material 등으로 교체
- Deprecated 구문:
CALL TRANSACTION,SUBMIT,LEAVE TO LIST-PROCESSING등은 Cloud 런타임 미지원 - 일부 시스템 변수:
SY-REPID,SY-CPROG,SY-DYNNR등 일부 사용 제한
✅ 사전 진단: ADT 프로젝트 설정에서 "ABAP for Cloud Development" 검사 변형을 활성화하면, 온프레미스 코드를 ATC로 일괄 검사하여 위반 사항을 한 번에 추출할 수 있습니다. 마이그레이션 프로젝트는 보통 이 단계부터 시작합니다.
❓ Q4. ABAP Cloud 개발은 반드시 RAP으로 해야 하나요?
✅ "반드시"는 아닙니다. 단순 백엔드 잡(Job)이나 통합 인터페이스라면 Class 기반으로 충분합니다. 하지만 UI(Fiori)를 가진 트랜잭션을 만든다면 RAP이 사실상 표준입니다. 이유는 다음과 같습니다.
- SE11 + 화면 트랜잭션(CBO) 방식은 ABAP Cloud에서 지원 자체가 없음
- Business Object 정의(Behavior Definition)로 CRUD 로직 재사용
- OData V4 서비스 자동 노출 → Fiori Elements와 즉시 연동
- Draft 처리(임시 저장), Lock 관리, Authorization 통합 제공
- Managed/Unmanaged/Projection 시나리오로 점진적 확장 가능
" ✅ RAP - Behavior Definition (managed scenario)
managed implementation in class zbp_my_entity unique;
define behavior for ZI_MyEntity alias MyEntity
persistent table zmy_entity
lock master
authorization master ( instance )
etag master LastChangedAt
{
create;
update;
delete;
field ( readonly ) MyEntityId, CreatedAt;
field ( mandatory ) Description;
mapping for zmy_entity
{
MyEntityId = myentity_id;
Description = description;
CreatedAt = created_at;
LastChangedAt = last_changed_at;
}
}
✅ 자세한 가이드는 RAP Managed Scenario 튜토리얼 그룹을 따라가시면 됩니다.
❓ Q5. Standard ABAP에서 쓰던 BAdI, Enhancement Spot은 Cloud에서도 쓸 수 있나요?
✅ 부분적으로 가능합니다. Cloud의 확장 정책은 다음과 같이 정리됩니다.
| 확장 유형 | ABAP Cloud (Steampunk) | S/4HANA Cloud Public |
|---|---|---|
| 공개 BAdI Definition | 가능 | 가능 (Key User Tools 또는 Developer Extensibility) |
| Implicit Enhancement | 불가 | 불가 |
| Explicit Enhancement Point | 일부만 가능 (Released된 것) | 매우 제한적 |
| Modification (수정) | 불가 | 불가 |
| SE38 Z 프로그램 (Classic) | 불가 | 불가 |
✅ 일반적으로 S/4HANA Cloud Public Edition은 Clean Core 원칙을 더 엄격하게 적용하며, 확장은 Developer Extensibility 또는 Side-by-Side(BTP ABAP Environment) 모델로 분리하는 것이 권장됩니다.
⚠️ 흔한 실수 / 트러블슈팅
FAQ 1. "ATC 검사는 통과했는데 런타임에서 갑자기 에러가 납니다"
✅ Released 상태가 시스템 버전마다 다를 수 있습니다. 개발 시스템(상위 패치)에서는 공개된 객체가 운영(하위 패치)에서는 미공개일 수 있어요. 운영 시스템 기준으로 ATC를 다시 돌리고, 시스템 간 패치 레벨을 일치시키세요.
FAQ 2. "내가 만든 Z 테이블은 SELECT 되는데, 표준 테이블만 막힙니다. 왜죠?"
✅ 본인이 만든 Z 객체는 자동으로 "내 패키지의 사용"이 허용되므로 동작합니다. 하지만 SAP 표준 테이블/FM은 Released 표시가 명시적으로 있어야 호출 가능합니다. 이 차이를 모르고 "어? 되는 코드도 있는데?"라며 헷갈리는 경우가 많습니다.
FAQ 3. "BAPI_MATERIAL_GETLIST를 호출했는데 'function not released' 에러가 납니다"
✅ 동일 이름의 BAPI라도 시스템/릴리스에 따라 공개 상태가 다를 수 있습니다. ADT에서 FM을 열어 F2 → "API State" 확인이 우선입니다. 미공개라면 help.sap.com ABAP Cloud 문서에서 대체 API를 검색하거나, SAP Influence 채널을 통해 공개 요청을 제출할 수 있습니다.
FAQ 4. "SY-REPID를 못 쓰면 현재 프로그램명을 어떻게 알죠?"
✅ ABAP Cloud에서는 cl_abap_context_info 클래스의 메서드를 사용합니다.
" ❌ DATA(lv_prog) = sy-repid. " 일부 컨텍스트에서 제한
" ✅ Cloud-safe
DATA(lv_user) = cl_abap_context_info=>get_user_technical_name( ).
DATA(lv_time) = cl_abap_context_info=>get_system_date( ).
🚀 다음 단계 / 관련 주제
- RAP 심화: Managed → Unmanaged → Projection으로 단계별 학습. Behavior Implementation에서 Determinations/Validations 작성
- Custom Communication Scenario: BTP ABAP에서 외부 시스템(S/4 On-Premise, 3rd-party API) 호출 패턴
- ABAP Unit + Test Doubles: Cloud-native 테스트 자동화 (CDS Test Double Framework 포함)
- Joule for Developers: AI 기반 ABAP 코드 어시스턴트로 Cloud 호환 코드 자동 변환
- Clean Core Extensibility: 3-Tier 확장 모델을 프로젝트에 적용하는 거버넌스 수립