> **TL;DR** — RAP(ABAP RESTful Application Programming Model)은 **S/4HANA·BTP·Fiori 시대의 표준 ABAP 개발 모델**이다. 핵심 공식은 *"CDS로 데이터 모델 → Behavior로 행동 정의 → Projection으로 노출 → Service로 OData 발행"*. 새로 짜면 **managed**(프레임워크가 CRUD·저장 자동), 레거시 로직을 감싸면 **unmanaged**(직접 구현)를 고른다. ABAP 코드에서 BO를 다룰 땐 SQL 비슷한 **EML**(`READ/MODIFY/COMMIT ENTITIES`)을 쓴다. 이 글은 SAP 공식 문서/러닝으로 용어를 검증해 정리한다. RAP은 구식 모델(BOPF, 모듈풀, 직접 OData 핸들러 작성)을 대체한다. SAP가 **ABAP Cloud / Clean Core** 전략의 개발 표준으로 밀고 있어, S/4HANA 신규 개발·확장은 사실상 RAP로 수렴한다. --- ## 0. 왜 RAP인가 | 구식 방식 | RAP | |---|---| | OData 서비스를 SEGW에서 수작업, 핸들러 메서드 직접 구현 | CDS + Behavior 선언 → OData 서비스 **자동 생성** | | 트랜잭션 처리(락·저장·draft)를 매번 직접 | managed 시 **프레임워크가 처리** | | Fiori Elements 연동에 추가 작업 | 메타데이터(annotation)로 **Fiori UI 자동 구성** | | 단위 테스트 어려움 | EML + 의존성 분리로 **테스트 용이** | 핵심 동기: **"비즈니스 로직만 작성하고, 보일러플레이트는 프레임워크에 위임"**. --- ## 1. RAP 비즈니스 오브젝트(BO)의 구성요소 RAP BO는 **데이터 모델 + 트랜잭션 동작**의 묶음이다. CDS로 데이터를 모델링하고, behavior로 동작을 정의·구현한 뒤, projection으로 추려서 service로 발행한다. 아래 5개 계층을 위에서 아래로 쌓는다고 보면 된다. | 계층 | 역할 | 한 줄 | |---|---|---| | CDS 데이터 모델 | 데이터 구조·연관·composition | 인터페이스 뷰(`ZI_*`) | | Behavior Definition (BDEF) | 가능한 연산·필드 속성 선언 | BDL로 작성, "무엇을" | | Behavior Implementation | 실제 로직 | Behavior Pool(ABAP 클래스), "어떻게" | | Projection | 소비용 부분 노출·UI 주석 | 컨슈머 뷰(`ZC_*`) | | Business Service | RESTful 발행 | Service Definition + **Service Binding**(OData V2/V4) | > 💡 **Service Definition**은 "무엇을 노출할지", **Service Binding**은 "어떤 프로토콜(OData V2/V4·UI/Web API)로 노출할지"를 정한다. 둘은 별개다. --- ## 2. Managed vs Unmanaged — RAP 첫 의사결정 가장 먼저 정해야 할 것. **구현 타입**에 따라 직접 짜야 하는 양이 완전히 달라진다. | 구분 | Managed | Unmanaged | Managed with additional save | |---|---|---|---| | 누가 CRUD·저장 처리? | **프레임워크** | **개발자가 직접** | 프레임워크 + 커스텀 저장 | | 영속화(persistence) | BDEF에 `persistent table` 선언만 | 직접 INSERT/UPDATE/DELETE 구현 | 런타임은 managed, 저장만 레거시로 | | 언제 | **신규(greenfield) 앱** | **기존 레거시 로직/함수모듈 래핑** | managed 쓰되 저장만 기존 테이블/FM | | 작업량 | 적음 (선언 위주) | 많음 (REST 계약 직접 충족) | 중간 | ```abap " 👍 Managed — 선언만으로 CRUD 완성 (신규 개발) managed implementation in class zbp_i_travel unique; define behavior for ZI_Travel alias Travel persistent table ztravel lock master { create; update; delete; field ( readonly ) travel_id; field ( mandatory ) agency_id, customer_id; } ``` **결정 규칙**: 새로 짜면 **managed**. 손댈 수 없는 레거시 저장 로직(함수모듈/BAPI)을 재사용해야 하면 **unmanaged** 또는 **managed + additional save**. --- ## 3. Behavior Definition이 정의하는 것 BDEF(BDL 언어)는 엔티티마다 **할 수 있는 일과 규칙**을 선언한다. | 요소 | 의미 | 예 | |---|---|---| | 표준 연산 | Create / Update / Delete | `create; update; delete;` | | 필드 속성 | 읽기전용·필수·결정값 | `field ( readonly ) id;` / `field ( mandatory ) name;` | | **Determination** | 특정 시점에 값 자동 계산/채움 | 저장 시 총액 계산 | | **Validation** | 저장 전 규칙 검증 | 고객 존재 여부 확인 | | **Action** | 비표준 수정 연산(버튼 등) | `action acceptTravel;` | ```abap validation validateCustomer on save { field customer_id; create; } determination calcTotal on modify { field amount; } action ( features : instance ) acceptTravel result [1] $self; ``` > Determination = "자동으로 채운다", Validation = "막는다", Action = "사용자가 명시적으로 실행한다". 셋의 역할을 헷갈리지 말 것. --- ## 4. EML — ABAP 코드로 RAP BO 다루기 **EML(Entity Manipulation Language)**은 RAP BO에 **타입 안전하게** 접근하는 SQL 비슷한 ABAP 구문이다. 다른 프로그램·테스트·잡(job)에서 BO를 조작할 때 쓴다. ```abap " 읽기 READ ENTITIES OF ZI_Travel ENTITY Travel ALL FIELDS WITH VALUE #( ( travel_id = '0001' ) ) RESULT DATA(travels). " 수정 (특정 필드만) MODIFY ENTITIES OF ZI_Travel ENTITY Travel UPDATE FIELDS ( overall_status ) WITH VALUE #( ( travel_id = '0001' overall_status = 'A' ) ) FAILED DATA(failed) REPORTED DATA(reported). " 트랜잭션 확정 COMMIT ENTITIES. ``` | EML 구문 | 용도 | |---|---| | `READ ENTITIES` | BO 인스턴스 조회 | | `MODIFY ENTITIES` | create / update / delete / action 실행 | | `COMMIT ENTITIES` | 변경 영속화(확정) | | `failed` / `reported` | 실패 키 / 메시지 회수 | --- ## 5. Draft — Fiori의 "임시 저장" **Draft**는 사용자가 입력 중인 미완성 데이터를 **확정(commit) 전에 보존**하는 RAP 기능이다. Fiori Elements가 자동으로 "초안 유지/복구" UX를 제공한다. - 활성화: BDEF에 `with draft;` + draft 테이블 지정. - 효과: 새로고침·세션 종료에도 입력값 유지, 동시편집 잠금. - 신규 트랜잭션 앱은 보통 **draft 켜는 것을 권장**(Fiori 표준 UX). --- ## 6. 시작 팁 (Clean Core 시대) - **ABAP Cloud / Clean Core**: RAP은 *released* SAP API만 쓰는 클린코어 확장의 핵심. 구식 직접접근 대신 RAP·공개 API로. - **개발 순서**: CDS 인터페이스 뷰 → BDEF(managed) → Behavior Pool → Projection(`ZC_*`) + Projection BDEF → Service Definition → Service Binding(OData V4) → Fiori Elements 미리보기. - **생성 마법사**: ADT의 *Generate ABAP Repository Objects* 위저드로 CDS→서비스까지 골격 자동 생성 후 로직만 채우면 빠르다. - **테스트**: EML + ABAP Unit으로 BO 동작을 코드로 검증. --- ## 출처 & 더 읽을거리 - SAP 공식 **ABAP RAP 개발 가이드** (SAP Help Portal): [help.sap.com/docs/abap-cloud/abap-rap](https://help.sap.com/docs/abap-cloud/abap-rap/business-object) - SAP 공식 **Entity Manipulation Language (EML)**: [help.sap.com](https://help.sap.com/docs/abap-cloud/abap-rap/entity-manipulation-language-eml) - SAP Learning — **Building Transactional Apps with RAP**: [learning.sap.com](https://learning.sap.com/courses/building-transactional-apps-with-the-abap-restful