Dataform Core를 사용하면 SQLX 및 JavaScript로 워크플로 작업을 만들 수 있습니다. 선택사항이지만 SQLX와 함께 JavaScript를 사용하여 워크플로에서 유사한 요소를 반복적으로 만듭니다. 예를 들어 JavaScript를 사용하여 특정 사용자 ID가 삭제된 워크플로에서 각 테이블의 뷰를 만들 수 있습니다. JavaScript만으로 워크플로 작업을 개발할 수도 있습니다.
시작하기 전에
또한 JavaScript 문법과 다음 JavaScript 개념을 잘 알고 있어야 합니다.
- 변수
- 배열
- 조건문
- for 루프
- 지도
- 함수
- 객체
- 모듈 내보내기 및 가져오기
필요한 역할
JavaScript로 워크플로를 개발하고 JavaScript include로 코드를 재사용하는 데 필요한 권한을 얻으려면 관리자에게 작업공간의 Dataform 편집자 (roles/dataform.editor
) IAM 역할을 부여해 달라고 요청하세요.
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.
SQLX 파일에 JavaScript 코드 추가
인라인 또는 JavaScript 블록 내부에서 두 가지 방법으로 SQLX 파일에 JavaScript 코드를 추가할 수 있습니다.
JavaScript 블록을 사용하여 SQLX 파일에 함수 또는 상수를 정의할 수 있습니다. 인라인 JavaScript를 사용하여 SQLX 또는 SQL 쿼리를 동적으로 수정할 수 있습니다.
다음 코드 샘플은 SQLX 파일의 post_operations
블록에 인라인으로 추가된 self
Dataform Core 기본 제공 JavaScript 함수를 보여줍니다.
config {type: "table"}
SELECT * FROM ...
post_operations {
GRANT `roles/bigquery.dataViewer`
ON
TABLE ${self()}
TO "group:allusers@example.com", "user:otheruser@example.com"
}
다음 코드 샘플은 JavaScript 블록에서 정의되고 SQLX 파일의 쿼리 내부에서 인라인으로 사용되는 상수를 보여줍니다.
js {
const columnName = "foo";
}
SELECT 1 AS ${columnName} FROM "..."
JavaScript 캡슐화를 통해 단일 SQLX 파일에서 코드 재사용
JavaScript 코드를 재사용하여 Dataform에서 개발을 간소화할 수 있습니다. 단일 SQLX 파일에서 JavaScript 상수 및 함수를 재사용하려면 JavaScript 블록에 캡슐화하면 됩니다. 단일 Dataform 저장소에 JavaScript 코드를 재사용하려면 include를 만들면 됩니다. 여러 Dataform 저장소에서 JavaScript 코드를 재사용하려면 패키지를 만들거나 가져오면 됩니다.
단일 SQLX 파일 내에서 재사용할 수 있는 SQL 코드의 반복 부분을 만들려면 JavaScript 블록에 함수 및 상수를 캡슐화하면 됩니다. 블록이 정의된 SQLX 파일 내에서만 JavaScript 블록에 정의된 코드를 재사용할 수 있습니다. 자세한 내용은 Dataform Core를 참고하세요.
다음 코드 샘플은 JavaScript 블록에서 정의되고 SQLX 파일의 쿼리 내부에서 인라인으로 사용되는 상수 및 함수를 보여줍니다.
js {
const foo = 1;
function bar(number){
return number+1;
}
}
select
${foo} as one,
${bar(foo)} as two
include를 사용하여 단일 저장소에서 코드 재사용
include는 저장소의 전역 JavaScript 상수 또는 함수입니다.
저장소의 includes
디렉터리에서 include를 정의합니다. 그런 다음 JavaScript 및 SQLX 파일의 저장소에서 이를 재사용할 수 있습니다.
다음 코드 샘플은 includes/constants.js
파일에 있는 launch_date
상수의 정의를 보여줍니다.
// filename is includes/constants.js
const launch_date = "11.11.2011";
module.exports = { launch_date };
다음 코드 샘플은 SQLX 파일의 테이블 정의 쿼리에서 참조되는 launch_date
상수를 보여줍니다.
config {type: "table"}
SELECT * FROM source_table WHERE date > ${constants.launch_date}
include용 JavaScript 파일 만들기
includes/
디렉터리에 새 JavaScript 파일을 만들려면 다음 단계를 따르세요.
파일 창에서
includes/
옆에 있는 더보기를 클릭합니다.파일 만들기를 클릭합니다.
새 파일 만들기 창에서 다음을 수행합니다.
파일 경로 추가 필드에
includes/
다음에 파일 이름을 입력하고.js
를 입력합니다. 예를 들면includes/constants.js
입니다.파일 이름에는 숫자, 문자, 하이픈, 밑줄만 포함할 수 있습니다.
파일 만들기를 클릭합니다.
JavaScript 상수 만들기
프로젝트 전체에서 재사용할 수 있는 상수를 만들려면 다음 단계를 따르세요.
개발 작업공간으로 이동합니다.
파일 창에서
includes/
를 펼칩니다..js
확장자로 JavaScript 파일을 만들거나 선택합니다.파일에 다음 코드 스니펫을 입력합니다.
const CONSTANT_NAME = CONSTANT_VALUE; module.exports = { CONSTANT_NAME };
다음을 바꿉니다.
- CONSTANT_NAME: 상수 이름
- CONSTANT_VALUE: 상수 값
(선택사항): 형식을 클릭합니다.
다음 코드 샘플은 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 함수를 만들려면 다음 단계를 따르세요.
개발 작업공간으로 이동합니다.
파일 창에서
includes/
를 펼칩니다..js
확장자로 JavaScript 파일을 만들거나 선택합니다.파일에서 커스텀 JavaScript 함수를 작성합니다.
파일에 다음 코드 스니펫을 입력합니다.
module.exports = { FUNCTION_NAME }
FUNCTION_NAME
을 함수의 이름으로 바꿉니다.(선택사항): 형식을 클릭합니다.
다음 코드 샘플은 renderScript
라는 커스텀 JavaScript 함수를 보여주며, 이 함수는 includes/functions.js
파일에 저장됩니다. 이 함수는 SQL 스크립트를 생성합니다.
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를 참조하려면 다음 단계를 따르세요.
개발 작업공간으로 이동합니다.
파일 창에서
definitions/
를 펼칩니다.SQLX 파일을 선택합니다.
config
블록에 다음 코드 스니펫을 입력합니다.js { var { VARIABLE_NAME } = require("SUBDIRECTORY_INCLUDE"); }
다음을 바꿉니다.
- VARIABLE_NAME: 가져오려는 상수 또는 함수의 이름
- SUBDIRECTORY_INCLUDE: 중첩된
includes
파일의 경로
(선택사항): 형식을 클릭합니다.
다음 코드 샘플은 테이블 정의 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를 참고하세요.
패키지를 사용하여 여러 저장소에서 코드 재사용
패키지는 워크플로 개발을 간소화하기 위해 여러 Dataform 저장소에서 가져오고 사용할 수 있는 JavaScript 코드 모음입니다.
Dataform에서 자체 커스텀 패키지를 만들거나 GitHub 오픈소스 Dataform 페이지에서 제공되는 오픈소스 Dataform 패키지 중 하나를 사용할 수 있습니다.
Dataform에서 패키지의 콘텐츠를 사용할 수 있으려면 Dataform 저장소에 패키지를 설치한 다음 패키지를 사용할 개별 JavaScript 또는 SQLX 파일로 가져와야 합니다. 자세한 내용은 패키지 설치를 참고하세요.
Dataform 저장소에 비공개 NPM 패키지를 설치하려면 패키지를 인증해야 합니다.
JavaScript만으로 워크플로 만들기
이 섹션에서는 JavaScript를 사용하여 Dataform에서 워크플로 작업을 만드는 방법을 보여줍니다. Dataform Core 대신 JavaScript를 사용하여 워크플로에서 비슷한 요소를 반복적으로 만들 수 있습니다.
SQLX 또는 JavaScript와 결합된 SQLX에서 워크플로를 개발하는 대신 JavaScript만 사용하여 .js
파일에 워크플로 작업을 만들 수 있습니다. Dataform 전역 메서드와 루프 및 상수와 같은 임의의 JavaScript ES5 코드를 사용하여 하나의 JavaScript 파일 내에서 여러 워크플로 작업을 만들 수 있습니다. 각 Dataform 전역 JavaScript 메서드에는 생성된 객체를 구성하는 데 사용할 수 있는 속성이 포함되어 있습니다.
Dataform에서 JavaScript만 사용하여 다음 워크플로 작업을 만들 수 있습니다.
- 데이터 소스 선언
- 테이블
- 수동 어설션
- 맞춤 SQL 작업
JavaScript를 사용하면 워크플로에서 유사한 작업을 반복적으로 만들 수 있습니다. 예를 들어 특정 사용자 ID가 삭제된 워크플로에서 각 테이블의 뷰를 만들 수 있습니다.
다음 JavaScript 코드 샘플을 사용하면 user_id
필드 값이 blocked_user_ids
목록의 값 중 하나와 일치하지 않는 각 테이블의 뷰를 만들 수 있습니다.
const tableNames = ["user_events", "user_settings", "user_logs"];
tableNames.forEach(tableName => {
publish(tableName + "_blocked_removed").query(
ctx => `
SELECT * FROM ${ctx.ref(tableName)}
WHERE user_id NOT IN (
SELECT user_id
FROM ${ctx.ref("blocked_user_ids")}
)`
);
});
이 코드 샘플은 차단된 사용자 ID를 포함하지 않는 user_events_blocked_removed
, user_settings_blocked_removed
, user_logs_blocked_removed
라는 세 개의 뷰를 만듭니다.
Dataform 전역 메서드와 임의 JavaScript ES5 코드(예: 루프 및 상수)를 사용하여 하나의 JavaScript 파일 내에서 여러 작업을 만들 수 있습니다.
Dataform에서 JavaScript로 다음 작업을 정의할 수 있습니다.
JavaScript 파일 만들기
정의 및 데이터 소스 선언을 위한 JavaScript 파일을 definitions/
디렉터리에 저장합니다. definitions/
디렉터리에 새 JavaScript 파일을 만들려면 다음 단계를 따르세요.
파일 창에서
definitions/
옆에 있는 더보기를 클릭합니다.파일 만들기를 클릭합니다.
새 파일 만들기 창에서 다음을 수행합니다.
파일 경로 추가 필드에
definitions/
다음에 파일 이름을 입력하고.js
를 입력합니다. 예를 들면definitions/definitions.js
입니다.파일 이름에는 숫자, 문자, 하이픈, 밑줄만 포함할 수 있습니다.
파일 만들기를 클릭합니다.
JavaScript로 워크플로 작업 속성 설정
다음 Dataform 전역 메서드를 사용하여 Dataform으로 SQL 워크플로 작업을 만들 수 있습니다.
declare
: 데이터 소스를 선언하는 데 사용됩니다.publish
: 테이블을 정의하는 데 사용됩니다.assert
: 어설션을 만드는 데 사용됩니다.operate
: 커스텀 SQL 작업을 정의하는 데 사용됩니다.
각 전역 메서드에는 생성된 객체를 구성하는 데 사용할 수 있는 속성이 포함되어 있습니다. 전역 메서드 및 속성에 대한 자세한 내용은 Dataform Core 참조를 확인하세요.
테이블을 만드는 publish()
메서드에서 테이블 속성을 두 번째 메서드 인수로 전달하여 설정할 수 있습니다.
publish()
의 두 번째 인수로 테이블 속성을 전달하려면 다음 단계를 따르세요.
개발 작업공간의 파일 창에서
definitions/
를 펼칩니다.JavaScript 파일을 선택합니다.
파일에서
publish()
메서드에 테이블 속성을 다음 형식으로 추가합니다.method("first_method_argument", { property1: "property1_value", property2: "property2_value", property3: "property3_value", });
(선택사항): 형식을 클릭합니다.
다음 코드 샘플은 메서드의 두 번째 인수로 속성을 전달하여 publish()
메서드에 속성을 설정하는 방법을 보여줍니다.
publish("table1", {
type: "table",
dependencies: ["other_table"],
description: {
"Value is 1"
}
}).query(ctx => "SELECT 1 AS test");
JavaScript 파일에 include 참조
JavaScript 파일 내에 include 함수, 매크로 또는 상수를 참조할 수 있습니다. Dataform의 include에 대한 자세한 내용은 이 문서의 include를 사용하여 단일 저장소에서 코드 재사용 섹션을 참고하세요.
JavaScript 파일 내의 include 참조 문법은 include 파일의 위치에 따라 다릅니다. Dataform은 include 디렉터리에 이러한 파일을 저장합니다.
최상위 include 참조
- 최상위 include 파일을 참조하려면 변수를 선언할 때 파일 이름을 참조합니다.
다음 코드 샘플은 includes/service.js
파일의 serviceName
및 serviceId
변수를 참조합니다.
const {serviceName, serviceId} = service;
중첩 include 참조
중첩된 include 파일을 참조하려면 JavaScript require 함수에 파일 이름을 입력합니다.
다음 코드 샘플은 includes/allServices/service.js
파일의 serviceName
및 serviceId
변수를 참조합니다.
const {serviceName, serviceId} = require("includes/allServices/service.js");
JavaScript 메서드에서 Dataform 쿼리 함수 사용
Dataform은 ref
, self
과 같은 쿼리 내에서 사용할 수 있는 여러 기본 제공 함수를 제공합니다. Dataform 기본 제공 함수에 대한 자세한 내용은 Dataform API 참조를 확인하세요.
JavaScript 메서드에서 기본 제공 쿼리 함수를 사용하려면 다음 단계를 따르세요.
개발 작업공간의 파일 창에서
definitions/
를 펼칩니다.JavaScript 파일을 선택합니다.
파일에 전역 Dataform JavaScript 메서드를 입력합니다.
메서드에서 컨텍스트화할 수 있는
ctx
인수를 입력합니다.선택사항: JavaScript 템플릿 문자열을 사용하는 경우 컨텍스트 가능한 인수를 백틱
``
으로 래핑합니다.컨텍스트화할 수 있는 인수에서 매개변수가 컨텍스트 객체인 쿼리 함수를 입력합니다.
(선택사항): 형식을 클릭합니다.
다음 코드 샘플은 게시 메서드의 컨텍스트화할 수 있는 인수 내에 래핑된 ref
쿼리 함수를 보여줍니다.
publish("example").query(ctx => `SELECT * FROM ${ctx.ref("other_table")}`);
JavaScript로 워크플로 데이터 소스 선언
Dataform 선언 JavaScript 메서드를 사용하여 하나의 JavaScript 선언 파일에서 여러 데이터 소스를 선언할 수 있습니다. 선언 메서드에 대한 자세한 내용은 Dataform Core 참조를 확인하세요. Dataform의 데이터 소스에 대한 자세한 내용은 데이터 소스 선언을 참고하세요.
JavaScript 파일에서 데이터 소스를 선언하려면 다음 단계를 따르세요.
개발 작업공간의 파일 창에서
definitions/
를 펼칩니다.JavaScript 파일을 선택합니다.
파일에 다음 코드 스니펫을 입력합니다.
declare({ database: "DATABASE_PROJECT_ID", schema: "BIGQUERY_SCHEMA", name: "RELATION_NAME", });
다음을 바꿉니다.
DATABASE_PROJECT_ID
: 데이터 소스가 포함된 프로젝트의 프로젝트 IDBIGQUERY_SCHEMA
: 외부 관계가 있는 BigQuery 데이터 세트RELATION_NAME
: 나중에 Dataform에서 데이터 소스를 참조하는 데 사용할 수 있는 관계의 이름
동일한 파일에서 다른 데이터 소스를 선언하려면 파일에
declare
블록을 추가합니다.(선택사항): 형식을 클릭합니다.
JavaScript로 테이블 정의
Dataform JavaScript publish
메서드로 테이블을 만들 수 있습니다. 게시 메서드에 대한 자세한 내용은 Dataform Core 참조를 확인하세요.
다음 표 유형을 정의할 수 있습니다.
- 표
- 증분 테이블
- 보기
Dataform에서 테이블을 정의하는 방법에 대한 자세한 내용은 테이블 만들기를 참고하세요.
JavaScript 파일에서 테이블을 정의하려면 다음 단계를 따르세요.
개발 작업공간의 파일 창에서
definitions/
를 펼칩니다.JavaScript 파일을 선택합니다.
파일에 다음 코드 스니펫을 입력합니다.
publish("TABLE_NAME").query(ctx => "SELECT_QUERY");
다음을 바꿉니다.
TABLE_NAME
: 테이블의 이름SELECT_QUERY
: 테이블을 정의하는 SQL SELECT 문
테이블 유형을 설정하고, 테이블 종속 항목을 추가하고, 테이블 설명을 추가하려면
publish
메서드의 객체 속성을 설정하세요.동일한 파일에 다른 테이블을 정의하려면 3단계와 4단계를 반복합니다.
(선택사항): 형식을 클릭합니다.
JavaScript로 수동 어설션 정의
Dataform 어설션 JavaScript 메서드를 사용하여 JavaScript 파일에서 수동 SQL 어설션을 만들 수 있습니다. 어설션 메서드에 대한 자세한 내용은 Dataform Core 참조를 확인하세요.
수동 어설션 SQL 쿼리는 0개의 행을 반환해야 합니다. 실행했을 때 쿼리가 행을 반환하면 어설션이 실패합니다. 하나의 JavaScript 파일에 여러 어설션을 만들 수 있습니다.
Dataform의 어설션에 대한 자세한 내용은 데이터 품질 테스트를 참고하세요.
JavaScript 파일에서 수동 어설션을 만들려면 다음 단계를 따르세요.
개발 작업공간의 파일 창에서
definitions/
를 펼칩니다.JavaScript 파일을 선택합니다.
파일에 다음 코드 스니펫을 입력합니다.
assert("ASSERTION_NAME").query(ctx => "CUSTOM_ASSERTION_QUERY");
다음을 바꿉니다.
ASSERTION_NAME
: 커스텀 어설션의 이름CUSTOM_ASSERTION_QUERY
: SQL 어설션 쿼리
동일한 파일에 다른 어설션을 만들려면 3단계를 반복합니다.
(선택사항): 형식을 클릭합니다.
다음 코드 샘플은 source_table
의 값이 NULL
이 아님을 알리는 어설션을 보여줍니다.
assert("assertion1").query(ctx => "SELECT * FROM source_table WHERE value IS NULL");
JavaScript로 커스텀 SQL 작업 정의
Dataform 작업 JavaScript 메서드를 사용하여 JavaScript 파일에서 커스텀 SQL 작업을 정의할 수 있습니다. Dataform의 맞춤 SQL 작업에 대한 자세한 내용은 작업 만들기를 참고하세요.
JavaScript로 커스텀 SQL 작업을 정의하려면 다음 단계를 따르세요.
개발 작업공간의 파일 창에서
definitions/
를 펼칩니다.JavaScript 파일을 선택합니다.
파일에 다음 코드 스니펫을 입력합니다.
operate("OPERATION_NAME").queries(ctx => "CUSTOM_SQL_QUERY");
다음을 바꿉니다.
OPERATION_NAME
: 맞춤 작업의 이름CUSTOM_SQL_QUERY
: 맞춤 SQL 쿼리
동일한 파일에서 다른 맞춤 SQL 작업을 정의하려면 3단계를 반복합니다.
(선택사항): 형식을 클릭합니다.
다음 코드 샘플은 하나의 새로운 행을 some_table
에 삽입하고 새 행의 test_column
을 2
로 설정하는 JavaScript 파일의 커스텀 SQL 작업을 보여줍니다.
operate("operation1").queries("INSERT INTO some_table (test_column) VALUES (2)");
다음 단계
- 패키지를 만드는 방법은 패키지 만들기를 참고하세요.
- 패키지를 설치하는 방법을 알아보려면 패키지 설치를 참고하세요.
- 비공개 패키지를 인증하는 방법은 비공개 패키지 인증을 참조하세요.