Dataform에서 include로 변수 및 함수 재사용

이 문서에서는 Dataform에서 코드를 재사용하기 위해 JavaScript include를 만드는 방법을 보여줍니다.

저장소의 includes/ 폴더에서 JavaScript include를 정의할 수 있습니다. include는 전체 저장소에서 재사용할 수 있는 전역 상수 또는 함수입니다.

시작하기 전에

  1. Google Cloud 콘솔에서 Dataform 페이지로 이동합니다.

    Dataform으로 이동

  2. Dataform 저장소를 만들거나 선택합니다.

  3. Dataform 개발 작업공간 만들거나 선택합니다.

필요한 역할

JavaScript include로 코드를 재사용하는 데 필요한 권한을 얻으려면 관리자에게 작업공간에 대한 Dataform 편집자 (roles/dataform.editor) IAM 역할을 부여해 달라고 요청하세요. 역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

Dataform에서 include에 대한 JavaScript 파일 만들기

includes/ 디렉터리에 새 JavaScript 파일을 만들려면 다음 단계를 따르세요.

  1. 파일 창에서 includes/ 옆에 있는 더보기 메뉴를 클릭합니다.

  2. 파일 만들기를 클릭합니다.

  3. 새 파일 만들기 창에서 다음을 수행합니다.

    1. 파일 경로 추가 필드에 includes/ 다음에 파일 이름을 입력하고 .js를 입력합니다. 예를 들면 includes/constants.js입니다.

      파일 이름에는 숫자, 문자, 하이픈, 밑줄만 포함할 수 있습니다.

    2. 파일 만들기를 클릭합니다.

JavaScript 상수 만들기

프로젝트 전체에서 재사용할 수 있는 상수를 만들려면 다음 단계를 따르세요.

  1. 개발 작업공간으로 이동합니다.

  2. 파일 창에서 includes/를 펼칩니다.

  3. .js 확장자로 JavaScript 파일을 만들거나 선택합니다.

  4. 파일에 다음 코드 스니펫을 입력합니다.

     const CONSTANT_NAME = CONSTANT_VALUE;
     module.exports = { CONSTANT_NAME };
    

    다음을 바꿉니다.

    • CONSTANT_NAME: 상수 이름
    • CONSTANT_VALUE: 상수 값
  5. (선택사항): 형식을 클릭합니다.

다음 코드 샘플은 includes/constants.js 파일에 PROJECT_ID 상수를 정의합니다.

  // filename is includes/constants.js
  const PROJECT_ID = "my_project_name";
  module.exports = { PROJECT_ID };

다음 코드 샘플은 SQLX 파일의 테이블 정의 쿼리에서 PROJECT_ID 상수를 참조합니다.

  config { type: "table" }
  SELECT * FROM ${constants.PROJECT_ID}.my_schema_name.my_table_name

다음 코드 샘플은 SQL에 컴파일된 위의 Dataform Core 테이블 정의 쿼리를 보여줍니다.

  SELECT * FROM my_project_name.my_schema_name.my_table_name

커스텀 JavaScript 함수 만들기

프로젝트 전체에서 재사용할 수 있는 커스텀 JavaScript 함수를 만들려면 다음 단계를 따르세요.

  1. 개발 작업공간으로 이동합니다.

  2. 파일 창에서 includes/를 펼칩니다.

  3. .js 확장자로 JavaScript 파일을 만들거나 선택합니다.

  4. 파일에서 커스텀 JavaScript 함수를 작성합니다.

  5. 파일에 다음 코드 스니펫을 입력합니다.

     module.exports = { FUNCTION_NAME }
    

    FUNCTION_NAME을 함수의 이름으로 바꿉니다.

  6. (선택사항): 형식을 클릭합니다.

다음 코드 샘플은 includes/functions.js 파일에 SQL 스크립트를 생성하는 renderScript라는 커스텀 JavaScript 함수를 보여줍니다.

  function renderScript(table, dimensions, metrics) {
    return `
        select
        ${dimensions.map(field => `${field} as ${field}`).join(",")},
        ${metrics.map(field => `sum(${field}) as ${field}`).join(",\n")}
        from ${table}
        group by ${dimensions.map((field, i) => `${i + 1}`).join(", ")}
      `;
  }

  module.exports = { renderScript };

다음 코드 샘플은 Dataform Core 테이블 정의 쿼리에서 커스텀 renderScript JavaScript 함수를 사용하는 방법을 보여줍니다.

  config {
      type: "table",
      tags: ["advanced", "hourly"],
      disabled: true
  }

  ${functions.renderScript(ref("source_table"),
                                ["country", "device_type"],
                                ["revenue", "pageviews", "sessions"]
                                )}

다음 코드 샘플은 SQL에 컴파일된 위의 Dataform Core 테이블 정의 쿼리를 보여줍니다.

  select
    country as country,
    device_type as device_type,
    sum(revenue) as revenue,
    sum(pageviews) as pageviews,
    sum(sessions) as sessions

  from "dataform"."source_table"

  group by 1, 2

SQLX 파일의 include 참조

SQLX 파일 내에서 include 함수 또는 상수를 참조할 수 있습니다. include 참조 구문은 include 파일의 위치에 따라 다릅니다. 최상위 include 파일은 includes/ 디렉터리에 직접 배치됩니다. 중첩된 include 파일은 includes/의 하위 디렉터리에 있습니다.

SQLX 파일의 최상위 include 참조

  • Dataform Core 쿼리의 최상위 include 함수 또는 상수를 참조하려면 .js 확장자 없이 include 정의 파일 이름과 그 뒤에 내보낸 객체의 이름을 입력합니다.

다음 코드 샘플은 테이블 정의 SQLX 파일에서 includes/constants.js 파일에 정의된 firstDate 상수를 참조합니다.

  config {type: "table"}
  select * from source_table where date > ${constants.firstDate}

SQLX 파일의 중첩 include 참조

definitions의 하위 디렉터리에 있는 include를 참조하려면 JavaScript require 함수와 js {} 블록을 사용하여 include를 가져옵니다.

require JavaScript 함수로 중첩된 include를 참조하려면 다음 단계를 따르세요.

  1. 개발 작업공간으로 이동합니다.

  2. 파일 창에서 definitions/를 펼칩니다.

  3. SQLX 파일을 선택합니다.

  4. config 블록에 다음 코드 스니펫을 입력합니다.

     js {
       var { VARIABLE_NAME } = require("SUBDIRECTORY_INCLUDE");
     }
    

    다음을 바꿉니다.

    • VARIABLE_NAME: 가져오려는 상수 또는 함수의 이름
    • SUBDIRECTORY_INCLUDE: 중첩된 includes 파일의 경로
  5. (선택사항): 형식을 클릭합니다.

다음 코드 샘플은 테이블 정의 SQLX 파일에서 중첩된 includes/allConstants/constants.js 파일에 정의된 firstDate 상수를 참조합니다.

  config {type: "table"}
  js {
    var { firstDate } = require("includes/allConstants/constants");
  }
  select * from source_table where date > ${firstDate}

Dataform Core ref 함수에서 JavaScript include 함수를 사용합니다.

Dataform Core ref 함수와 함께 JavaScript include 함수를 사용하려면 SQLX 파일 내에 JavaScript include 함수의 인수로 ref를 전달해야 합니다.

다음 코드 샘플은 SUM을 사용하여 측정항목을 집계한 후 측정기준별로 그룹화하는 renderScript JavaScript 함수가 있는 includes/script_builder.js 파일을 보여줍니다.

function renderScript(table, dimensions, metrics) {
  return `
      SELECT
      ${dimensions.map((field) => `${field} AS ${field}`).join(",\\n")},
      ${metrics.map((field) => `SUM(${field}) AS ${field}`).join(",\\n")}
      FROM ${table}
      GROUP BY ${dimensions.map((field, i) => `${i + 1}`).join(", ")}
    `;
}
module.exports = { renderScript };

다음 코드 샘플은 Dataform Core ref 함수가 인수로 전달된 definitions/stats_per_country_and_device.sqlx 파일에서 사용되는 renderScript JavaScript 함수를 보여줍니다.

${script_builder.renderScript(
  ref("source_table"),
  ["country", "device_type"],
  ["revenue", "pageviews", "sessions"])}

다음 코드 샘플은 SQL로 컴파일된 definitions/stats_per_country_and_device.sqlx 쿼리를 보여줍니다.

SELECT country AS country,
       device_type AS device_type,
       SUM(revenue) AS revenue,
       SUM(pageviews) AS pageviews,
       SUM(sessions) AS sessions
FROM my_schema.source_table
GROUP BY 1, 2

Dataform Core ref 함수에 대한 자세한 내용은 Dataform Core 개요를 참조하세요.

다음 단계