

# Google Analytics 4에 연결
<a name="connecting-to-googleanalytics"></a>

 Google Analytics 4는 앱 및 웹사이트에서 방문자 상호 작용에 대한 지표를 추적 및 보고하는 분석 서비스입니다. 이러한 지표에는 페이지 조회, 활성 사용자 및 이벤트가 포함됩니다. Google Analytics 4 사용자인 경우 Google Analytics 4 계정에 AWS Glue를 연결할 수 있습니다. Google Analytics 4를 ETL 작업에서의 데이터 소스로 사용할 수 있습니다. 이러한 작업을 실행하여 Google Analytics 4에서 AWS 서비스 또는 기타 지원되는 애플리케이션으로 데이터를 전송합니다.

**Topics**
+ [Google Analytics 4에 대한 AWS Glue 지원](googleanalytics-support.md)
+ [연결을 생성하고 사용하기 위한 API 작업이 포함된 정책](googleanalytics-configuring-iam-permissions.md)
+ [Google Analytics 4 구성](googleanalytics-configuring.md)
+ [Google Analytics 4 연결 구성](googleanalytics-configuring-connections.md)
+ [Google Analytics 4 엔터티에서 읽기](googleanalytics-reading-from-entities.md)
+ [Google Analytics 4 연결 옵션](googleanalytics-connection-options.md)
+ [Google Analytics 4 계정 생성](googleanalytics-create-account.md)
+ [클라이언트 앱 및 OAuth 2.0 자격 증명을 생성하는 단계](googleanalytics-client-app-oauth-credentials.md)
+ [제한 사항 및 고려 사항](googleanalytics-connector-limitations.md)

# Google Analytics 4에 대한 AWS Glue 지원
<a name="googleanalytics-support"></a>

AWS Glue에서는 다음과 같이 Google Analytics 4를 지원합니다.

**소스로 지원되나요?**  
예. AWS Glue ETL 작업을 사용하여 Google Analytics 4에서 데이터를 쿼리할 수 있습니다.

**대상으로서 지원되나요?**  
아니요.

**지원되는 Google Analytics4 API 버전**  
 v1 베타.

# 연결을 생성하고 사용하기 위한 API 작업이 포함된 정책
<a name="googleanalytics-configuring-iam-permissions"></a>

 다음 샘플 정책에서는 연결을 생성하고 사용하는 데 필요한 AWS 권한을 설명합니다. 새 역할을 생성하는 경우 다음을 포함하는 정책을 생성합니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:ListConnectionTypes",
        "glue:DescribeConnectionType",
        "glue:RefreshOAuth2Tokens",
        "glue:ListEntities",
        "glue:DescribeEntity"
      ],
      "Resource": "*"
    }
  ]
}
```

------

아래 관리형 IAM 정책을 사용하여 다음에 대한 액세스를 허용할 수 있습니다.
+  [AWSGlueServiceRole](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole) – 다양한 AWS Glue 프로세스를 대신 실행하는 데 필요한 리소스에 대한 액세스 권한을 부여합니다. 이러한 리소스에는 AWS Glue, Amazon S3, IAM, CloudWatch Logs 및 Amazon EC2가 포함됩니다. 이 정책에 지정된 리소스의 이름 변환을 따르고자 한다면 AWS Glue 절차는 필요한 권한을 소유합니다. 이 정책은 크롤러, 작업 및 개발 엔드포인트를 정의할 때 지정된 역할에 일반적으로 추가됩니다.
+  [AWSGlueConsoleFullAccess](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AWSGlueConsoleFullAccess) - 정책이 연결된 자격 증명이 AWS Management Console을 사용하는 경우 AWS Glue 리소스에 대한 전체 액세스 권한을 부여합니다. 이 정책에 지정된 리소스의 이름 변환을 따르면 사용자는 콘솔 전체 용량을 소유합니다. 이 정책은 보통 AWS Glue 콘솔의 사용자에게 해당됩니다.

# Google Analytics 4 구성
<a name="googleanalytics-configuring"></a>

AWS Glue를 사용하여 Google Analytics 4에서 전송하려면 먼저 다음 요구 사항을 충족해야 합니다.

## 최소 요구 사항
<a name="googleanalytics-configuring-min-requirements"></a>
+  전송하려는 데이터를 수집하는 데이터 스트림을 하나 이상 포함하는 Google Analytics 계정이 있습니다.
+  Google Cloud Platform 관리자 계정을 만들고 Google Cloud 프로젝트를 생성했습니다.
+  Google Cloud 프로젝트에서 다음 API를 활성화했습니다.
  +  Google Analytics API 
  +  Google Analytics 관리 API 
  +  Google Analytics 데이터 API 
+  Google Cloud 프로젝트에서 외부 사용자를 위한 OAuth 동의 화면을 구성했습니다. OAuth 동의 화면에 대한 자세한 내용은 Google Cloud Platform Console Help의 [Setting up your OAuth consent screen](https://support.google.com/cloud/answer/10311615#)을 참조하세요.
+  Google Cloud 프로젝트에서 OAuth 2.0 클라이언트 ID를 구성했습니다. 자세한 내용은 [Setting up OAuth 2.0](https://support.google.com/cloud/answer/6158849?hl=en#zippy=)을 참조하세요.

 이러한 요구 사항을 충족하면 Google Analytics 4 계정에 AWS Glue를 연결할 준비가 된 것입니다.

# Google Analytics 4 연결 구성
<a name="googleanalytics-configuring-connections"></a>

Google Sheet 연결을 구성하는 방법:

1.  AWS Secrets Manager에서 다음 세부 정보로 보안 암호를 생성하세요. AWS Glue에서 각 연결에 대한 보안 암호를 생성해야 합니다.

   1.  AuthorizationCode 권한 부여 유형의 경우: 
      +  고객 관리형 연결된 앱의 경우 - 보안 암호는 키 역할을 하는 `USER_MANAGED_CLIENT_APPLICATION_CLIENT_SECRET`과 함께 연결된 앱 소비자 보안 암호를 포함해야 합니다.

1. AWS Glue Glue Studio의 **데이터 연결**에서 아래 단계에 따라 연결을 생성하세요.

   1. **연결 유형**을 선택할 때 Google Analytics 4를 선택합니다.

   1. 연결하려는 Google Analytics 4의 `INSTANCE_URL`을 제공합니다.

   1.  다음 작업에 대한 권한이 있고 AWS Glue에서 수임할 수 있는 IAM 역할을 선택하세요.

------
#### [ JSON ]

****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "secretsmanager:DescribeSecret",
              "secretsmanager:GetSecretValue",
              "secretsmanager:PutSecretValue",
              "ec2:CreateNetworkInterface",
              "ec2:DescribeNetworkInterfaces",
              "ec2:DeleteNetworkInterface"
            ],
            "Resource": "*"
          }
        ]
      }
      ```

------

   1.  토큰을 넣기 위해 AWS Glue에서 이 연결에 사용할 `secretName`을 선택합니다.

   1.  네트워크를 사용하려는 경우 네트워크 옵션을 선택합니다.

1.  AWS Glue 작업 권한과 연결된 IAM 역할에 `secretName`을 읽을 수 있는 권한을 부여합니다.

 `AUTHORIZATION_CODE` 권한 부여 유형입니다.

 이 권한 부여 유형은 사용자를 인증하기 위해 사용자를 서드파티 권한 부여 서버로 리디렉션하는 방식에 의존하므로 '3각' OAuth로 간주됩니다. AWS Glue 콘솔을 통해 연결을 생성할 때 사용됩니다. AWS Glue 콘솔은 사용자를 Google Analytics 4로 리디렉션합니다. 사용자가 로그인하고 Google Analytics 4 인스턴스에 액세스하도록 요청된 권한을 AWS Glue에 허용해야 합니다.

 사용자는 여전히 AWS Glue 콘솔을 통해 연결을 생성할 때에도 Google Analytics 4에서 자체 연결된 앱을 생성하고 자체 클라이언트 ID와 클라이언트 보안 암호를 제공하기로 선택할 수 있습니다. 이 시나리오에서는 여전히 Google Analytics 4로 리디렉션되어 로그인하고 리소스에 액세스할 수 있는 권한을 AWS Glue에 부여합니다.

 이 권한 부여 유형은 새로 고침 토큰과 액세스 토큰을 생성합니다. 액세스 토큰은 수명이 짧으며 새로 고침 토큰을 사용하여 사용자 상호 작용 없이 자동으로 새로 고칠 수 있습니다.

 자세한 내용은 [Using Auth 2.0 to Access Google APIs](https://developers.google.com/identity/protocols/oauth2) 섹션을 참조하세요.

# Google Analytics 4 엔터티에서 읽기
<a name="googleanalytics-reading-from-entities"></a>

 **사전 조건** 
+  읽으려는 Google Analytics 4 객체. 사용 가능한 엔터티를 확인하려면 아래 지원되는 엔터티 테이블을 참조하세요.

 **지원되는 엔터티** 


| 개체 | 필터링 가능 | 제한 지원 | 정렬 기준 지원 | Select \$1 지원 | 분할 지원 | 
| --- | --- | --- | --- | --- | --- | 
| 실시간 보고서 | 예 | 예 | 예 | 예 | 아니요 | 
| 코어 보고서 | 예 | 예 | 예 | 예 | 예 | 

 **예제** 

```
googleAnalytics4_read = glueContext.create_dynamic_frame.from_options(
    connection_type="GoogleAnalytics4",
    connection_options={
        "connectionName": "connectionName",
        "ENTITY_NAME": "entityName",
        "API_VERSION": "v1beta"
    }
```

 **Google Analytics 4 엔터티 및 필드 세부 정보** 


| 개체 | 필드 | 데이터 형식 | 지원되는 연산자 | 
| --- | --- | --- | --- | 
| 코어 보고서 | 동적 필드 |  |  | 
| 코어 보고서 | 차원 필드 | String | LIKE, = | 
| 코어 보고서 | 차원 필드 | 날짜 | LIKE, = | 
| 코어 보고서 | 지표 필드 | String | >, <, >=, <=, = BETWEEN | 
| 코어 보고서 | 사용자 지정 차원 및 사용자 지정 지표 필드 | String | NA | 
| 실시간 보고서 | appVersion | String | LIKE, = | 
| 실시간 보고서 | audienceId | String | LIKE, = | 
| 실시간 보고서 | audienceName | String | LIKE, = | 
| 실시간 보고서 | city | String | LIKE, = | 
| 실시간 보고서 | cityId | String | LIKE, = | 
| 실시간 보고서 | country | String | LIKE, = | 
| 실시간 보고서 | countryId | String | LIKE, = | 
| 실시간 보고서 | deviceCategory | String | LIKE, = | 
| 실시간 보고서 | eventName | String | LIKE, = | 
| 실시간 보고서 | minutesAgo | String | LIKE, = | 
| 실시간 보고서 | platform | String | LIKE, = | 
| 실시간 보고서 | streamId | String | LIKE, = | 
| 실시간 보고서 | streamName | String | LIKE, = | 
| 실시간 보고서 | unifiedScreenName | String | LIKE, = | 
| 실시간 보고서 | activeUsers | String | >, <, >=, <=, = BETWEEN | 
| 실시간 보고서 | conversions | String | >, <, >=, <=, = BETWEEN | 
| 실시간 보고서 | eventCount | String | >, <, >=, <=, = BETWEEN | 
| 실시간 보고서 | screenPageViews | String | >, <, >=, <=, = BETWEEN | 

 **분할 쿼리** 

1.  **필터 기반 분할** 

    Spark에서 동시성을 활용하려는 경우 추가 Spark 옵션(`PARTITION_FIELD`, `LOWER_BOUND`, `UPPER_BOUND`, `NUM_PARTITIONS`)을 제공할 수 있습니다. 이러한 파라미터를 사용하면 Spark 태스크에서 동시에 실행할 수 있는 `NUM_PARTITIONS`개의 하위 쿼리로 원본 쿼리가 분할됩니다.
   +  `PARTITION_FIELD`: 쿼리 분할에 사용할 필드의 이름입니다.
   +  `LOWER_BOUND`: 선택한 파티션 필드의 하한 값(경계 포함).

      날짜의 경우 Spark SQL 쿼리에 사용된 Spark 날짜 형식을 허용합니다. 유효한 값의 예제: `"2024-02-06"`.
   +  `UPPER_BOUND`: 선택한 파티션 필드의 상한 값(경계 제외).
   +  `NUM_PARTITIONS`: 파티션 수.

    **예제** 

   ```
   googleAnalytics4_read = glueContext.create_dynamic_frame.from_options(
       connection_type="GoogleAnalytics4",
       connection_options={
           "connectionName": "connectionName",
           "ENTITY_NAME": "entityName",
           "API_VERSION": "v1beta",
           "PARTITION_FIELD": "date"
           "LOWER_BOUND": "2022-01-01"
           "UPPER_BOUND": "2024-01-02"
           "NUM_PARTITIONS": "10"
       }
   ```

1.  **레코드 기반 분할** 

    Spark에서 동시성을 활용하려는 경우 추가 Spark 옵션(`NUM_PARTITIONS`)을 제공할 수 있습니다. 이러한 파라미터를 사용하면 Spark 태스크에서 동시에 실행할 수 있는 `NUM_PARTITIONS`개의 하위 쿼리로 원본 쿼리가 분할됩니다.
   +  `NUM_PARTITIONS`: 파티션 수.

    **예제** 

   ```
   googleAnalytics4_read = glueContext.create_dynamic_frame.from_options(
       connection_type="GoogleAnalytics4",
       connection_options={
           "connectionName": "connectionName",
           "ENTITY_NAME": "entityName",
           "API_VERSION": "v1beta",
           "NUM_PARTITIONS": "10"
       }
   ```

# Google Analytics 4 연결 옵션
<a name="googleanalytics-connection-options"></a>

다음은 Google Analytics 4의 연결 옵션입니다.
+  `ENTITY_NAME`(문자열) - (필수) 읽기에 사용됩니다. Google Analytics 4에서 객체 이름.
+  `API_VERSION`(문자열) - (필수) 읽기에 사용됩니다. 사용하려는 Analytics 4 Rest API 버전.
+  `SELECTED_FIELDS`(List<String>) - 기본값: 비어 있습니다(SELECT \$1). 읽기에 사용됩니다. 객체에 대해 선택할 열.
+  `FILTER_PREDICATE`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. Spark SQL 형식이어야 합니다.
+  `QUERY`(문자열) - 기본값: 비어 있습니다. 읽기에 사용됩니다. 전체 Spark SQL 쿼리.
+  `PARTITION_FIELD`(문자열) - 읽기에 사용됩니다. 쿼리 분할에 사용할 필드입니다.
+  `LOWER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 하한 값(경계 포함).
+  `UPPER_BOUND`(문자열) - 읽기에 사용됩니다. 선택한 파티션 필드의 상한 값(경계 제외).
+  `NUM_PARTITIONS`(정수) - 기본값: 1. 읽기에 사용됩니다. 읽을 파티션 수.
+  `INSTANCE_URL`(정수) - 읽기에 사용됩니다. (선택 사항) 

# Google Analytics 4 계정 생성
<a name="googleanalytics-create-account"></a>

 단계에 따라 Google Analytics 4 계정을 생성합니다. [https://support.google.com/analytics/answer/9304153?hl=en](https://support.google.com/analytics/answer/9304153?hl=en) 

# 클라이언트 앱 및 OAuth 2.0 자격 증명을 생성하는 단계
<a name="googleanalytics-client-app-oauth-credentials"></a>

 자세한 내용은 [Google Analytics4 API 설명서](https://developers.google.com/analytics/devguides/reporting/data/v1)를 참조하세요.

1.  사용자 자격 증명으로 [Google Analytics 계정](https://analytics.google.com/)에 로그인하여 계정을 생성하고 설정하세요. 그런 다음 **Admin** > **Create Account**로 이동하세요.

1.  **Create Property**를 선택하여 생성한 계정의 속성을 생성하세요. 필수 세부 정보로 속성을 설정하세요. 제공된 모든 세부 정보가 생성되면 해당 속성 ID가 생성됩니다.

1.  드롭다운에서 **Data Streams** > **Add Stream** > **Web**을 선택하여 생성된 속성에 대한 데이터 스트림을 추가하세요. URL 및 기타 필수 필드와 같은 웹 사이트 세부 정보를 제공하세요. 모든 세부 정보를 제공하면 해당 **stream ID** 및 **measurement ID**가 생성됩니다.

1.  측정 ID를 복사하여 웹 사이트에서 Google Analytics를 설정하고 웹 사이트의 구성에 추가하세요.

1.  **Reports**로 이동하고 필요한 보고서를 생성하여 Google Analytics에서 보고서를 생성하세요.

1.  [console.cloud.google.com]( https://console.cloud.google.com)으로 이동하여 앱을 승인하고 Google Analytics 데이터 API를 검색한 다음 API를 활성화하세요.

   1.  API 및 서비스 페이지로 이동하여 **Credentials** > **setup OAuth 2.0 Client IDs**를 선택하세요.

   1.  AWS Glue 리디렉션 URL을 추가하여 리디렉션 URL을 제공하세요.

1.  연결을 생성하는 데 추가로 필요한 클라이언트 ID 및 클라이언트 보안 암호를 복사하세요.

# 제한 사항 및 고려 사항
<a name="googleanalytics-connector-limitations"></a>

다음은 Google Analytics 4 커넥터의 제한 사항입니다.
+  코어 보고서 엔터티의 경우 9개의 차원 필드 및 10개의 지표 필드만 요청에서 전송할 수 있습니다. 허용된 필드 수를 초과하면 요청이 실패하고 커넥터에서 오류 메시지를 표시하니다.
+  실시간 보고서 엔터티의 경우 4개의 차원 필드만 요청에서 전송할 수 있습니다. 허용된 필드 수를 초과하면 요청이 실패하고 커넥터에서 오류 메시지를 표시하니다.
+  Google Analytics 4는 베타 버전 무료 도구이므로 새 기능, 엔터티 개선 사항, 새 필드 추가 및 기존 필드 사용 중단에 대한 정기적인 업데이트가 제공됩니다.
+  코어 보고서 필드는 동적으로 채워지므로 필드의 추가, 사용 중단 및 이름 변경이 존재하며 언제든지 필드에 새로운 제한을 적용할 수 있습니다.
+  기본 시작 날짜는 30일이고 종료 날짜는 어제(현재 날짜의 하루 전)이며, 사용자가 값을 설정했거나 흐름이 증분에 기반한 경우 필터 표현식 코드에서 이러한 날짜가 재정의됩니다.
+  설명서에 따라 실시간 보고서 엔터티는 요청에서 한도를 전달하지 않으면 10,000개의 레코드를 반환합니다. 그렇지 않으면 요청한 수에 관계없이 API는 요청당 최대 250,000개의 행을 반환합니다. 자세한 내용은 Google Analytics 설명서의 [Method: properties.runRealtimeReport](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runRealtimeReport)를 참조하세요.
+  실시간 보고서 엔터티는 페이지 매김을 지원하지 않으므로 레코드 기반 파티션을 지원하지 않습니다. 또한 정의된 기준을 충족하는 필드가 없으므로 필드 기반 파티션을 지원하지 않습니다.
+  요청에서 전달할 수 있는 필드 수의 제한 사항 때문에 지정된 한도 내에서 기본 차원 및 지표 필드를 설정합니다. 'select all'을 선택하면 미리 결정된 필드의 데이터만 검색됩니다.
  +  코어 보고서 
    +  SAAS의 제한 사항에 따르는 경우 - 요청에서는 최대 9개의 차원과 최대 10개의 지표만 허용됩니다. 즉, 요청은 최대 19개의 필드(지표 \$1 차원)를 포함할 수 있습니다.
    +  구현에 따르는 경우 - 사용자가 SELECT\$1ALL을 사용하거나 25개를 초과하는 선택한 필드를 사용하는 경우 요청에서 기본 필드가 전달됩니다.
    +  다음 필드는 코어 보고서의 기본 필드로 고려됩니다. 'country', 'city', 'eventName', 'cityId', 'browser', 'date', 'currencyCode', 'deviceCategory', 'transactionId', active1DayUsers', 'active28DayUsers', 'active7DayUsers', 'activeUsers', 'averagePurchaseRevenue', 'averageRevenuePerUser', 'averageSessionDuration', 'engagedSessions', 'eventCount', 'engagementRate'.
  +  실시간 보고서 
    +  SAAS의 제한 사항에 따라 요청에서는 최대 4개의 차원이 허용됩니다.
    +  사용자가 SELECT\$1ALL을 전달하거나 15개를 초과하는 선택한 필드를 전달하는 경우 요청에서 기본 필드가 전달됩니다.
    +  다음 필드는 실시간 보고서의 기본 필드로 고려됩니다. 'country', 'deviceCategory', 'city', 'cityId', 'activeUsers', 'conversions', 'eventCount', 'screenPageViews'.
+  코어 보고서 엔터티에서 startDate의 필터 및 날짜 필드의 파티션이 동시에 존재하는 경우 dateRange 값이 startDate 필터 값으로 재정의됩니다. 하지만 파티션이 항상 우선적으로 고려되므로 날짜 필드의 파티션이 이미 있는 경우 startDate 필터를 무시합니다.
+  현재 cohortSpecs는 core-report 요청 본문의 일부이기도 하므로 cohortSpec 속성에 대한 지원을 포함하도록 현재 core-report 엔터티를 개선했습니다. cohortSpecs 요청 본문에서는 거의 모든 필드에 사용자 입력이 필요합니다. 이를 해결하기 위해 이러한 속성/필드에 대한 기본값을 설정하고 필요한 경우 사용자가 이러한 값을 재정의하도록 프로비저닝을 제공합니다.    
<a name="google-analytics-connector-limitations-table"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/googleanalytics-connector-limitations.html)
+  이러한 모든 필터를 한 번에 함께 전달하거나 다른 필터와 함께 전달할 수도 있습니다.
  +  예제 1 - filterPredicate: startDate between "2023-05-09" and "2023-05-10" AND startOffset=1 AND endOffset=2 AND granularity="WEEKLY"
  +  예제 2 - filterPredicate: city=“xyz” AND startOffset=1 AND endOffset=2 AND granularity="WEEKLY"
+  코호트 요청에서: 
  +  요청에서 'cohortNthMonth'가 전달되면 내부적으로 세분화 값은 'MONTHLY'로 설정됩니다.
  +  마찬가지로 'cohortNthWeek'가 전달되면 세분화 값은 'WEEKLY'로 설정됩니다.
  +  또한 'cohortNthDay'의 경우 세분화 값은 'DAILY'로 설정됩니다. 자세한 내용은 다음을 참조하세요.
    +  [ https://developers.google.com/analytics/devguides/reporting/data/v1/advanced ](https://developers.google.com/analytics/devguides/reporting/data/v1/advanced) 
    +  [ https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/CohortSpec ](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/CohortSpec) 
  +  사용자가 dateRange 및 세분화 기본값을 재정의하도록 프로비저닝이 제공됩니다. 위의 테이블을 참조하세요.