ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AMDP 없이 CDS 데이터 구성하기 | SAP ABAP
    SAP 2026. 5. 29. 17:24
    AMDP 없이 CDS 데이터 구성하기 | SAP ABAP

    AMDP 없이 CDS 데이터 구성하기

    CDS View에서 데이터를 제공하는 방법은 DB 테이블이나 AMDP만 있는 것이 아닙니다. AMDP 없이 고정 데이터 또는 ABAP 로직으로 데이터를 직접 구성할 수 있는 두 가지 방법을 정리합니다.

    1. 방법 비교 요약

    항목 Custom Entity + Query Provider CDS UNION ALL
    AMDP 필요 불필요 불필요
    DB 테이블 의존 없음 있음 (행 보장 불가)
    데이터 유지보수 ✅ ABAP 클래스만 수정 ⚠️ CDS 수정 필요 (재활성화)
    데이터 건수 제한 없음 많아지면 비효율
    조건 분기 / 계산 ✅ ABAP 로직 자유롭게 ❌ 불가
    권장 여부 SAP 표준, 권장 소량 임시용만 사용

    2. 방법 1 — Custom Entity + Query Provider 권장

    SAP RAP 기반의 표준 방식입니다. define custom entity로 CDS 구조를 선언하고, @ObjectModel.query.implementedBy로 지정한 ABAP 클래스가 데이터를 직접 반환합니다. DB 테이블도, AMDP도 필요하지 않습니다.

    💡 Custom Entity는 DB View가 아닌 가상 엔티티입니다. 데이터 소스는 오직 Query Provider 클래스의 if_rap_query_provider~select 메서드가 담당합니다.

    STEP 1 Custom Entity 정의

    @EndUserText.label: '코드 목록'
    @ObjectModel.query.implementedBy: 'ABAP:ZCL_CODE_LIST_PROVIDER'
    
    define custom entity ZC_CODE_LIST
    {
      key Code     : abap.numc(1);
          CodeText : abap.char(10);
    }
    💡 define custom entityas select from 없이 필드 구조만 선언합니다. SQL View가 생성되지 않으며, 데이터는 전적으로 Query Provider가 제공합니다.

    STEP 2 Query Provider 클래스 구현

    CLASS zcl_code_list_provider DEFINITION
      PUBLIC FINAL CREATE PUBLIC.
    
      PUBLIC SECTION.
        INTERFACES if_rap_query_provider.
    
    ENDCLASS.
    
    CLASS zcl_code_list_provider IMPLEMENTATION.
    
      METHOD if_rap_query_provider~select.
    
        " ① 데이터 하드코딩 (ABAP 로직으로 자유롭게 구성 가능)
        DATA(lt_data) = VALUE TABLE OF zc_code_list(
          ( code = '1'  code_text = '일' )
          ( code = '2'  code_text = '이' )
          ( code = '3'  code_text = '삼' )
          ( code = '4'  code_text = '사' )
          ( code = '5'  code_text = '오' )
          ( code = '6'  code_text = '육' )
          ( code = '7'  code_text = '칠' )
          ( code = '8'  code_text = '팔' )
          ( code = '9'  code_text = '구' )
        ).
    
        " ② 페이징 처리 (OData 요청 대응 — 필수 구현)
        DATA(lv_offset) = io_request->get_paging( )->get_offset( ).
        DATA(lv_limit)  = io_request->get_paging( )->get_page_size( ).
    
        IF lv_limit <> if_rap_query_paging=>page_size_unlimited.
          lt_data = lt_data[
            lv_offset + 1
            ..
            MIN( lv_offset + lv_limit, lines( lt_data ) )
          ].
        ENDIF.
    
        " ③ 결과 반환 (건수 + 데이터 모두 필수)
        io_response->set_total_number_of_records( lines( lt_data ) ).
        io_response->set_data( lt_data ).
    
      ENDMETHOD.
    
    ENDCLASS.
    ⚠️ set_total_number_of_recordsset_data 둘 다 반드시 호출해야 합니다. 누락 시 OData $count 요청 오류가 발생합니다.

    STEP 3 Service Definition 등록

    define service ZCODE_SRV {
      expose ZC_CODE_LIST as CodeList;
    }

    이후 ADT에서 Service Binding(OData V4 - UI)을 생성하고 Activate하면 Fiori Elements로 바로 노출됩니다.

    3. 방법 2 — CDS UNION ALL 소량 임시용

    CDS View 내에서 UNION ALL로 고정 값을 직접 나열하는 방법입니다. 구현이 단순하지만, 실제 DB 테이블 행의 존재 여부에 의존하므로 신뢰성이 낮습니다.

    define view entity ZI_CODE_LIST as
      select from t001 { '1' as Code, '일' as CodeText }
      where mandt = $session.client and bukrs = '0001'
      union all
      select from t001 { '2' as Code, '이' as CodeText }
      where mandt = $session.client and bukrs = '0001'
      union all
      select from t001 { '3' as Code, '삼' as CodeText }
      where mandt = $session.client and bukrs = '0001';
    ⚠️ FROM t001에 해당 bukrs 데이터가 없으면 행이 생성되지 않습니다. 데이터가 보장된 테이블을 사용해야 하며, 건수가 많아질수록 CDS가 비대해집니다.

    4. 어떤 방법을 선택할까

    상황권장 방법
    코드/공통 데이터를 ABAP에서 직접 관리 ✅ Custom Entity + Query Provider
    DB 조회 결과 + 고정 항목 혼합 ✅ Custom Entity (ABAP에서 SELECT 후 APPEND)
    조건 분기, 외부 API 호출, 복잡한 계산 ✅ Custom Entity + Query Provider
    3~5건 이하 단순 고정값, 빠른 프로토타입 ⚠️ CDS UNION ALL (임시)

    5. 구현 체크리스트

    Custom Entity

    • define custom entity 키워드 사용 (일반 view entity 아님)
    • @ObjectModel.query.implementedBy: 'ABAP:클래스명' 어노테이션 선언
    • ☐ 클래스에 if_rap_query_provider 인터페이스 구현
    • set_total_number_of_records 호출 (건수 반환 필수)
    • set_data 호출 (데이터 반환 필수)
    • ☐ 페이징(get_offset / get_page_size) 처리 구현
    • ☐ Service Definition + Binding (OData V4) 등록 및 활성화

    CDS UNION ALL

    • ☐ FROM 절에 사용하는 테이블에 데이터 존재 여부 확인
    • mandt = $session.client 조건 필수
    • ☐ 건수 증가 시 Custom Entity로 전환 검토
    #SAP_ABAP #CDS #CustomEntity #QueryProvider #RAP #ODataV4 #AMDP없이데이터구성 #NoAMDP
Designed by Tistory.