SAP RAP 주요 테마와 개념 정리
아래 내용은 ABAP RESTful 애플리케이션 프로그래밍 모델(RAP)의 주요 테마와 중요 개념들을 요약 및 정리한 내용입니다.
RAP 공부하면서 그냥 혼자 어디에 적어둔 내용들입니다...

1. 핵심 개념 및 구조
RAP는 ABAP 환경에서 RESTful 웹 서비스를 쉽게 구축하기 위한 프레임워크입니다.
주요 구성 요소는 다음과 같습니다.
* 행위 정의 (Behavior Definition):
- 비즈니스 객체의 행위(생성, 수정, 삭제, 액션 등)를 정의합니다.
- CDS BDL(Behavior Definition Language) 구문을 사용합니다.
* 행위 구현 (Behavior Implementation):
- 행위 정의에 명시된 행위들을 ABAP 클래스(행위 핸들러 클래스)에서 구현합니다.
- CLASS lhc_handler DEFINITION INHERITING FROM CL_ABAP_BEHAVIOR_HANDLER. 와 같이 로컬 핸들러 클래스에서 구현될 수 있습니다.
- implementation in class /DMO/BP_TRAVEL_M unique 와 같이 행위 정의에 구현 클래스를 명시합니다.
* 데이터 모델 (Data Model):
- CDS View를 사용하여 데이터 모델을 정의합니다.
- 영구 데이터 저장소(데이터베이스 테이블)와 드래프트 데이터 저장소를 위한 테이블 접두사 규칙이 있습니다.
>> 영구 테이블: A_ 접두사 사용
>> 드래프트 테이블: D_ 접두사 사용
※ /DMO/ 네임스페이스는 데모 목적으로 예약되어 있으며, 프로덕션 코드에서는 사용하지 않도록 권장됩니다.
* 서비스 정의 (Service Definition):
- 비즈니스 객체의 어떤 부분이 외부 소비에게 노출될 것인지 정의합니다.
* 서비스 바인딩 (Service Binding):
- 서비스 정의를 기반으로 특정 통신 프로토콜(예: OData)을 사용하여 서비스를 노출합니다.
2. 행위 구현의 주요 요소
행위 구현 클래스는 cl_abap_behavior_handler 클래스를 상속받아 다양한 메서드를 구현합니다.
- 생성(create), 업데이트(update), 삭제(delete), 애플리케이션 특정 액션 등 변경 작업을 처리합니다.
- 읽기 요청을 처리합니다.
- 엔티티 인스턴스 잠금을 처리합니다. RAP 잠금 메커니즘은 ABAP Dictionary의 잠금 오브젝트를 사용합니다.
METHODS lock_method FOR LOCK 와 같이 선언합니다.
- Determination : 비즈니스 객체의 데이터 변경에 따라 자동으로 실행되는 로직입니다. 동일한 트리거 시간을 사용하는 여러 Determinations를 단일 메서드에서 구현할 수 있습니다.
- Validation : 데이터의 유효성을 검사합니다. 유효성 검사 실패 시 저장 시퀀스를 방지하고 메시지를 반환할 수 있습니다.
validation validateDates on save { create; field BeginDate, EndDate; } 와 같이 행위 정의에서 정의됩니다.
3. 엔터티 조작 및 데이터 관리
RAP는 EML(Entity Manipulation Language)을 사용하여 비즈니스 객체 인스턴스를 조작합니다.
- READ ENTITIES : 엔티티 인스턴스에 대한 읽기 접근을 제공합니다.
- MODIFY ENTITIES : 엔티티 인스턴스의 생성, 업데이트, 삭제 및 액션 실행을 수행합니다.
- COMMIT ENTITIES : 트랜잭션 버퍼의 데이터를 데이터베이스에 반영합니다.
COMMIT ENTITIES IN SIMULATION MODE 를 사용하여 저장 시퀀스를 시뮬레이션할 수 있습니다.
- ROLLBACK ENTITIES : 트랜잭션 버퍼를 리셋하고 마지막 COMMIT ENTITIES 작업 이후의 모든 변경 사항을 되돌립니다.
- IN LOCAL MODE : EML 구현이 자체 행위 풀에서 RAP BO 인스턴스를 소비하는 경우에 사용됩니다. 접근 제어, 권한 제어, 기능 제어 또는 사전 검사 없이 BO에 직접 접근합니다.
4. 권한 및 기능 제어
RAP는 다양한 수준에서 권한 및 기능 제어를 제공합니다.
- GET PERMISSIONS : 비즈니스 객체에 대한 기능 제어 및 권한 정보를 전역 및 인스턴스 레벨에서 검색합니다.
>> GET PERMISSIONS ONLY GLOBAL AUTHORIZATION ENTITY /DMO/R_Travel_D REQUEST request_ga RESULT DATA(result) FAILED DATA(failed) REPORTED DATA(reported). 와 같이 전역 권한을 확인할 수 있습니다.
>> GET PERMISSIONS ONLY INSTANCE AUTHORIZATION ENTITY ... 와 같이 인스턴스 권한을 확인할 수 있습니다.
>> GET PERMISSIONS ONLY INSTANCE FEATURES ENTITY ... 와 같이 인스턴스 기능을 확인할 수 있습니다.
- 전역 권한 (Global Authorization) : 사용자에게 특정 작업을 수행할 권한이 있는지 여부와 같이 사용자에게만 의존하는 모든 권한 검사에 사용됩니다.
- 인스턴스 권한 (Instance Authorization) : 특정 인스턴스에 대한 권한을 확인합니다. (01)
- 기능 제어 (Feature Control) : 액션이 활성화(ENABLED)되었는지 비활성화(DISABLED)되었는지 등 비즈니스 객체의 상태에 따라 기능 가용성을 제어합니다.
- 전역 기능 제어 (Global Feature Control) : 비즈니스 객체 상태와 무관하게 기능 제어를 정의합니다.
- PRIVILEGED : 소비자가 권한 확인을 우회하는 등 특권 접근을 허용합니다. 제공자가 RAP BO 인터페이스에 권한 컨텍스트를 정의해야 합니다.
5. 테스트 환경 및 도구
RAP 개발에서는 테스트 환경 구축 및 테스트 더블 활용이 중요합니다.
** RAP에서의 "더블 활용"이란?? 주로 단위 테스트(Unit Testing) 또는 통합 테스트(Integration Testing) 시 '테스트 더블'이라는 대체 객체를 사용하여 실제 시스템 구성 요소(예: 데이터베이스 테이블, 비즈니스 로직 구현체, 이벤트 등)를 대체하고, 이를 통해 테스트의 안정성, 예측 가능성, 속도를 향상시키는 활동을 의미한다.
테스트 더블(Test Double)은 실제 객체를 대체하여 테스트 시 사용되는 객체를 말하는데, 이는 단위 테스트에서 외부 종속성(예: 데이터베이스, API, 서비스 호출)을 제거하고 예측 가능한 테스트 환경을 만들기 위해 사용된다.
- 클래스 under test : 테스트 대상이 되는 행위 핸들러 클래스입니다. FRIENDS 구문을 사용하여 테스트 클래스에 접근 권한을 부여합니다.
- Fixture Methods : 테스트 환경을 설정하고 해제하여 각 테스트 실행에 대해 고유한 테스트 동작을 생성하는 데 사용됩니다.
- CDS Test Environment (cl_cds_test_environment) : CDS 뷰에 대한 테스트 더블을 생성하고 관리합니다. 이 기능은 단위 테스트 시 실제 CDS 뷰를 모방한 테스트 환경을 생성하고 테스트 데이터를 주입하여 RAP 로직을 검증할 수 있도록 합니다.
>> cds_test_environment = cl_cds_test_environment=>create( i_for_entity = 'CDS_view1'(<-테스트할 CDS 뷰 이름) ). 와 같이 생성합니다.
※전제조건: CDS_view1(테스트할 CDS 뷰 이름) 는 define view entity 또는 define view로 정의된 CDS 뷰여야 합니다.
>> enable_double_redirection( ) 메서드를 사용하여 Open SQL 접근을 테스트 더블로 리디렉션할 수 있습니다.
>> insert_test_data( ) 메서드를 사용하여 테스트 데이터를 삽입합니다.
- Open SQL Test Environment (cl_osql_test_environment) : 데이터베이스 테이블에 대한 테스트 더블을 생성하고 관리합니다.
>> sql_test_environment = cl_osql_test_environment=>create( i_dependency_list = VALUE #( ( 'database1' ) ) ). 와 같이 생성합니다.
>> insert_test_data( ) 메서드를 사용하여 테스트 데이터를 삽입합니다.
- Buffer Test Double (if_botd_txbufdbl_bo_test_env, if_botd_txbufdbl_test_double) : 트랜잭션 버퍼에 대한 테스트 더블을 생성하고 관리합니다.
- Test Doubles를 사용한 테스트 데이터 삽입 : CDS 뷰 또는 데이터베이스 테이블에 대한 테스트 더블에 테스트 데이터를 삽입하여 특정 시나리오를 테스트합니다.
>> cds_test_environment->insert_test_data( travel_mock_data ). 와 같이 사용됩니다.
- 메시지 확인 : FAILED 및 REPORTED 테이블을 사용하여 테스트 실행 중 발생한 실패 및 보고된 메시지를 확인합니다.
>> cl_abap_unit_assert=>assert_initial( i_failed ). 와 같이 실패 테이블이 비어 있는지 확인할 수 있습니다.
6. 확장성 및 기타 개념
- 확장성 활성화 (Extensibility-Enablement) : CDS 데이터 모델 및 CDS 뷰에 대한 확장성을 활성화하고 제어합니다. 어노테이션을 사용하여 새로운 데이터 소스나 컴포지션의 추가 허용 여부를 정의할 수 있습니다.
Quota 정의를 통해 할당된 필드 수 또는 바이트 용량을 특정 소비자 그룹에 할당할 수 있습니다.
- CDS BDL - saving options : 저장 시퀀스에 대한 추가 옵션을 정의합니다.
with additional save 구문을 사용하여 추가 저장 로직을 구현할 수 있습니다.
- Virtual Elements : CDS 뷰에 물리적으로 저장되지 않는 요소를 정의하고 ABAP 클래스에서 계산 로직을 구현합니다.
- Unmanaged Query : CDS 뷰에 대해 사용자 정의 쿼리 로직을 구현할 수 있도록 합니다.
>> get_requested_elements 및 get_as_ranges 메서드를 사용하여 요청된 요소 및 필터 조건을 가져올 수 있습니다.
>> if_rap_query_paging=>page_size_unlimited 상수는 페이지 크기 제한 없음을 나타냅니다.
- Value Help : CDS 뷰에 값 도움말을 정의하고 소비합니다. 추가 바인딩을 통해 값 도움말 제공자 엔티티에 필터 조건을 정의할 수 있습니다.
>> Consumption.valueHelpDefinition.additionalBinding[] 어노테이션을 사용합니다.
- 어노테이션 (Annotations) : CDS 엔티티의 메타데이터를 정의합니다.
@EndUserText.label
@AbapCatalog.enhancement.category
@AbapCatalog.tableCategory
@AbapCatalog.deliveryClass
@AbapCatalog.dataMaintenance
- 메시지 처리 : failed 및 reported 테이블을 사용하여 실패 및 보고된 메시지를 처리합니다.
>> %tky 필드는 관련 BO 인스턴스의 ID를 나타냅니다.
>> %state_area 필드는 메시지가 속한 상태 영역을 식별합니다.
SAP 에서 제공하는 RAP 관련 자료와 헬프 포털 사이트에 있는 내용을 보고 따로 정리해 둔 것을 블로그에 작성한 것입니다.
그냥 RAP 모델의 간략한 개념 정리 정도라고 보면 될 것 같습니다. 저도 다 해본 것도 아니고 공부용 정리한 것이어서 뭐... 대충 이런 게 있다~ 딱 그 정도입니다..