์ถ”๊ฐ€ ์ž‘์—… ๊ตฌ์„ฑ

์ด ๋ฌธ์„œ์—์„œ๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

  1. Google Cloud ์ฝ˜์†”์—์„œ Dataform ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    Dataform์œผ๋กœ ์ด๋™

  2. ์ €์žฅ์†Œ๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  3. ๊ฐœ๋ฐœ ์ž‘์—…๊ณต๊ฐ„์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  4. ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ

  5. ๋‹ค์Œ ์œ ํ˜• ์ค‘ ํ•˜๋‚˜์˜ SQLX ํŒŒ์ผ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ์—ญํ• 

์ด ๋ฌธ์„œ์˜ ์ž‘์—…์„ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ์–ป์œผ๋ ค๋ฉด ๊ด€๋ฆฌ์ž์—๊ฒŒ ์ž‘์—…๊ณต๊ฐ„์— ๋Œ€ํ•œ Dataform ํŽธ์ง‘์ž (roles/dataform.editor) IAM ์—ญํ• ์„ ๋ถ€์—ฌํ•ด ๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜์„ธ์š”. ์—ญํ•  ๋ถ€์—ฌ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ด€๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ปค์Šคํ…€ ์—ญํ• ์ด๋‚˜ ๋‹ค๋ฅธ ์‚ฌ์ „ ์ •์˜๋œ ์—ญํ• ์„ ํ†ตํ•ด ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ์–ป์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์ „์— ์‹คํ–‰ํ•  SQL ๋ฌธ ์ •์˜

BigQuery์—์„œ ์„ ํƒํ•œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ธฐ ์ „์— ํ•˜๋‚˜ ์ด์ƒ์˜ SQL ๋ฌธ์„ ์‹คํ–‰ํ•˜๋„๋ก Dataform์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Dataform์—์„œ ์„ ํƒํ•œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ธฐ ์ „์— SQL ๋ฌธ์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด ํ…Œ์ด๋ธ” ์ •์˜ SQLX ํŒŒ์ผ์˜ pre_operations ๋ธ”๋ก์— ๋ฌธ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

Dataform์—์„œ ํŠน์ • ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ธฐ ์ „์— ์‹คํ–‰๋˜๋Š” ๋งž์ถค SQL ๋ฌธ์„ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. ๊ฐœ๋ฐœ ์ž‘์—…๊ณต๊ฐ„์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. ํŒŒ์ผ ์ฐฝ์—์„œ definitions/๋ฅผ ํŽผ์นฉ๋‹ˆ๋‹ค.
  3. SQLX ํ…Œ์ด๋ธ” ์ •์˜ ํŒŒ์ผ์„ ์—ฝ๋‹ˆ๋‹ค.
  4. config ๋ธ”๋ก ์™ธ๋ถ€์— pre_operations { ... }๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  5. pre_operations { ... } ๋‚ด๋ถ€์— SQL ๋ฌธ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  6. ์„ ํƒ์‚ฌํ•ญ: ์—ฌ๋Ÿฌ ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ---๋กœ ๊ตฌ๋ถ„ํ•˜์„ธ์š”.
  7. (์„ ํƒ์‚ฌํ•ญ): ํ˜•์‹์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ ์ƒ˜ํ”Œ์€ select ๋ฌธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž„์‹œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” pre_operations ๋ฌธ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

pre_operations {
  CREATE TEMP FUNCTION AddFourAndDivide(x INT64, y INT64)
    RETURNS FLOAT64
    AS ((x + 4) / y);
}

ํ…Œ์ด๋ธ” ์ƒ์„ฑ ํ›„์— ์‹คํ–‰ํ•  SQL ๋ฌธ ์ •์˜

BigQuery์—์„œ ์„ ํƒํ•œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“  ํ›„์— ํ•˜๋‚˜ ์ด์ƒ์˜ SQL ๋ฌธ์„ ์‹คํ–‰ํ•˜๋„๋ก Dataform์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Dataform์—์„œ ์„ ํƒํ•œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“  ํ›„์— SQL ๋ฌธ์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด ํ…Œ์ด๋ธ” ์ •์˜ SQLX ํŒŒ์ผ์˜ post_operations ๋ธ”๋ก์— ๋ฌธ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. post_operations ๋ธ”๋ก์— SQL ๋ฌธ์„ ์—ฌ๋Ÿฌ ๊ฐœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Dataform์—์„œ ํŠน์ • ํ…Œ์ด๋ธ”์„ ๋งŒ๋“  ํ›„์— ์‹คํ–‰๋˜๋Š” ๋งž์ถค SQL ๋ฌธ์„ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. ๊ฐœ๋ฐœ ์ž‘์—…๊ณต๊ฐ„์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. ํŒŒ์ผ ์ฐฝ์—์„œ definitions/๋ฅผ ํŽผ์นฉ๋‹ˆ๋‹ค.
  3. SQLX ํ…Œ์ด๋ธ” ์ •์˜ ํŒŒ์ผ์„ ์—ฝ๋‹ˆ๋‹ค.
  4. config ๋ธ”๋ก ์™ธ๋ถ€์— post_operations { ... }๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  5. post_operations { ... } ๋‚ด๋ถ€์— SQL ๋ฌธ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  6. (์„ ํƒ์‚ฌํ•ญ): ํ˜•์‹์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ ์ƒ˜ํ”Œ์€ ์ƒ์„ฑ๋œ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ทธ๋ฃน์— ๋ถ€์—ฌํ•˜๋Š” post_operations ๋ฌธ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

  post_operations {
    GRANT `roles/bigquery.dataViewer`
    ON
    TABLE ${self()}
    TO "group:allusers@example.com", "user:otheruser@example.com"
  }

ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์ค‘์ง€

Dataform์—์„œ BigQuery์— ์„ ํƒํ•œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์ง€ ๋ชปํ•˜๋„๋ก ํ•˜๋ ค๋ฉด SQLX ํ…Œ์ด๋ธ” ์ •์˜ ํŒŒ์ผ์—์„œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉ ์ค‘์ง€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. Dataform์€ ์‚ฌ์šฉ ์ค‘์ง€๋œ ํ…Œ์ด๋ธ”์„ ์ข…์† ํ•ญ๋ชฉ ๊ทธ๋ž˜ํ”„์— ์œ ์ง€ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ ๋ฐ ์ƒ์„ฑ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ…Œ์ด๋ธ”์ด ์‹คํŒจํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋™์•ˆ ์ „์ฒด ์›Œํฌํ”Œ๋กœ๊ฐ€ ์‹คํŒจํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์— ์ด ๋ฐฉ๋ฒ•์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‘œ๋ฅผ ์‚ฌ์šฉ ์ค‘์ง€ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. ๊ฐœ๋ฐœ ์ž‘์—…๊ณต๊ฐ„์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. ํŒŒ์ผ ์ฐฝ์—์„œ definitions/๋ฅผ ํŽผ์นฉ๋‹ˆ๋‹ค.
  3. SQLX ํ…Œ์ด๋ธ” ์ •์˜ ํŒŒ์ผ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  4. ํŒŒ์ผ์˜ config ๋ธ”๋ก์— disabled: true์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  5. (์„ ํƒ์‚ฌํ•ญ): ํ˜•์‹์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ ์ƒ˜ํ”Œ์€ ์‚ฌ์šฉ ์ค‘์ง€๋œ ํ…Œ์ด๋ธ”์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

config {
  type: "table",
  disabled: true
}

select * from ${ref("source_data")}

์‹คํ–‰ ํƒœ๊ทธ ์ถ”๊ฐ€

์ด ์„น์…˜์—์„œ๋Š” Dataform Core SQLX ํŒŒ์ผ์— ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์›Œํฌํ”Œ๋กœ๋ฅผ ๋ถ„๋ฅ˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์›Œํฌํ”Œ๋กœ์˜ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์ปฌ๋ ‰์…˜์œผ๋กœ ์ •๋ฆฌํ•˜๋ ค๋ฉด ๋‹ค์Œ ์œ ํ˜•์˜ SQLX ํŒŒ์ผ์— ๋งž์ถค ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  • table
  • view
  • incremental
  • assertion
  • operations

์›Œํฌํ”Œ๋กœ ์‹คํ–‰ ์ค‘์— ์„ ํƒํ•œ ํƒœ๊ทธ๊ฐ€ ์žˆ๋Š” ํŒŒ์ผ๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Cloud Composer ๋˜๋Š” Workflows์™€ Cloud Scheduler๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„ ํƒ๋œ ํƒœ๊ทธ๊ฐ€ ์žˆ๋Š” Dataform ์›Œํฌํ”Œ๋กœ๋ฅผ ํŠน์ • ๊ฐ„๊ฒฉ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ์ผ์ •์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํƒœ๊ทธ ์ถ”๊ฐ€

SQLX ํŒŒ์ผ์— ์—ฌ๋Ÿฌ ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SQLX ํŒŒ์ผ์— ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. ๊ฐœ๋ฐœ ์ž‘์—…๊ณต๊ฐ„์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. ํŒŒ์ผ ์ฐฝ์—์„œ definitions/๋ฅผ ํŽผ์นฉ๋‹ˆ๋‹ค.
  3. SQLX ํŒŒ์ผ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  4. config ๋ธ”๋ก์— ๋‹ค์Œ ํ˜•์‹์œผ๋กœ ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    tags: ["CUSTOM_TAG"]
    

    CUSTOM_TAG๋ฅผ ํƒœ๊ทธ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  5. (์„ ํƒ์‚ฌํ•ญ): ์—ฌ๋Ÿฌ ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์‰ผํ‘œ(,)๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

  6. (์„ ํƒ์‚ฌํ•ญ): ํ˜•์‹์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ ์ƒ˜ํ”Œ์€ daily ๋ฐ hourly ํƒœ๊ทธ๊ฐ€ ์žˆ๋Š” user_counts ๋ทฐ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

config {
  type: "view",
  name: "user_counts",
  tags: ["daily", "hourly"]
}

๋‹ค์Œ ๋‹จ๊ณ„