본문으로 건너뛰기
← 블로그로 돌아가기

이 글의 모듈: Integration Flow Helper

SAP CPI OData 수신기: 오타 없이 $select, $filter, $expand, $orderby 작성하기

SAP CPI OData 수신기의 쿼리 옵션 작성법: $select, $filter, $expand, $orderby, $top 예제, V2와 V4의 차이, HTTP 400을 일으키는 실수를 다룹니다.

SAP CPI OData 수신기: 오타 없이 $select, $filter, $expand, $orderby 작성하기

SAP CPI의 OData 수신기 어댑터는 Resource Path와 한 줄의 쿼리 옵션을 SAP S/4HANA API 같은 OData 서비스 호출로 바꿉니다. 쿼리 옵션은 어떤 필드, 어떤 행, 어떤 관련 엔터티가 반환될지를 결정하며, 속성 이름 하나만 잘못 써도 서비스가 호출을 거부합니다.

이 글에서는 예제와 함께 $select, $filter, $expand, $orderby를 하나씩 살펴보고, 많은 사람이 헷갈리는 OData V2와 V4의 차이, 그리고 이름을 정확하게 유지하는 방법을 설명합니다.

OData 수신기에서 쿼리 옵션을 쓰는 위치

어댑터의 Processing 탭에서 작업을 선택한 다음, Resource Path(호출할 엔터티 세트 또는 엔터티)와 Query Options(URL에서 ? 뒤에 오는 모든 것)를 설정합니다. 어댑터의 쿼리 마법사는 서비스 메타데이터로 이 둘을 만들 수 있으며, 그 메타데이터인 EDMX 파일을 iFlow 리소스에 저장합니다.

쿼리 옵션에는 Simple 표현식을 넣을 수 있으므로 값을 메시지에서 가져올 수 있습니다. 예: $filter=SoldToParty eq '${property.customerId}'. 다음 예제는 OData V2 서비스인 API_SALES_ORDER_SRV에서 판매 오더와 그 품목을 읽습니다.

Resource Path:  A_SalesOrder
Query Options:  $select=SalesOrder,SoldToParty,CreationDate,to_Item/SalesOrderItem,to_Item/Material
                &$expand=to_Item
                &$filter=SoldToParty eq '${property.customerId}' and CreationDate ge datetime'2026-01-01T00:00:00'
                &$orderby=CreationDate desc
                &$top=50

어댑터에서는 쿼리 옵션을 한 줄로 씁니다. 여기서는 읽기 쉽도록 나누었을 뿐입니다.

네 가지 옵션 하나씩 보기

옵션역할예
$select지정한 속성만 반환해 응답을 작게 유지$select=SalesOrder,SoldToParty
$filter조건에 맞는 행만 반환$filter=SalesOrderType eq 'OR'
$expand탐색 속성을 통해 관련 엔터티를 포함$expand=to_Item
$orderby행을 정렬(기본값은 오름차순)$orderby=CreationDate desc

$top과 $skip은 결과 수를 제한하고 페이지를 나눕니다. OData V2에서는 확장한 엔터티의 속성을 to_Item/Material처럼 경로로 선택하며, 그 탐색 속성도 $expand에 들어 있어야 합니다.

$filter에는 고유한 연산자가 있습니다. eq, ne, gt, ge, lt, le이며 and, or, not으로 조합합니다. 텍스트 값은 작은따옴표로 감싸고, 날짜는 서비스 버전이 요구하는 리터럴 형식으로 써야 합니다.

OData V2와 V4는 쓰는 방법이 다릅니다

OData 어댑터는 두 버전을 모두 지원하며, 많은 SAP API도 두 버전으로 제공됩니다. 한 버전의 쿼리를 다른 버전에 그대로 복사하는 것은 흔한 오류의 원인입니다.

OData V2:  $inlinecount=allpages
           $filter=substringof('Smith',CustomerName)
           $filter=CreationDate ge datetime'2026-01-01T00:00:00'

OData V4:  $count=true
           $filter=contains(CustomerName,'Smith')
           $filter=CreatedAt ge 2026-01-01T00:00:00Z
           $expand=_Item($select=Product,Quantity)
  • 행 개수 세기: V2는 $inlinecount=allpages, V4는 $count=true.
  • 텍스트 안에서 검색: V2는 substringof('Smith',CustomerName), V4는 contains(CustomerName,'Smith'). 인수 순서가 반대라는 점에 주의하세요.
  • 날짜: V2는 datetime'2026-01-01T00:00:00'로 쓰고, V4는 접두사 없이 값을 씁니다.
  • 확장한 속성: V2는 경로로 선택하고, V4는 $expand=_Item($select=Product,Quantity)처럼 expand 안에 옵션을 중첩합니다.

HTTP 400을 일으키는 오타

쿼리 옵션이 잘못되면 서비스는 보통 HTTP 400을 반환하고 해석하지 못한 부분을 알려 줍니다. 그 원인이 되는 실수는 거의 항상 같습니다.

  • 대소문자 오류: OData 이름은 대소문자를 구분하므로 soldToParty는 SoldToParty가 아닙니다.
  • 탐색 속성을 써야 할 곳에 엔터티 세트를 쓴 경우: $expand=to_Item 대신 $expand=A_SalesOrderItem.
  • 다른 엔터티에만, 또는 서비스의 다른 버전에만 있는 속성.
  • 텍스트 값을 감싸는 따옴표가 없거나, V2 날짜 리터럴을 V4 서비스에 보낸 경우.
  • 구분자 문제: 옵션은 &로 연결하고, 각 옵션 이름은 $로 시작합니다.

표현식에도 고유한 위험이 있습니다. ${property.customerId}가 비어 있으면 필터가 SoldToParty eq ''가 되어 오류 대신 조용히 0개의 행을 반환합니다. 이런 값을 읽는 방법은 Simple 표현식 글에서 설명합니다.

쿼리와 서비스를 일치시키기

  • 이름의 기준은 iFlow 리소스에 있는 EDMX로 삼고, 서비스가 바뀌면 갱신하세요.
  • 매핑하는 필드만 선택하세요. 응답이 작을수록 빠르고 Trace에서도 읽기 쉽습니다.
  • 대량 읽기에는 하나의 거대한 응답 대신 어댑터의 페이지 단위 처리 옵션을 사용하세요.
  • 실제 메시지가 넣을 값과 똑같은 값으로 쿼리를 한 번 테스트하세요.

OData 서비스가 아니라 REST API를 호출하나요? Postman과 OpenAPI에 관한 글에서 HTTP 수신기를 다룹니다.

Kitegra가 도와주는 방법

브라우저 확장 프로그램 Kitegra는 OData 수신기 채널을 위해 iFlow에 이미 들어 있는 EDMX를 읽습니다. 디자이너에서 그 EDMX를 바탕으로 Resource Path와 $select, $filter, $expand, $orderby에 쓸 속성 이름과 탐색 이름을 제안하므로, 이름을 직접 입력하지 않고 고르기만 하면 됩니다.

Lint 패널은 EDMX에 없는 OData 이름과 함께 닫히지 않은 ${, 아무 곳에서도 설정되지 않는 header나 속성을 표시합니다. 어떤 채널에서 제안이 나오지 않는다면 그 EDMX가 iFlow 리소스에 있는지 확인하세요. 확장 프로그램은 iFlow의 내용을 저장, 배포, 편집하지 않으며, tenant는 이름이 정해진 네 가지 작업 중 하나를 클릭할 때만 바뀝니다. 이 작업들은 끌 수 있습니다.

OData 서비스가 실제로 무엇을 응답했는지 확인하려면 메시지를 단계별로 트레이스하고 호출 후의 본문을 읽어 보세요.

Kitegra 계정이 없어도 모듈당 5개 iFlow에서 사용할 수 있습니다. Free 요금제는 50개, Starter는 100개, Pro는 300개까지 지원하며 Business는 제한이 없습니다. 요금제 비교하기.

다음 iFlow에서 사용해 보세요

Kitegra가 SAP Integration Suite 디자이너에서 무엇을 하는지 읽어 보거나, Kitegra의 다른 Chrome 확장 프로그램과 함께 살펴보세요.

자주 묻는 질문

SAP CPI OData 어댑터에서 $filter는 어디에 쓰나요?

수신기 채널 Processing 탭의 Query Options 필드에 다른 옵션과 함께 씁니다. 예: $select=SalesOrder&$filter=SalesOrderType eq 'OR'.

OData 필터 안에서 header나 속성을 사용할 수 있나요?

네. 쿼리 옵션은 Simple 표현식을 허용합니다. 예: $filter=SoldToParty eq '${property.customerId}'. 값이 비어 있으면 필터가 행을 하나도 반환하지 않으므로 미리 확인하세요.

$inlinecount와 $count의 차이는 무엇인가요?

$inlinecount=allpages는 OData V2용이고, $count=true는 OData V4의 방식입니다. 둘 다 결과와 함께 조건에 맞는 전체 행 수를 반환합니다.

substringof가 내 서비스에서 실패하는 이유는 무엇인가요?

substringof는 OData V2에만 있습니다. OData V4 서비스는 contains(Property,'text')를 사용하며, 인수 순서가 반대입니다.

서비스가 HTTP 400을 반환하는 이유는 무엇인가요?

대개 쿼리의 이름이 해당 엔터티에 존재하지 않기 때문입니다. 원인은 흔히 대소문자 오류, 탐색 속성과 엔터티 세트의 혼동, 또는 다른 OData 버전의 문법 사용입니다.

SAP CPI는 OData 메타데이터를 어디에 저장하나요?

쿼리 마법사가 서비스의 EDMX 파일을 iFlow 리소스에 저장합니다. 이름이 계속 정확하도록 서비스가 바뀌면 갱신하세요.

디자이너를 떠나지 않고 iFlow 작업하기

Kitegra을 Chrome 또는 Microsoft Edge에 추가하세요. 계정 없이 무료로 시작할 수 있습니다.