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

Moderator


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대 이슈:

  1. 미공개 FM/BAPI 사용: RFC_READ_TABLE, 사내 Z_FM 등이 무방비 호출됨
  2. DYNPRO/SAPGUI 화면 코드: MODULE, CALL SCREEN, PARAMETERS 등 SAP GUI 의존 구문은 Fiori로 재작성 필요
  3. 직접 DB 테이블 SELECT: VBAK, MARA 등 내부 테이블 접근 → I_SalesOrder, I_Material 등으로 교체
  4. Deprecated 구문: CALL TRANSACTION, SUBMIT, LEAVE TO LIST-PROCESSING 등은 Cloud 런타임 미지원
  5. 일부 시스템 변수: 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 확장 모델을 프로젝트에 적용하는 거버넌스 수립

📚 참고 자료