News

MANDATORY vs OPTIONAL — CDS Query View 변수 선언 #shorts #SAP #ABAP

▶ YouTube에서 보기

1. 이 글이 답하는 질문 — 왜 variableSequence가 필요한가

ABAP CDS Analytics Query View를 실제로 운영하다 보면, 사용자가 보고서를 실행할 때마다 회계연도, 회사코드, 부서코드 같은 값을 입력받아야 하는 상황이 매우 자주 발생합니다. 이때 화면에 어떤 입력 필드를 어떤 순서로 보여줄 것인지, 어떤 항목은 반드시 입력해야 하는지, 단일 값만 받을지 범위까지 받을지를 모델 단에서 미리 선언해 두지 않으면 분석 도구(예: Analysis for Office, Fiori Analytical List Page, SAP Analytics Cloud) 측에서 일관된 UX를 보장하기 어렵습니다.

이 글은 다음 세 가지 질문에 답합니다.

  • @AnalyticsDetails.query.variableSequence는 정확히 어떤 역할을 하며 왜 번호를 부여하는가?
  • MANDATORYOPTIONAL은 단순한 필수/선택 플래그가 아니라 쿼리 실행 시 어떤 동작 차이를 만드는가?
  • selectionTypeSINGLE, INTERVAL, MULTIPLE은 각각 어떤 입력 패턴에 매핑되는가?

2. 입력 변수란 무엇인가 — axis #FREE와의 관계

Analytics Query View에서 입력 변수(Input Variable)는 사용자가 쿼리를 실행하는 시점에 값을 주입할 수 있는 일종의 "동적 필터"입니다. 이전 4편에서 다룬 @AnalyticsDetails.query.axis는 차원을 ROW, COLUMN, FREE 중 어디에 둘지 결정하는 메타데이터였는데, 입력 변수는 보통 #FREE 축에 놓이는 차원과 결합해 "어떤 값을 기준으로 데이터를 잘라 볼 것인가"를 런타임에 정합니다.

즉 axis가 "지면 위 어디에 보여줄지"의 문제라면, 변수는 "어떤 값을 받아 필터링할지"의 문제입니다. 변수는 일반적으로 WHERE 절 또는 파라미터($parameters)와 결합해 동작하며, Analytics 런타임이 자동으로 입력 프롬프트(prompt) 화면을 생성해 줍니다.

비유하자면 axis는 "표의 행과 열 레이아웃"이고, 변수는 "표를 그리기 전 사용자에게 묻는 질문 카드"입니다. 카드의 순서, 필수 여부, 응답 형식이 모두 메타데이터로 정의됩니다.

3. variableSequence — 변수 표시 순서 지정

@AnalyticsDetails.query.variableSequence는 정수 값을 받아 입력 변수가 프롬프트 화면에 표시되는 순서를 결정합니다. 숫자가 작을수록 먼저 표시되며, 같은 쿼리 내에서 중복되지 않도록 부여하는 것이 일반적으로 권장됩니다.

예를 들어 회계연도를 가장 먼저 묻고, 그 다음에 회사코드, 마지막으로 부서코드를 묻고 싶다면 다음과 같이 선언합니다.

@AnalyticsDetails.query.variableSequence : 10
@Consumption.filter: { selectionType: #SINGLE, mandatory: true }
P_FiscalYear : fis_year_d,

@AnalyticsDetails.query.variableSequence : 20
@Consumption.filter: { selectionType: #MULTIPLE, mandatory: true }
P_CompanyCode : bukrs,

@AnalyticsDetails.query.variableSequence : 30
@Consumption.filter: { selectionType: #INTERVAL, mandatory: false }
P_PostingDate : budat

번호를 10, 20, 30 단위로 띄워두는 것은 실무에서 흔히 쓰이는 패턴인데, 나중에 새 변수가 추가되었을 때 기존 번호를 재정렬하지 않고 사이값(예: 15)을 끼워 넣을 수 있기 때문입니다. 순서가 명확하지 않으면 분석 도구마다 출력 순서가 달라져 사용자 혼란을 유발할 수 있으므로, 모든 입력 변수에 명시적으로 부여하는 것이 안전합니다.

4. MANDATORY vs OPTIONAL — 필수·선택 변수 선언

입력 변수의 필수 여부는 일반적으로 @Consumption.filter.mandatory 어노테이션 또는 파라미터의 mandatory 속성으로 제어합니다. 값이 true이면 사용자는 해당 변수에 값을 입력하지 않고는 쿼리를 실행할 수 없고, false이면 비워둔 채 실행 가능합니다.

4.1 MANDATORY 동작 방식

  • 프롬프트 화면에서 해당 입력 필드에 별표(*) 또는 굵은 라벨이 표시됩니다.
  • 값을 비운 채 "OK"를 누르면 런타임이 오류를 반환하고 쿼리가 실행되지 않습니다.
  • 대용량 팩트 테이블에 대한 무한정 풀스캔을 막는 안전장치로도 활용됩니다.

4.2 OPTIONAL 동작 방식

  • 비워두면 해당 변수는 WHERE 절에 포함되지 않으며 전체 데이터에 대해 집계가 일어날 수 있습니다.
  • 기본값(@Consumption.defaultValue)을 함께 지정해 두면, 사용자가 값을 입력하지 않아도 합리적인 디폴트로 동작합니다.
@AnalyticsDetails.query.variableSequence : 10
@Consumption.filter: { selectionType: #SINGLE, mandatory: true }
@Consumption.defaultValue: 'CURRENT_FISCAL_YEAR'
P_FiscalYear : fis_year_d,

실무에서는 성능에 큰 영향을 주는 시간 차원(회계연도, 회계기간 등)은 MANDATORY로 두고, 부가적인 필터(예: 상품군, 지역)는 OPTIONAL로 두는 패턴이 일반적입니다.

5. selectionType — SINGLE·INTERVAL·MULTIPLE 입력 방식

@Consumption.filter.selectionType은 사용자가 변수에 어떤 형태의 값을 입력할 수 있는지를 정의합니다. 세 가지 값을 가질 수 있습니다.

selectionType입력 방식대표 사용 사례
#SINGLE단일 값 하나만 입력회계연도, 통화코드처럼 하나로 고정되는 키
#INTERVALFrom-To 범위 입력전기일자, 회계기간 범위 조회
#MULTIPLE다중 값/범위/제외 조건 입력 (SELECT-OPTIONS 유사)여러 회사코드 동시 조회, 특정 부서 제외 조회

#MULTIPLE은 ABAP 클래식 보고서의 SELECT-OPTIONS와 가장 유사한 형태로, 등호/부등호/BETWEEN/NOT BETWEEN 같은 비교 연산을 사용자가 자유롭게 조합할 수 있어 분석 시나리오에서 가장 강력합니다. 다만 그만큼 백엔드 쿼리 복잡도도 증가하므로, 정말 다중 입력이 필요한 변수에만 쓰는 것이 권장됩니다.

6. 실전 예제 — FiscalYear·CompanyCode 변수 선언 전체 패턴

아래는 매출 분석용 Query View에 세 개의 입력 변수를 선언한 전체 예시입니다. 1편에서 4편까지 다룬 어노테이션들과 함께 어떻게 결합되는지 살펴봅니다.

@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Sales Analytics Query'
@Analytics.query: true
@OData.publish: true
@VDM.viewType: #CONSUMPTION

define view entity ZC_SalesAnalyticsQry
  with parameters
    @AnalyticsDetails.query.variableSequence : 10
    @Consumption.filter: { selectionType: #SINGLE, mandatory: true }
    @Consumption.defaultValue: 'CURRENT_FISCAL_YEAR'
    P_FiscalYear   : fis_year_d,

    @AnalyticsDetails.query.variableSequence : 20
    @Consumption.filter: { selectionType: #MULTIPLE, mandatory: true }
    P_CompanyCode  : bukrs,

    @AnalyticsDetails.query.variableSequence : 30
    @Consumption.filter: { selectionType: #INTERVAL, mandatory: false }
    P_PostingDate  : budat

  as select from ZI_SalesCube
{
  @AnalyticsDetails.query.axis: #ROWS
  @AnalyticsDetails.query.displayHierarchy: #ON
  CompanyCode,

  @AnalyticsDetails.query.axis: #ROWS
  Customer,

  @AnalyticsDetails.query.axis: #COLUMNS
  FiscalPeriod,

  @AnalyticsDetails.query.axis: #FREE
  ProductGroup,

  @DefaultAggregation: #SUM
  @Semantics.amount.currencyCode: 'Currency'
  NetAmount,

  Currency
}
where FiscalYear   =  $parameters.P_FiscalYear
  and CompanyCode  =  $parameters.P_CompanyCode
  and PostingDate  =  $parameters.P_PostingDate

핵심 포인트 정리.

  • variableSequence를 10, 20, 30으로 부여해 회계연도 → 회사코드 → 전기일자 순서로 프롬프트가 그려지도록 했습니다.
  • 회계연도는 SINGLE + mandatory: true로 풀스캔을 방지합니다.
  • 회사코드는 MULTIPLE로 여러 코드 또는 제외 조건을 동시 입력할 수 있게 했습니다.
  • 전기일자는 INTERVAL + mandatory: false로 범위 분석 시에만 선택적으로 활용합니다.
  • defaultValue로 기본값을 부여해 사용자가 매번 직접 입력하는 부담을 줄였습니다.

7. 흔한 실수와 디버깅 포인트

7.1 variableSequence 누락

일부 변수에만 번호를 부여하면 분석 도구별로 순서가 비결정적으로 변할 수 있습니다. 입력 변수가 두 개 이상이라면 전부 명시하는 것이 안전합니다.

7.2 MANDATORY인데 defaultValue가 없는 경우

필수로 두었지만 합리적 기본값이 없으면 사용자가 매번 값을 직접 입력해야 하므로 UX가 나빠집니다. 가능하면 시스템 변수(예: 현재 회계연도)나 사용자 파라미터 기반의 디폴트를 함께 정의하세요.

7.3 selectionType과 WHERE 절 불일치

#MULTIPLE로 선언했는데 WHERE 절에서 =로 비교하면 의도와 달리 단일 값처럼 동작하는 사례가 잦습니다. 다중 입력을 받으려면 IN $parameters.P_CompanyCode 형태 또는 Analytics 런타임이 처리하는 필터 어노테이션 경로를 활용하는 것이 일반적입니다.

7.4 INTERVAL 변수에 단일 값만 비교

구간 변수를 선언하고 =로 비교하면 From 값만 사용되어 결과가 어긋납니다. BETWEEN 또는 적절한 Analytics 필터 매핑을 사용해야 합니다.

7.5 활성화는 됐는데 프롬프트가 안 뜨는 경우

@Analytics.query: true가 빠져 있거나, Consumption View가 아닌 Cube/Dimension View에 변수를 선언했을 가능성이 높습니다. 입력 변수는 Query View 계층에서 선언하는 것이 일반적으로 권장됩니다.

7.6 변수명 충돌

파라미터 이름은 보통 P_ 접두사를 사용해 컬럼명과 구분합니다. 같은 이름이 컬럼과 파라미터에 동시에 존재하면 $parameters 경로로 명시적으로 접근해야 합니다.

8. 마치며 — AQ 기초 시리즈 5/5 마무리

지금까지 다섯 편에 걸쳐 ABAP CDS Analytics Query View의 기초를 살펴봤습니다. 1편에서 Query View가 무엇이며 왜 별도 계층으로 존재하는지, 2편에서 @Analytics.query로 쿼리 View를 활성화하는 방법, 3편에서 측정값과 차원의 의미론, 4편에서 axis로 행/열/자유 영역을 배치하는 방법, 그리고 이번 5편에서 사용자에게 값을 묻는 입력 변수 선언까지 다루었습니다.

다음 단계로는 다음 주제들을 함께 살펴볼 것을 권장합니다.

  • 계층(Hierarchy) 어노테이션: displayHierarchy, hierarchyInitialLevel, hierarchyNodeFor
  • 측정값 표현 제어: resultVisibility, totals, display
  • 조건부 강조 표시(Exception Aggregation, Threshold, Conditional Formatting)
  • SAP Analytics Cloud 또는 Fiori Analytical List Page에서의 소비 방법

입력 변수는 Query View의 사용성을 좌우하는 핵심 요소이므로, 단순히 작동시키는 것을 넘어 사용자 입장에서 "어떤 순서로, 어떤 형태로 묻는 것이 가장 자연스러운가"를 고민해 설계하는 것이 일반적으로 권장됩니다.

댓글 0

아직 댓글이 없습니다.