

# SAP OData 작업 생성
<a name="sap-odata-creating-job"></a>

[AWS Glue Studio를 사용하여 시각적 ETL 작업 구축](https://docs.aws.amazon.com/glue/latest/dg/author-job-glue.html) 참조

# 운영 데이터 프로비저닝(ODP) 소스
<a name="sap-odata-operational-data-provisioning-sources"></a>

운영 데이터 프로비저닝(ODP)은 다양한 대상 애플리케이션의 데이터 추출 및 복제를 지원하는 데 사용할 수 있는 기술 인프라를 제공하며 이러한 시나리오에서 델타 메커니즘을 지원합니다. 델타 절차의 경우 소스(ODP 공급자)의 데이터는 업데이트 프로세스를 사용하여 델타 대기열(운영 델타 대기열 - ODQ)에 자동으로 기록되거나 추출기 인터페이스를 사용하여 델타 대기열에 전달됩니다. ODP 공급자는 DataSource(추출기), ABAP Core Data Services 뷰(ABAP CDS 뷰), SAP BW 또는 SAP BW/4HANA, SAP Landscape Transformation Replication Server(SLT) 및 SAP HANA 정보 뷰(계산 뷰)일 수 있습니다. 대상 애플리케이션(ODQ '구독자' 또는 보다 일반적으로 'ODP 소비자'라고 함)은 델타 대기열에서 데이터를 검색하고 데이터를 계속 처리합니다.

## 전체 로드
<a name="sap-odata-full-load"></a>

SAP OData 및 ODP 엔터티의 컨텍스트에서 **전체 로드**는 단일 작업으로 ODP 엔터티에서 사용 가능한 모든 데이터를 추출하는 프로세스를 나타냅니다. 이 작업은 소스 시스템에서 전체 데이터세트를 검색하여 대상 시스템에 엔터티 데이터의 포괄적인 최신 사본이 로드되도록 보장합니다. 전체 로드는 일반적으로 소스가 증분 로드를 지원하지 않는 경우 또는 대상 시스템의 새로 고침이 필요한 경우에 사용됩니다.

**예제**

DynamicFrame을 생성할 때 `ENABLE_CDC` 플래그를 false로 명시적으로 설정할 수 있습니다. 참고: `ENABLE_CDC`는 기본적으로 false입니다. 델타 대기열을 초기화하지 않으려는 경우 이 플래그를 보내거나 true로 설정할 필요가 없습니다. 이 플래그를 true로 설정하지 않으면 전체 로드 추출이 수행됩니다.

```
sapodata_df = glueContext.create_dynamic_frame.from_options(
    connection_type="SAPOData",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "ENABLE_CDC": "false"
    }, transformation_ctx=key)
```

## 증분 로드
<a name="sap-odata-incremental-load"></a>

ODP(운영 데이터 프로비저닝) 엔터티의 컨텍스트에서 **증분 로드**는 마지막 데이터 추출 이후 소스 시스템에서 새 데이터 또는 변경된 데이터(델타)만 추출하여 이미 처리된 레코드를 사전 처리하지 않도록 합니다. 이 접근 방식은 효율성을 크게 개선하고, 데이터 전송 볼륨을 줄이고, 성능을 향상하고, 시스템 간의 효율적인 동기화를 보장하고, 처리 시간을 최소화합니다. 특히 자주 변경되는 대규모 데이터세트의 경우 효과적입니다.

# 델타 토큰 기반 증분 전송
<a name="sap-odata-incremental-transfers"></a>

이를 지원하는 ODP 지원 엔터티에 대해 변경 데이터 캡처(CDC)를 사용하여 증분 전송을 활성화하려면 다음 단계를 따르세요.

1. 스크립트 모드에서 증분 전송 작업을 생성합니다.

1. DataFrame 또는 Glue DynamicFrame을 생성할 때 `"ENABLE_CDC": "True"` 옵션을 전달해야 합니다. 이 옵션을 사용하면 SAP로부터 변경된 데이터의 후속 검색에 사용할 수 있는 델타 토큰을 수신할 수 있습니다.

델타 토큰은 DELTA\$1TOKEN 열의 마지막 데이터프레임 행에 있습니다. 이 토큰을 후속 직접 호출에서 커넥터 옵션으로 사용하여 다음 데이터세트를 증분 검색할 수 있습니다.

**예제**
+ DynamicFrame을 생성할 때 `ENABLE_CDC` 플래그를 `true`로 설정합니다. 참고: `ENABLE_CDC`는 기본적으로 `false`입니다. 델타 대기열을 초기화하지 않으려는 경우 이 플래그를 보내거나 true로 설정할 필요가 없습니다. 이 플래그를 true로 설정하지 않으면 전체 로드 추출이 수행됩니다.

  ```
  sapodata_df = glueContext.create_dynamic_frame.from_options(
      connection_type="SAPOData",
      connection_options={
          "connectionName": "connectionName",
          "ENTITY_NAME": "entityName",
          "ENABLE_CDC": "true"
      }, transformation_ctx=key)
  
  # Extract the delta token from the last row of the DELTA_TOKEN column
  delta_token_1 = your_logic_to_extract_delta_token(sapodata_df) # e.g., D20241029164449_000370000
  ```
+ 새 이벤트를 검색하는 옵션으로 추출된 델타 토큰을 전달할 수 있습니다.

  ```
  sapodata_df_2 = glueContext.create_dynamic_frame.from_options(
      connection_type="SAPOData",
      connection_options={
          "connectionName": "connectionName",
          "ENTITY_NAME": "entityName",
          // passing the delta token retrieved in the last run
          "DELTA_TOKEN": delta_token_1
      } , transformation_ctx=key)
  
  # Extract the new delta token for the next run
  delta_token_2 = your_logic_to_extract_delta_token(sapodata_df_2)
  ```

`DELTA_TOKEN`이 있는 마지막 레코드는 소스의 트랜잭션 레코드가 아니며 델타 토큰 값을 전달할 목적으로만 존재합니다.

`DELTA_TOKEN` 외에도 데이터프레임의 각 행에서 다음 필드가 반환됩니다.
+ **GLUE\$1FETCH\$1SQ**: EPOC 타임스탬프에서 생성된 시퀀스 필드(레코드가 수신된 순서에 따름)이며 각 레코드에 대해 고유합니다. 소스 시스템에서 변경 순서를 알거나 설정해야 하는 경우 사용할 수 있습니다. 이 필드는 ODP 지원 엔터티에만 표시됩니다.
+ **DML\$1STATUS**: 소스에서 새로 삽입된 레코드 및 업데이트된 레코드에 대해서는 `UPDATED`, 소스에서 삭제된 레코드에 대해서는 `DELETED`를 표시합니다.

상태를 관리하고 델타 토큰을 재사용하여 예제를 통해 변경된 레코드를 검색하는 방법에 대한 자세한 내용은 [SAP OData 상태 관리 스크립트 사용](sap-odata-state-management-script.md) 섹션을 참조하세요.

## 델타 토큰 무효화
<a name="sap-odata-invalidation"></a>

델타 토큰은 서비스 컬렉션 및 사용자와 연결됩니다. 동일한 서비스 컬렉션 및 사용자에 대해 `“ENABLE_CDC” : “true”`를 사용한 새 초기 풀이 시작되는 경우 이전 초기화의 결과로 발급된 이전의 모든 델타 토큰은 SAP OData 서비스에서 무효화됩니다. 만료된 델타 토큰으로 커넥터를 간접적으로 호출하면 예외가 발생합니다.

`Could not open data access via extraction API RODPS_REPL_ODP_OPEN` 

# OData 서비스(비ODP 소스)
<a name="sap-odata-non-odp-services"></a>

## 전체 로드
<a name="sap-odata-non-odp-full-load"></a>

비 ODP(운영 데이터 프로비저닝) 시스템의 경우 **전체 로드**는 소스 시스템에서 전체 데이터세트를 추출하여 대상 시스템에 로드합니다. 비 ODP 시스템은 본질적으로 델타와 같은 고급 데이터 추출 메커니즘을 지원하지 않으므로 프로세스는 간단하지만 데이터 크기에 따라 리소스 집약적일 수 있습니다.

## 증분 로드
<a name="sap-odata-non-odp-incremental-load"></a>

**ODP(운영 데이터 프로비저닝)**를 지원하지 않는 시스템 또는 엔터티의 경우 변경 사항을 추적하고 추출하는 타임스탬프 기반 메커니즘을 구현하여 증분 데이터 전송을 수동으로 관리할 수 있습니다.

**타임스탬프 기반 증분 전송**

비 ODP 지원 엔터티(또는 ENABLE\$1CDC 플래그를 사용하지 않는 ODP 지원 엔터티)의 경우 커넥터에서 `filteringExpression` 옵션을 사용하여 데이터를 검색하려는 `datetime` 간격을 표시할 수 있습니다. 이 방법은 각 레코드가 마지막으로 생성/수정된 시점을 나타내는 데이터의 타임스탬프 필드에 의존합니다.

**예제**

2024-01-01T00:00:00.000 이후 변경된 레코드 검색

```
sapodata_df = glueContext.create_dynamic_frame.from_options(
    connection_type="SAPOData",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "filteringExpression": "LastChangeDateTime >= 2024-01-01T00:00:00.000"
    }, transformation_ctx=key)
```

참고: 이 예제에서 `LastChangeDateTime`은 각 레코드가 마지막으로 수정된 시간을 나타내는 필드입니다. 실제 필드 이름은 특정 SAP OData 엔터티에 따라 다를 수 있습니다.

후속 실행에서 새 데이터의 새 하위 세트를 가져오려면 `filteringExpression`을 새 타임스탬프로 업데이트해야 합니다. 일반적으로 이전에 검색된 데이터의 최대 타임스탬프 값입니다.

**예제**

```
max_timestamp = get_max_timestamp(sapodata_df)  # Function to get the max timestamp from the previous run
next_filtering_expression = f"LastChangeDateTime > {max_timestamp}"

# Use this next_filtering_expression in your next run
```

다음 섹션에서는 이러한 타임스탬프 기반 증분 전송을 관리하기 위한 자동화된 접근 방식을 제공합니다. 이 경우 실행 간에 필터링 표현식을 수동으로 업데이트하지 않아도 됩니다.