ABAP 7.40 + SAP HANA 환경에서 데이터가 많아질수록 ABAP 측에서 SELECT 한 결과를 LOOP 으로 가공하는 패턴이 성능 병목이 되는 경우가 늘어났습니다. 수십만 건의 자재이동 이력을 ABAP 메모리로 끌어와 LOOP AT ... ENDLOOP 안에서 분류·집계·조건 분기까지 처리하면 App Server 와 DB 사이의 데이터 왕복이 늘어나고 메모리도 부담됩니다.
이 문제의 표준 해결책이 AMDP(ABAP Managed Database Procedures) 입니다. ABAP 클래스의 한 메소드를 HANA 의 SQL Script 로 작성 해서, 로직 자체를 DB 안에서 실행하게 만드는 기능입니다. 데이터를 DB 밖으로 꺼내지 않고 DB 안에서 가공한 결과만 ABAP 에 돌려주기 때문에 대용량 처리에서 성능 차이가 크게 나타납니다.
이 글은 AMDP 의 기본 개념·생성 절차·DEFINITION 과 IMPLEMENTATION 부 키워드·Open SQL 과 다른 SQL Script 문법·ABAP 프로그램에서의 호출 방법까지 한 번에 정리한 실무 메모입니다. CDS View 와 언제 갈라쓸지, 어떤 제약을 조심해야 하는지도 같이 다룹니다.
핵심 — CDS View vs AMDP
두 도구 모두 "ABAP 안에서 HANA 의 힘을 빌리는" 메커니즘이지만 용도가 다릅니다.
| 항목 | CDS View | AMDP |
|---|---|---|
| 형태 | 선언형 DDIC 뷰 (DDL 파일) | 절차형 SQL Script (클래스 메소드) |
| 주요 용도 | JOIN · 단순 가공 · 뷰 정의 | 복잡한 절차 로직 · 변수 선언 · 분기 · 누적 가공 |
| 호출 | SELECT FROM zcds_view |
CALL METHOD zcl_amdp=>method |
| 변경 가능한 변수 | 없음 (선언형) | 있음 (절차형 · 임시 ITAB 선언 가능) |
| 적합 시나리오 | 조회 뷰 · ALV 화면 · 분석 | 수불부 집계 · 복잡 보고서 · 대용량 가공 |
핵심 한 줄: "한 번의 JOIN" 이면 CDS View, "여러 단계를 거치는 로직" 이면 AMDP. AMDP 는 SQL Script 라는 절차형 언어를 쓰기 때문에 변수 선언·분기·임시 테이블·여러 SELECT 의 결합이 가능합니다. 단, 결과적으로 DB 안에서 실행되므로 모든 코드는 HANA 가 이해할 수 있는 표현으로 작성해야 합니다.
1단계 — AMDP 클래스 생성 (Eclipse ADT)
AMDP 는 반드시 Eclipse 의 ADT(ABAP Development Tools) 에서 만들어야 합니다. SAP GUI 의 SE24 Class Builder 에서는 AMDP 본문을 편집할 수 없습니다.
Eclipse (ADT) → ABAP 프로젝트 → 패키지 우클릭
→ New → ABAP Class
→ Name : ZCL_XX_AMDP_DEMO
→ Description : AMDP 데모용 클래스
→ Next → 패키지 / Transport 지정 → Finish
→ 클래스 편집기 자동 진입

클래스 이름은 사내 규칙에 따라 자유롭게. 일반적인 패턴은 ZCL_{모듈}AMDP{용도} 같은 형태입니다.
2단계 — INTERFACES if_amdp_marker_hdb 마커 추가
새 클래스의 PUBLIC SECTION 에 AMDP 마커 인터페이스 한 줄을 추가합니다. 이 줄이 없으면 컴파일러가 AMDP 문법을 인식하지 못합니다.
CLASS zcl_xx_amdp_demo DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_amdp_marker_hdb. " ★ AMDP HDB 마커
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.


if_amdp_marker_hdb 의 의미는 "이 클래스 안에는 HANA(HDB) 용 AMDP 메소드가 있다" 를 ABAP 런타임에 알리는 마커입니다. 다른 DB 용 AMDP 가 필요하면 해당 마커(예: IF_AMDP_MARKER_ASE) 를 사용하지만, 사실상 HANA 환경이 대부분이라 HDB 가 표준.
3단계 — DEFINITION: CLASS-METHODS 선언
DEFINITION 부에 메소드 시그니처를 선언합니다. AMDP 는 보통 인스턴스 생성 없이 호출하는 정적 메소드 로 만듭니다.
PUBLIC SECTION.
INTERFACES if_amdp_marker_hdb.
TYPES: BEGIN OF ty_mara,
matnr TYPE mara-matnr,
mtart TYPE mara-mtart,
matkl TYPE mara-matkl,
END OF ty_mara,
tt_mara TYPE STANDARD TABLE OF ty_mara WITH EMPTY KEY.
CLASS-METHODS get_mara_by_type
IMPORTING VALUE(iv_mtart) TYPE mara-mtart
EXPORTING VALUE(et_mara) TYPE tt_mara.
| 키워드 | 의미 |
|---|---|
CLASS-METHODS |
정적 메소드 — 클래스명=>메소드명 으로 직접 호출 / 인스턴스 불필요 |
IMPORTING |
입력 파라미터 — AMDP 안에서 사용할 검색 조건 |
EXPORTING |
출력 파라미터 — 보통 결과 ITAB |
RAISING |
예외 클래스 — AMDP 실행 중 오류 발생 시 던질 클래스 |
DATA TYPE 만 선언한 상태에서도 활성화가 됩니다. IMPLEMENTATION 부의 본문은 아직 비어 있어도 OK.
4단계 — IMPLEMENTATION: BY DATABASE PROCEDURE FOR HDB
IMPLEMENTATION 부에서 메소드 본문을 작성합니다. AMDP 메소드의 시작과 끝에 ABAP 이 아닌 SQL Script 라는 신호를 줘야 합니다.
CLASS zcl_xx_amdp_demo IMPLEMENTATION.
METHOD get_mara_by_type BY DATABASE PROCEDURE FOR HDB
LANGUAGE SQLSCRIPT
OPTIONS READ-ONLY
USING mara.
et_mara = SELECT matnr, mtart, matkl
FROM mara
WHERE mtart = :iv_mtart
AND mandt = SESSION_CONTEXT( 'CLIENT' );
ENDMETHOD.
ENDCLASS.

각 옵션의 의미를 표로 정리합니다.
| 옵션 | 의미 |
|---|---|
BY DATABASE PROCEDURE FOR HDB |
이 메소드는 HANA DB 의 프로시저로 실행됨 |
LANGUAGE SQLSCRIPT |
본문은 SAP HANA 의 SQL Script 언어로 작성 |
OPTIONS READ-ONLY |
데이터를 읽기만 하고 변경하지 않음 — 성능 최적화 힌트 |
USING mara t001w ... |
메소드 안에서 사용할 DB 객체 명시 — 여러 개 가능 |
USING 절에 명시하지 않은 DB 객체는 AMDP 안에서 접근이 차단됩니다. 사용할 모든 테이블/뷰를 빠뜨리지 말고 등록해야 합니다.
5단계 — Open SQL vs SQL Script 문법 차이
AMDP 안의 본문은 ABAP 의 Open SQL 이 아니라 HANA 의 SQL Script 입니다. 몇 가지 표면적 문법이 다르고, 이 차이를 모르면 활성화가 실패합니다.
| 항목 | Open SQL (ABAP) | SQL Script (AMDP) |
|---|---|---|
| 변수 참조 | @iv_mtart 또는 iv_mtart |
:iv_mtart (콜론 필수) |
| 문장 종결 | 점 . |
세미콜론 ; |
| 결과 할당 | SELECT ... INTO TABLE @lt_data |
et_mara = SELECT ... FROM mara; (직접 할당) |
| 클라이언트 제어 | 자동 (sy-mandt) |
mandt = SESSION_CONTEXT( 'CLIENT' ) 명시 |
| 주석 | 한 줄 " 또는 * |
한 줄 -- · 블록 /* ... */ |
| 임시 ITAB | DATA lt_x TYPE ... |
lt_x = SELECT ... 결과로 자동 추론 (변수 별도 선언 X) |
이 차이만 잡으면 SQL 문법 자체는 익숙합니다. JOIN·GROUP BY·CASE WHEN·UNION 모두 SQL Script 의 표준 구문 그대로 사용 가능.
6단계 — ABAP 프로그램에서 호출
AMDP 메소드는 일반 클래스 메소드처럼 호출합니다.
REPORT zr_amdp_caller.
DATA lt_result TYPE zcl_xx_amdp_demo=>tt_mara.
* AMDP 호출
zcl_xx_amdp_demo=>get_mara_by_type(
EXPORTING iv_mtart = 'FERT'
IMPORTING et_mara = lt_result
).
* 결과 ALV 출력 (cl_salv_table 등)
cl_demo_output=>display( lt_result ).



호출 측 ABAP 코드는 일반 정적 메소드 호출과 완전히 똑같습니다. DB 안에서 어떤 SQL Script 가 실행됐는지는 호출자가 신경 쓸 필요 없이, IMPORTING / EXPORTING 인터페이스만 맞으면 됩니다.
흔히 빠뜨리는 함정
if_amdp_marker_hdb 마커 누락
CLASS zcl_xx_amdp_demo DEFINITION.
PUBLIC SECTION.
" ❌ INTERFACES if_amdp_marker_hdb 누락
CLASS-METHODS get_mara ...
마커가 없으면 BY DATABASE PROCEDURE FOR HDB 라는 문법 자체가 인식되지 않아 활성화가 실패합니다. 모든 AMDP 클래스의 PUBLIC SECTION 첫 줄에 추가.
USING 절에서 테이블 빠뜨림
METHOD ... BY DATABASE PROCEDURE FOR HDB
USING mara. " ❌ MAKT 빠짐
et_data = SELECT ... FROM mara
INNER JOIN makt ON ... ; " 활성화 실패
ENDMETHOD.
AMDP 본문에서 참조하는 모든 DB 객체는 USING 절에 등록되어야 합니다. 누락 시 활성화 시점에 오류 — 메시지에 어떤 테이블이 빠졌는지 명확히 표시됩니다.
변수 앞에 콜론 빠뜨림
SELECT * FROM mara WHERE mtart = iv_mtart; " ❌ 콜론 없음
SELECT * FROM mara WHERE mtart = :iv_mtart; " ✅
SQL Script 는 ABAP 변수를 콜론(:) 으로 구분합니다. 점 종결자(.) 와 함께 자주 빠뜨리는 실수.
DDL · COMMIT · ROLLBACK 사용
AMDP 안에서 다음은 모두 금지됩니다.
- DDL:
CREATE·ALTER·DROP - 트랜잭션 제어:
COMMIT·ROLLBACK - SAP 버퍼링 활성 테이블 쓰기
데이터 변경(INSERT·UPDATE·DELETE) 자체는 가능하지만 트랜잭션 커밋은 ABAP 측에서 처리해야 합니다.
Select-Options 직접 전달 불가
SELECT-OPTIONS s_matnr FOR mara-matnr.
" ❌ AMDP 호출 시 SELECT-OPTIONS 그대로 못 넘김
zcl_xx_amdp_demo=>get_data( s_matnr = s_matnr[] ).
AMDP 의 파라미터에는 ITAB 또는 단일 값만 전달 가능. SELECT-OPTIONS 의 RANGES 테이블이 필요하면 ABAP 측에서 RANGES 로 변환해 ITAB 형태로 넘기는 보조 처리가 필요합니다.
SAP GUI Class Builder 에서 편집 시도
SE24 → ZCL_XX_AMDP_DEMO 열기 → METHOD 편집
→ BY DATABASE PROCEDURE 본문 영역 회색 비활성
SAP GUI 의 Class Builder 는 AMDP 본문 편집을 지원하지 않습니다. ADT(Eclipse) 가 유일한 편집 환경. SE24 에서 시그니처는 보이지만 본문은 안 보입니다.
HANA 가 아닌 DB
이름이 말해주듯이 FOR HDB 는 HANA 전용입니다. 시스템이 Oracle·DB2 등 다른 DB 라면 AMDP 가 작동하지 않습니다. 시스템 버전이 HANA 인지 먼저 확인.
전체 코드 — 복사용 통합본
자재유형으로 자재마스터를 조회해 자재내역까지 조인하는 간단한 AMDP 클래스 + 호출 프로그램 통합본.
* === AMDP 클래스 ===
CLASS zcl_xx_amdp_demo DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_amdp_marker_hdb. " ★ AMDP HDB 마커
TYPES: BEGIN OF ty_mat,
matnr TYPE mara-matnr,
mtart TYPE mara-mtart,
matkl TYPE mara-matkl,
maktx TYPE makt-maktx,
END OF ty_mat,
tt_mat TYPE STANDARD TABLE OF ty_mat WITH EMPTY KEY.
CLASS-METHODS get_mat_by_type
IMPORTING VALUE(iv_mtart) TYPE mara-mtart
VALUE(iv_spras) TYPE makt-spras DEFAULT 'K'
EXPORTING VALUE(et_mat) TYPE tt_mat.
ENDCLASS.
CLASS zcl_xx_amdp_demo IMPLEMENTATION.
METHOD get_mat_by_type BY DATABASE PROCEDURE FOR HDB
LANGUAGE SQLSCRIPT
OPTIONS READ-ONLY
USING mara makt.
et_mat = SELECT a.matnr,
a.mtart,
a.matkl,
b.maktx
FROM mara AS a
INNER JOIN makt AS b
ON a.mandt = b.mandt
AND a.matnr = b.matnr
WHERE a.mtart = :iv_mtart
AND b.spras = :iv_spras
AND a.mandt = SESSION_CONTEXT( 'CLIENT' );
ENDMETHOD.
ENDCLASS.
* === 호출 프로그램 ===
REPORT zr_amdp_caller.
PARAMETERS: p_mtart TYPE mara-mtart DEFAULT 'FERT',
p_spras TYPE makt-spras DEFAULT sy-langu.
DATA lt_result TYPE zcl_xx_amdp_demo=>tt_mat.
zcl_xx_amdp_demo=>get_mat_by_type(
EXPORTING iv_mtart = p_mtart
iv_spras = p_spras
IMPORTING et_mat = lt_result
).
cl_demo_output=>display( lt_result ).
ABAP 측은 일반 클래스 호출 그대로. AMDP 안의 SQL 은 HANA 의 SQL Script 문법이라 콜론 변수·세미콜론 종결자·SESSION_CONTEXT 호출 형태가 적용됩니다.
요약
| 단계 | 작업 | 핵심 |
|---|---|---|
| 1 | 클래스 생성 | Eclipse ADT — SE24 불가 |
| 2 | AMDP 마커 | INTERFACES if_amdp_marker_hdb 추가 |
| 3 | DEFINITION | CLASS-METHODS + IMPORTING / EXPORTING |
| 4 | IMPLEMENTATION | BY DATABASE PROCEDURE FOR HDB + LANGUAGE SQLSCRIPT + OPTIONS READ-ONLY + USING |
| 5 | 본문 SQL Script | 콜론 변수 + 세미콜론 + SESSION_CONTEXT('CLIENT') |
| 6 | ABAP 호출 | 일반 클래스 메소드 호출 — 클래스=>메소드( ... ) |
AMDP 는 ABAP 개발자가 HANA 의 성능을 직접 활용하는 가장 표준적인 방법입니다. 단순 JOIN 은 CDS View 로, 변수·분기·여러 단계가 들어가는 복잡한 가공은 AMDP 로 — 이 두 도구를 적재적소에 갈라 쓰면 대용량 데이터에서도 App Server 메모리 부담 없이 빠르게 결과를 얻을 수 있습니다. 콜론 변수, 세미콜론 종결자, USING 절, 마커 인터페이스만 잊지 않으면 첫 AMDP 도 어렵지 않습니다.
Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다.
AMDP(ABAP Managed Database Procedures) 는 ABAP 7.40 SP05 이상 + SAP HANA DB 환경에서 제공되는 표준 기능입니다. 마커 인터페이스 if_amdp_marker_hdb · 본문 헤더 BY DATABASE PROCEDURE FOR HDB · 언어 지정 LANGUAGE SQLSCRIPT · 객체 명시 USING 절은 SAP Help Portal 의 abenamdp 문서에 정의돼 있습니다. AMDP 본문은 반드시 Eclipse ABAP Development Tools(ADT) 에서 편집해야 하며 SAP GUI 의 SE24 Class Builder 에서는 시그니처만 보입니다. AMDP 안에서는 DDL(CREATE·ALTER·DROP) · 트랜잭션 제어(COMMIT·ROLLBACK) · SAP 버퍼링 활성 테이블 쓰기 · Select-Options 직접 전달이 제한됩니다. S/4HANA Cloud(ABAP Cloud / Steampunk) 환경에서는 Released API 만 사용 가능하므로 USING 절에 명시할 테이블이 Released 상태인지 확인이 필요합니다.