개요 및 이 글에서 얻어갈 것
CDS(Core Data Services) 뷰를 여러 화면과 리포트에서 재사용하다 보면, 같은 로직인데 필터 값만 다른 뷰를 여러 개 복제하게 되는 상황이 반복됩니다. 예를 들어 "특정 회사코드의 판매오더"를 조회하는 뷰와 "특정 통화의 판매오더"를 조회하는 뷰를 매번 새로 만드는 식입니다. CDS Parameter는 이 문제를 해결하기 위해 뷰 정의 시점이 아닌 실행 시점에 필터 값을 주입할 수 있게 해 주는 기능입니다. 이 글에서는 다음을 다룹니다.
- 정적 WHERE 절과 파라미터 기반 동적 필터의 구조적 차이
DEFINE VIEW ... WITH PARAMETERS문법과 타입 선언 규칙$parameters를 이용한 WHERE 절 참조 방법- 판매오더(SalesOrder) 조회 뷰를 파라미터화하는 실전 예제 3단계
- ABAP OpenSQL과 Fiori Elements에서 파라미터를 전달하는 방법
- 기본값(DEFAULT) 설정 및 실무에서 자주 발생하는 트러블슈팅
사전에 알고 있으면 좋은 것
이 글은 CDS View의 기본 구조(@AbapCatalog.sqlViewName, SELECT FROM, ASSOCIATION)를 이미 접해 본 개발자를 대상으로 합니다. ABAP Data Dictionary의 기본 타입(abap.char, abap.numc, abap.dec)을 알고 있으면 파라미터 타입 선언 부분이 자연스럽게 읽힙니다. Eclipse ADT(ABAP Development Tools) 환경에서 CDS 뷰를 Activate하고 Data Preview로 결과를 확인할 수 있어야 실습이 원활합니다.
환경 및 버전 준비물
CDS Parameter는 SAP NetWeaver AS ABAP 7.40 SP05부터 지원되었으며, 이 글의 문법은 7.50 이상 및 ABAP Platform 2022, S/4HANA 2023을 기준으로 검증되었습니다. 다음 환경을 권장합니다.
- ABAP 시스템: NetWeaver 7.50 이상 또는 S/4HANA 1909+ (ABAP Cloud도 동일 문법 지원)
- 개발 도구: Eclipse 2023-06 이상 + ADT 3.36 이상
- 데이터베이스: SAP HANA (파라미터가 HANA CDS의 Analytic Privilege와 함께 사용 시 최적)
- 권한:
S_DEVELOP(Object Type DDLS),S_TCODE(SE80/ADT) - 테스트 데이터: EPM 데모 데이터(
SNWD_SO,SNWD_SO_I) 또는 자체 판매오더 테이블
ABAP Cloud(Steampunk)에서도 동일한 문법이 사용되지만, RAP(RESTful Application Programming) 모델의 Behavior Definition과 결합할 때 파라미터 뷰는 read-only Custom Entity 또는 Analytical Query 용도로 주로 활용됩니다.
핵심 개념 정리
일반 CDS 뷰의 WHERE 절은 정의 시점에 값이 고정됩니다. 예를 들어 WHERE company_code = '1000'이라고 쓰면 이 뷰는 영원히 회사코드 1000의 데이터만 반환합니다. 다른 회사코드가 필요하면 뷰를 복제하거나, 뷰를 그대로 두고 호출하는 쪽에서 다시 WHERE로 필터해야 하는데, 후자는 서버로 불필요하게 큰 데이터셋을 밀어 올린 뒤 애플리케이션 계층에서 걸러내는 비효율을 유발합니다.
CDS Parameter는 이 문제를 "함수의 인자"처럼 접근합니다. 뷰를 템플릿으로 정의해 두고, 호출 시점에 값을 주입해 DB 엔진 레벨에서 필터가 적용된 상태로 실행되도록 합니다. HANA 관점에서 파라미터는 Calculation View의 Input Parameter와 개념적으로 매우 유사하며, 실제로 CDS 파라미터는 activation 시 HANA로 push-down됩니다.
구조를 도식화하면 다음과 같습니다.
정적 뷰: [뷰 정의: WHERE bukrs='1000'] → SELECT * FROM view → 항상 1000의 결과
파라미터 뷰: [뷰 정의: WHERE bukrs=$parameters.p_bukrs] → SELECT * FROM view( p_bukrs => '2000' ) → 호출마다 다른 결과
비유하자면, 정적 뷰가 "이미 요리가 완성된 도시락"이라면 파라미터 뷰는 "주문받은 재료로 그때그때 조리하는 오더메이드 메뉴"입니다. 도시락은 빠르지만 선택지가 없고, 오더메이드는 선택지가 많지만 조리 파라미터를 어떻게 설계했는지가 성능과 재사용성을 좌우합니다.
CDS 파라미터는 다음 특성을 가집니다.
- 필수(Mandatory): 파라미터가 선언되면 호출 시 반드시 값을 전달해야 함 (DEFAULT 지정 예외)
- 스칼라 값: 리스트나 범위(BETWEEN)는 직접 지원하지 않음 (우회 필요)
- 타입 안전: DDIC 데이터 요소 또는 built-in 타입으로 명시 선언
- 참조 방식: 뷰 본문 어디서든
$parameters.파라미터명으로 참조
단계별 실전 예제
1단계 — 회사코드 하나로 필터링하는 기본 파라미터 뷰
가장 단순한 형태로, 회사코드(BUKRS)를 파라미터로 받아 판매오더 헤더를 조회하는 뷰를 만듭니다.
@AbapCatalog.sqlViewName: 'ZSOHDR_PARAM'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Sales Order Header by Company Code'
define view ZC_SalesOrderByCompany
with parameters
p_company_code : bukrs
as select from vbak
{
key vbeln as SalesOrderId,
erdat as CreatedDate,
auart as OrderType,
bukrs_vf as CompanyCode,
netwr as NetAmount,
waerk as Currency
}
where
bukrs_vf = $parameters.p_company_code
포인트는 세 가지입니다. 첫째, with parameters 절이 SELECT 앞에 위치합니다. 둘째, 파라미터 타입 bukrs는 DDIC 데이터 요소를 그대로 참조합니다(abap.char(4)처럼 built-in도 가능). 셋째, WHERE 절에서 $parameters.p_company_code로 값을 꺼내 씁니다. Data Preview 실행 시 Eclipse가 파라미터 입력 창을 자동으로 띄웁니다.
2단계 — 실무 시나리오: 여러 파라미터 조합 + 기본값 + 로깅
실무에서는 회사코드 하나로 끝나지 않습니다. 통화, 기간, 최소 금액을 조합해서 조회하고, 일부 파라미터는 기본값을 주어 호출자의 부담을 줄이는 것이 일반적입니다.
@AbapCatalog.sqlViewName: 'ZSOHDR_MPARAM'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Sales Order Header - Multi Filter'
define view ZC_SalesOrderFiltered
with parameters
p_company_code : bukrs,
p_currency : waers,
p_date_from : erdat,
p_date_to : erdat,
p_min_amount : netwr
as select from vbak
{
key vbeln as SalesOrderId,
erdat as CreatedDate,
bukrs_vf as CompanyCode,
waerk as Currency,
netwr as NetAmount,
case
when netwr >= 100000 then 'HIGH'
when netwr >= 10000 then 'MID'
else 'LOW'
end as AmountTier,
$parameters.p_company_code as FilterCompany,
$parameters.p_min_amount as FilterThreshold
}
where
bukrs_vf = $parameters.p_company_code
and waerk = $parameters.p_currency
and erdat >= $parameters.p_date_from
and erdat <= $parameters.p_date_to
and netwr >= $parameters.p_min_amount
주의할 점은 파라미터는 SELECT 리스트에서도 그대로 노출할 수 있다는 것입니다. 위 예제의 FilterCompany, FilterThreshold처럼 파라미터 값을 결과 컬럼에 포함하면, 이후 상위 뷰에서 감사 로그(어떤 조건으로 조회되었는지)를 남기기 좋습니다. 기본값 처리는 CDS 문법상 파라미터 선언부에서 직접 default 키워드가 지원되지 않는 릴리스가 많기 때문에, 실무에서는 호출 측(ABAP 또는 UI Annotation)에서 기본값을 명시하는 패턴을 씁니다. 이는 아래 3단계에서 다룹니다.
3단계 — 프로덕션: ABAP 호출, 성능 튜닝, 권한 통합
파라미터 뷰를 ABAP OpenSQL에서 호출할 때는 특별한 문법을 씁니다.
DATA: lt_orders TYPE STANDARD TABLE OF zc_salesorderfiltered,
lv_from TYPE erdat,
lv_to TYPE erdat.
lv_from = '20260101'.
lv_to = '20260630'.
SELECT SalesOrderId, CreatedDate, CompanyCode, NetAmount, AmountTier
FROM zc_salesorderfiltered( p_company_code = '1000',
p_currency = 'EUR',
p_date_from = @lv_from,
p_date_to = @lv_to,
p_min_amount = '5000.00' )
WHERE AmountTier = 'HIGH'
ORDER BY NetAmount DESCENDING
INTO TABLE @lt_orders
UP TO 100 ROWS.
IF sy-subrc = 0.
cl_demo_output=>display( lt_orders ).
ELSE.
MESSAGE |No orders matched filter set| TYPE 'I'.
ENDIF.
프로덕션에서 챙길 세 가지 요소입니다.
- 성능: 파라미터로 걸린 필드가 인덱스(또는 HANA 컬럼 스토어 통계)에 잡혀 있어야 push-down이 효과를 봅니다.
bukrs_vf,erdat는 보통 판매오더 테이블에서 인덱스가 존재합니다.SQL Trace(ST05)로 실제 실행 계획을 확인하세요. - 테스트: 파라미터 뷰는
CL_OSQL_TEST_ENVIRONMENT를 이용해 단위 테스트 시 목(mock) 데이터로 주입 가능합니다. 파라미터 값 경계(빈 값, 미래 날짜, 음수 금액)를 반드시 검증합니다. - 보안:
@AccessControl.authorizationCheck: #CHECK와 함께 별도DEFINE ROLE(DCL)을 두어 파라미터로 넘어온 회사코드에 대한 사용자 권한을 검증합니다. 파라미터가 있다고 해서 권한 체크가 우회되지 않도록 DCL에서$parameters를 참조할 수도 있습니다.
Fiori Elements나 Analytical Query로 노출할 때는 UI Annotation에서 다음처럼 기본값을 지정합니다.
@Consumption.defaultValue: '1000'
p_company_code : bukrs,
@Consumption.defaultValue: 'EUR'
p_currency : waers,
자주 걸리는 함정과 FAQ
Q1. "Parameter P_XXX is mandatory" 에러가 뜹니다. 파라미터 뷰를 다른 뷰의 SELECT FROM 절에서 참조하는데 값을 전달하지 않은 경우입니다. 상위 뷰에서 select from ZC_SalesOrderFiltered( p_company_code: :p_company_code, ... )처럼 세미콜론이 아니라 콜론으로 파라미터를 매핑해야 합니다. 상위 뷰도 동일한 파라미터를 선언해 두고 그대로 전달하는 패턴이 일반적입니다.
Q2. 파라미터에 SELECT-OPTIONS처럼 범위를 넘기고 싶습니다. CDS 파라미터는 스칼라이므로 IN이나 BETWEEN을 직접 받을 수 없습니다. 우회책은 두 개의 파라미터(from/to)를 두거나, Table Function(AMDP)으로 감싸 배열을 받거나, 상위 계층(ABAP/RAP)에서 필터를 조합하는 것입니다.
Q3. ABAP에서 값을 넘길 때 타입 불일치 덤프가 납니다. 파라미터 타입은 데이터 요소로 선언되어 있으므로, ABAP 변수 타입도 정확히 맞춰야 합니다. 리터럴을 넘길 때 문자열이면 홑따옴표로, 숫자면 홑따옴표 없이 넘기되 PACKED 타입은 '5000.00'처럼 홑따옴표 안에 넣는 것이 안전합니다.
Q4. Data Preview에서만 되고 ABAP에서는 안 됩니다. 이름 대소문자 문제일 가능성이 큽니다. ABAP OpenSQL에서 파라미터 이름은 CDS에서 선언한 그대로 사용해야 하며, 소문자 표기를 지키는 것을 권장합니다. 또한 뷰가 아직 재활성화되지 않았거나 sqlViewName이 바뀌었을 수 있으니 확인이 필요합니다.
Q5. 파라미터가 성능 개선에 도움이 안 됩니다. 파라미터가 걸린 컬럼이 낮은 카디널리티(선택도가 나쁨)이거나, 상위 뷰에서 파라미터 push-down이 끊긴 경우입니다. HANA의 EXPLAIN PLAN으로 필터가 최하위 스캔 단계까지 도달했는지 확인하세요.
확장해서 공부하면 좋은 주제
파라미터 뷰를 익혔다면 다음 주제로 확장하는 것을 권장합니다.
- Analytical Query(@Analytics.query): Multi-dimensional 리포트에서 파라미터를 필터 바로 노출
- Table Function + AMDP: 파라미터로 배열/구조체를 받아야 할 때 HANA SQLScript로 확장
- RAP(Managed BO)에서 Value Help 파라미터: 검색 헬프를 파라미터 뷰로 구성
- DCL(Data Control Language)에서
$parameters를 참조한 세션 컨텍스트 기반 권한 제어 - ABAP Cloud Custom CDS View에서 released API로 파라미터 뷰를 노출할 때의 제약
더 읽어볼 링크
- SAP Help — CDS DDL: DEFINE VIEW, PARAMETERS
- SAP Help — Input Parameters in CDS Views
- SAP Help — ABAP CDS Reference (Parameter Passing)
- SAP Community Blog — CDS View with Input Parameters (재구성 예제)
- SAP Blogs — ABAP CDS View 태그 모음
- SAP Help — S/4HANA Cloud ABAP Development
- SAP Developers — ADT 설치 및 초기 설정
댓글 0
아직 댓글이 없습니다.