ํƒ€์ผ ํ™•์žฅ ๋นŒ๋“œ

Looker 24.0๋ถ€ํ„ฐ๋Š” ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์ด ๋Œ€์‹œ๋ณด๋“œ์˜ ํƒ€์ผ์—์„œ ์‹คํ–‰๋˜๋„๋ก ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ผ ๋˜๋Š” ์‹œ๊ฐํ™”๋กœ ์‹คํ–‰๋˜๋„๋ก ์ง€์›ํ•˜๋Š” ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ์ˆ˜์ • ๋ชจ๋“œ์— ์žˆ๋Š” ๋™์•ˆ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ Explore์—์„œ ์‹œ๊ฐํ™”๋กœ ๋Œ€์‹œ๋ณด๋“œ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. LookML ๋Œ€์‹œ๋ณด๋“œ์—์„œ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ํƒ€์ผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€์‹œ๋ณด๋“œ ํƒ€์ผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์˜ ์˜ˆ์‹œ๋„ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

ํƒ€์ผ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ๊ณผ ํ•จ๊ป˜ Looker ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ SDK ์‚ฌ์šฉ

ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ๋Œ€์‹œ๋ณด๋“œ์— ํƒ€์ผ๋กœ ๋กœ๋“œํ•˜๋ ค๋ฉด ํƒ€์ผ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์—์„œ LookML ํ”„๋กœ์ ํŠธ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์— mount_points ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ผ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๊ด€๋ จ๋œ mount_points์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  mount_points: {
    dashboard_vis: yes
    dashboard_tile: yes
    standalone: yes
  }
  • dashboard_vis โ€” ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์ด ์‚ฌ์šฉ ์„ค์ •๋˜๋ฉด Explore์˜ ์‹œ๊ฐํ™” ์˜ต์…˜์— ํ‘œ์‹œ๋˜๋ฉฐ, ์—ฌ๊ธฐ์„œ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ๊ฐํ™”๋กœ ์„ ํƒํ•˜์—ฌ ๋Œ€์‹œ๋ณด๋“œ ํƒ€์ผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹œ๋ณด๋“œ ์‹คํ–‰ ์‹œ ํ•ด๋‹น ๋Œ€์‹œ๋ณด๋“œ๋Š” ํƒ€์ผ๊ณผ ์—ฐ๊ฒฐ๋œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ปค์Šคํ…€ ์‹œ๊ฐํ™”์˜ ์ž‘๋™ ๋ฐฉ๋ฒ•๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์ปค์Šคํ…€ ์‹œ๊ฐํ™”์™€ dashboard_vis๊ฐ€ ์‚ฌ์šฉ ์„ค์ •๋œ ๋Œ€์‹œ๋ณด๋“œ ํƒ€์ผ์—์„œ ์‹คํ–‰๋˜๋Š” ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์˜ ์ฃผ์š” ์ฐจ์ด์ ์€ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์—์„œ Looker API๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.
  • dashboard_tile โ€” ์‚ฌ์šฉ ์„ค์ • ์‹œ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ ํ›„ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ์˜ต์…˜์„ ์„ ํƒํ•  ๋•Œ ํ‘œ์‹œ๋˜๋Š” ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ํŒจ๋„์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์€ ํƒ€์ผ ์ฟผ๋ฆฌ์—์„œ ์ž๋™์œผ๋กœ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋Œ€์‹  ์ž์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ๋งˆ์šดํŠธ ์ง€์  standalone์œผ๋กœ ์ธํ•ด ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์ด Looker ๊ธฐ๋ณธ ๋ฉ”๋‰ด์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„น์…˜ ์•„๋ž˜์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋งˆ์šดํŠธ ์ง€์ ์ด ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ์‹œ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์€ ๋งˆ์šดํŠธ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์•Œ๋ฆผ์„ ๋ฐ›๊ณ  ๊ทธ์— ๋”ฐ๋ผ ๋™์ž‘์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด standalone ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์€ ์ž์ฒด ๋†’์ด๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•˜์ง€๋งŒ ํƒ€์ผ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํƒ€์ผ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ์ถ”๊ฐ€ API

ํƒ€์ผ ํ™•์žฅ์—๋Š” ์ถ”๊ฐ€ API์™€ ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ์ปจํ…์ŠคํŠธ์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const {
  tileSDK,
  tileHostData,
  visualizationData,
  visualizationSDK,
} = useContext(ExtensionContext40)
  • tileSDK - ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์ด Looker ๋Œ€์‹œ๋ณด๋“œ ํ˜ธ์ŠคํŠธ์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํƒ€์ผ๋ณ„๋กœ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์ด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์‚ญ์ œํ•˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • tileHostData - ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์— ํƒ€์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ํ˜ธ์ŠคํŒ… ๋Œ€์‹œ๋ณด๋“œ์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. isDashboardEditing ํ‘œ์‹œ๊ธฐ๊ฐ€ ๊ทธ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.
  • visualizationSDK โ€” ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์ด Looker ๋Œ€์‹œ๋ณด๋“œ ํ˜ธ์ŠคํŠธ์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์‹œ๊ฐํ™”๋ณ„๋กœ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. updateRowLimit ํ•จ์ˆ˜๊ฐ€ ๊ทธ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.
  • visualizationData -ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์— ์‹œ๊ฐํ™” ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ํ˜ธ์ŠคํŒ… ๋Œ€์‹œ๋ณด๋“œ์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ์ปค์Šคํ…€ ์‹œ๊ฐํ™”์— ์ œ๊ณต๋˜๋Š” ๋ฐ์ดํ„ฐ์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

๋Œ€์‘ํ˜• ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ๋นŒ๋“œ

ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” iframe์€ ์ƒ์œ„ Looker ํ˜ธ์ŠคํŠธ ์ฐฝ์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•  ๋•Œ ์ž๋™์œผ๋กœ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” iframe ์ฝ˜ํ…์ธ  ์ฐฝ์— ์ž๋™์œผ๋กœ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. iframe ๊ตฌ์„ฑ์š”์†Œ์—๋Š” ํŒจ๋”ฉ์ด๋‚˜ ์—ฌ๋ฐฑ์ด ์—†์œผ๋ฏ€๋กœ Looker ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์ผ๊ด€๋˜๊ฒŒ ํ‘œ์‹œ๋˜๋„๋ก ์ž์ฒด ํŒจ๋”ฉ๊ณผ ์—ฌ๋ฐฑ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ชซ์ž…๋‹ˆ๋‹ค. ๋…๋ฆฝํ˜• ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์—์„œ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์˜ ๋†’์ด๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹œ๋ณด๋“œ ํƒ€์ผ ๋˜๋Š” ํƒ์ƒ‰ ์‹œ๊ฐํ™”์—์„œ ์‹คํ–‰๋˜๋Š” ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฝ์šฐ iframe ์ฝ˜ํ…์ธ  ์ฐฝ์ด iframe์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋†’์ด๋กœ ์ž๋™ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

๋ Œ๋”๋ง ๊ณ ๋ ค์‚ฌํ•ญ

ํƒ€์ผ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์€ ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ PDF ๋˜๋Š” ์ด๋ฏธ์ง€๋กœ ๋‹ค์šด๋กœ๋“œํ•  ๋•Œ ๋ Œ๋”๋ง๋œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ Œ๋”๋Ÿฌ๋Š” ๋ Œ๋”๋ง์ด ์™„๋ฃŒ๋˜๋ฉด ํƒ€์ผ์ด ์ด๋ฅผ ์•Œ๋ฆด ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜ํ–‰๋˜์ง€ ์•Š์•˜์œผ๋ฉด ๋ Œ๋”๋Ÿฌ๊ฐ€ ์‘๋‹ต์„ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ Œ๋”๋Ÿฌ์— ํƒ€์ผ์ด ๋ Œ๋”๋ง๋˜์—ˆ์Œ์„ ์•Œ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

  const { extensionSDK } = useContext(ExtensionContext40)

  useEffect(() => {
    extensionSDK.rendered()
  }, [])

๋ Œ๋”๋ง ์‹œ์—๋„ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์‚ฌ์šฉ ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ Œ๋”๋ง ์‹œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ตฌ์„ฑ์ด ํ•ด์ œ๋˜๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

  const { lookerHostData} = useContext(ExtensionContext40)
  const isRendering = lookerHostData?.isRendering

  const config = isRendering
    ? {
        ...visConfig,
        valueCountUp: false,
        waveAnimateTime: 0,
        waveRiseTime: 0,
        waveAnimate: false,
        waveRise: false,
      }
    : visConfig

  if (mountPoint === MountPoint.dashboardVisualization) {
    return <VisualizationTile config={config} />
  }

ํƒ€์ผ SDK ํ•จ์ˆ˜ ๋ฐ ์†์„ฑ

ํƒ€์ผ SDK๋Š” ํƒ€์ผ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์ด ํ˜ธ์ŠคํŒ… ๋Œ€์‹œ๋ณด๋“œ์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ํ‘œ์—์„œ๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜ ๋ฐ ์†์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ๋˜๋Š” ์†์„ฑ ์„ค๋ช…
tileHostData(์†์„ฑ) ํƒ€์ผ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ํ˜ธ์ŠคํŒ…ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํƒ€์ผ SDK ๋ฐ์ดํ„ฐ ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.
addError ํ˜ธ์ถœ ์‹œ ๋Œ€์‹œ๋ณด๋“œ ๋˜๋Š” Explore์—์„œ ์‹œ๊ฐํ™” ์•„๋ž˜์— ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
clearError ํ˜ธ์ถœ ์‹œ ๋Œ€์‹œ๋ณด๋“œ ๋˜๋Š” Explore์—์„œ ์‹œ๊ฐํ™” ์•„๋ž˜์— ํ‘œ์‹œ๋œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆจ๊น๋‹ˆ๋‹ค.
openDrillMenu ์‹œ๊ฐํ™” ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ด ํ˜ธ์ถœ๋กœ ๋“œ๋ฆด๋‹ค์šด ๋ฉ”๋‰ด๋ฅผ ์—ฝ๋‹ˆ๋‹ค. ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์ด ํƒ€์ผ ํ™•์žฅ ์‹œ๊ฐํ™”๊ฐ€ ์•„๋‹ˆ๋ฉด ์ด ํ˜ธ์ถœ์ด ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.
runDashboard ํ˜„์žฌ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ˜ธ์ถœ์€ Explore์—์„œ ์‹คํ–‰ ์ค‘์ธ ํƒ€์ผ ์‹œ๊ฐํ™” ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.
stopDashboard ์‹คํ–‰ ์ค‘์ธ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ˜ธ์ถœ์€ Explore์—์„œ ์‹คํ–‰ ์ค‘์ธ ํƒ€์ผ ์‹œ๊ฐํ™” ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.
updateFilters ํ˜„์žฌ ๋Œ€์‹œ๋ณด๋“œ ๋˜๋Š” Explore์˜ ํ•„ํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
openScheduleDialog ์ผ์ • ๋Œ€ํ™”์ƒ์ž๋ฅผ ์—ฝ๋‹ˆ๋‹ค. ์ด ํ˜ธ์ถœ์€ Explore์—์„œ ์‹คํ–‰๋  ๋•Œ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.
toggleCrossFilter ๊ต์ฐจ ํ•„ํ„ฐ๋ฅผ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ˜ธ์ถœ์€ Explore์—์„œ ์‹คํ–‰๋  ๋•Œ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

ํƒ€์ผ SDK ๋ฐ์ดํ„ฐ

๋‹ค์Œ ํ‘œ์—์„œ๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํƒ€์ผ SDK ๋ฐ์ดํ„ฐ ์†์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์†์„ฑ ์„ค๋ช…
isExploring True์ธ ๊ฒฝ์šฐ ํƒ€์ผ์ด Explore ๋‚ด์—์„œ ์‹œ๊ฐํ™”๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
dashboardId ๋ Œ๋”๋ง ์ค‘์ธ ํƒ€์ผ์˜ ๋Œ€์‹œ๋ณด๋“œ ID์ž…๋‹ˆ๋‹ค. ํƒ€์ผ์ด Explore๋กœ ๊ตฌ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ ์ด ์†์„ฑ์€ ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
elementId ๋ Œ๋”๋ง ์ค‘์ธ ํƒ€์ผ์˜ ์š”์†Œ ID์ž…๋‹ˆ๋‹ค. ํƒ€์ผ์ด Explore๋กœ ๊ตฌ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ ์ด ์†์„ฑ์€ ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
queryId ์‹œ๊ฐํ™”์™€ ์—ฐ๊ฒฐ๋œ ๊ฒฝ์šฐ ๋ Œ๋”๋ง ์ค‘์ธ ํƒ€์ผ์˜ ์ฟผ๋ฆฌ ID์ž…๋‹ˆ๋‹ค. ํƒ€์ผ์ด Explore๋กœ ๊ตฌ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ ์ด ์†์„ฑ์€ ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

queryId๋Š” ์‹œ๊ฐํ™”๊ฐ€ Looker Explore์— ๊ธฐ๋ณธ ์ œ๊ณต๋˜๋Š” ๊ฒฝ์šฐ ์ƒ์„ฑ๋˜๋Š” ์ฟผ๋ฆฌ์˜ ID์ž…๋‹ˆ๋‹ค. ๋Œ€์‹œ๋ณด๋“œ์— ์ ์šฉํ•  ํ•„ํ„ฐ ๋˜๋Š” ๊ต์ฐจ ํ•„ํ„ฐ๋ง์„ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. QueryResponse์— ํ‘œ์‹œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜์˜ํ•˜๋ ค๋ฉด ํ•„ํ„ฐ ๋ฐ ๊ต์ฐจ ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•˜๊ณ  ์ƒˆ ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ queryId๋ณด๋‹ค ์œ ์šฉํ•œ ์†์„ฑ์ด ๋” ๋งŽ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„ํ„ฐ๊ฐ€ ์ ์šฉ๋œ ์ฟผ๋ฆฌ ๊ฐ์ฒด๋Š” filteredQuery๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
querySlug ์‹œ๊ฐํ™”์™€ ์—ฐ๊ฒฐ๋œ ๊ฒฝ์šฐ ๋ Œ๋”๋ง ์ค‘์ธ ํƒ€์ผ์˜ ์ฟผ๋ฆฌ ์Šฌ๋Ÿฌ๊ทธ์ž…๋‹ˆ๋‹ค. ํƒ€์ผ์ด Explore๋กœ ๊ตฌ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ ์ด ์†์„ฑ์€ ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

querySlug๋Š” ์‹œ๊ฐํ™”๊ฐ€ Looker Explore์— ๊ธฐ๋ณธ ์ œ๊ณต๋˜๋Š” ๊ฒฝ์šฐ ์ƒ์„ฑ๋˜๋Š” ์ฟผ๋ฆฌ์˜ ์Šฌ๋Ÿฌ๊ทธ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹œ๋ณด๋“œ์— ์ ์šฉ๋˜๋Š” ํ•„ํ„ฐ ๋˜๋Š” ๊ต์ฐจ ํ•„ํ„ฐ๋ง์„ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. QueryResponse์— ํ‘œ์‹œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜์˜ํ•˜๋ ค๋ฉด ํ•„ํ„ฐ ๋ฐ ๊ต์ฐจ ํ•„ํ„ฐ๋ฅผ ์ ์šฉํ•˜๊ณ  ์ƒˆ ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ querySlug๋ณด๋‹ค ์œ ์šฉํ•œ ์†์„ฑ์ด ๋” ๋งŽ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„ํ„ฐ๊ฐ€ ์ ์šฉ๋œ ์ฟผ๋ฆฌ ๊ฐ์ฒด๋Š” filteredQuery๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
dashboardFilters ๋Œ€์‹œ๋ณด๋“œ์— ์ ์šฉ ์ค‘์ธ ํ•„ํ„ฐ์ž…๋‹ˆ๋‹ค. ํƒ€์ผ์ด Explore๋กœ ๊ตฌ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ ์ด ์†์„ฑ์€ ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
dashboardRunState ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํƒ€์ผ์ด Explore๋กœ ๊ตฌ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ ์ƒํƒœ๊ฐ€ UNKNOWN์ด ๋ฉ๋‹ˆ๋‹ค.

๋Œ€์‹œ๋ณด๋“œ ์„ฑ๋Šฅ์ƒ์˜ ์ด์œ ๋กœ ์‹คํ–‰ ์ƒํƒœ๊ฐ€ ์‹คํ–‰ ์ค‘์œผ๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ๊ณผ ์—ฐ๊ฒฐ๋œ ํƒ€์ผ ๋“ฑ ์ฟผ๋ฆฌ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ํƒ€์ผ์ด ์—†๋Š” ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ์‹คํ–‰๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•  ๊ฒฝ์šฐ lastRunStartTime์˜ ์ฐจ์ด๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ •์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
isDashboardEditing True์ธ ๊ฒฝ์šฐ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค. ํƒ€์ผ์ด Explore๋กœ ๊ตฌ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ ์ด ์†์„ฑ์€ ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
isDashboardCrossFilteringEnabled True์ธ ๊ฒฝ์šฐ ๋Œ€์‹œ๋ณด๋“œ์—์„œ ๊ต์ฐจ ํ•„ํ„ฐ๋ง์ด ์‚ฌ์šฉ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ํƒ€์ผ์ด Explore๋กœ ๊ตฌ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ ์ด ์†์„ฑ์€ ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
filteredQuery ๋Œ€์‹œ๋ณด๋“œ ์ˆ˜์ค€์—์„œ ์ˆ˜ํ–‰ํ•œ ๋ชจ๋“  ๋Œ€์‹œ๋ณด๋“œ ํ•„ํ„ฐ ๋ฐ ์‹œ๊ฐ„๋Œ€ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋Š” ๊ธฐ๋ณธ ๋Œ€์‹œ๋ณด๋“œ ์š”์†Œ์™€ ์—ฐ๊ฒฐ๋œ ์ฟผ๋ฆฌ ID์™€ ์ผ์น˜ํ•˜๋Š” ์ฟผ๋ฆฌ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
lastRunSourceElementId ๋งˆ์ง€๋ง‰ ๋Œ€์‹œ๋ณด๋“œ ์‹คํ–‰์„ ํŠธ๋ฆฌ๊ฑฐํ•œ ํƒ€์ผ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ์š”์†Œ์˜ ID์ž…๋‹ˆ๋‹ค. ๋Œ€์‹œ๋ณด๋“œ ์‹คํ–‰์ด ๋Œ€์‹œ๋ณด๋“œ ์‹คํ–‰ ๋ฒ„ํŠผ ๋˜๋Š” autorefresh์— ์˜ํ•ด ํŠธ๋ฆฌ๊ฑฐ๋˜์—ˆ๊ฑฐ๋‚˜ ์‚ฝ์ž… SDK๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰์ด ํŠธ๋ฆฌ๊ฑฐ๋œ ๊ฒฝ์šฐ์—๋Š” ID๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํƒ€์ผ์ด Explore๋กœ ๊ตฌ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ ์ด ์†์„ฑ์€ ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

lastRunSourceElementId๋Š” ํ˜„์žฌ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ์ธ์Šคํ„ด์Šค์˜ ์š”์†Œ ID์™€ ๋™์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์ด ๋Œ€์‹œ๋ณด๋“œ ์‹คํ–‰์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๊ฒฝ์šฐ ๋Œ€์‹œ๋ณด๋“œ ์‹คํ–‰์ด ์‹œ์ž‘๋˜๊ณ  ์™„๋ฃŒ๋˜๋ฉด ์•Œ๋ฆผ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
lastRunStartTime ๋งˆ์ง€๋ง‰ ๋Œ€์‹œ๋ณด๋“œ ์‹คํ–‰ ์‹œ์ž‘ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํƒ€์ผ์ด Explore๋กœ ๊ตฌ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ ์ด ์†์„ฑ์€ ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ณด๊ณ ๋œ ์‹œ์ž‘ ๋ฐ ์ข…๋ฃŒ ์‹œ๊ฐ„์€ ์„ฑ๋Šฅ ์ธก์ •ํ•ญ๋ชฉ์„ ์บก์ฒ˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
lastRunEndTime ๋งˆ์ง€๋ง‰ ๋Œ€์‹œ๋ณด๋“œ ์‹คํ–‰ ์ข…๋ฃŒ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํƒ€์ผ์ด Explore๋กœ ๊ตฌ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ ์ด ์†์„ฑ์€ ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํƒ€์ผ์ด ์‹คํ–‰ ์ค‘์ด๋ฉด ์ด ์†์„ฑ์ด ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ณด๊ณ ๋œ ์‹œ์ž‘ ๋ฐ ์ข…๋ฃŒ ์‹œ๊ฐ„์€ ์„ฑ๋Šฅ ์ธก์ •ํ•ญ๋ชฉ์„ ์บก์ฒ˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
lastRunSuccess ๋งˆ์ง€๋ง‰ ๋Œ€์‹œ๋ณด๋“œ ์‹คํ–‰์ด ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํƒ€์ผ์ด Explore๋กœ ๊ตฌ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ ์ด ์†์„ฑ์€ ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํƒ€์ผ์ด ์‹คํ–‰ ์ค‘์ด๋ฉด ์ด ์†์„ฑ์ด ์ฑ„์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐํ™” SDK ํ•จ์ˆ˜ ๋ฐ ์†์„ฑ

๋‹ค์Œ ํ‘œ์—์„œ๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์‹œ๊ฐํ™” SDK ํ•จ์ˆ˜ ๋ฐ ์†์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ๋˜๋Š” ์†์„ฑ ์„ค๋ช…
visualizationData(์†์„ฑ) ์‹œ๊ฐํ™”(visConfig ๋ฐ queryResponse ๋ฐ์ดํ„ฐ์˜ ์กฐํ•ฉ)
visConfig(์†์„ฑ) ์‹œ๊ฐํ™” ๊ตฌ์„ฑ ๋ฐ์ดํ„ฐ:

  • ์ธก์ • ๊ตฌ์„ฑ
  • ์ธก์ •๊ธฐ์ค€ ๊ตฌ์„ฑ
  • ํ…Œ์ด๋ธ” ๊ณ„์‚ฐ
  • ํ”ผ๋ฒ— ๊ตฌ์„ฑ
  • ์‹œ๊ฐํ™” ๊ตฌ์„ฑ

Explore์—์„œ ์‹œ๊ฐํ™”์˜ ๋ชจ์–‘๊ณผ ๋А๋‚Œ์„ ๋งž์ถค์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
queryResponse(์†์„ฑ) ์ฟผ๋ฆฌ์˜ ์‘๋‹ต ๋ฐ์ดํ„ฐ
configureVisualization ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ์‹œ๊ฐํ™”์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ตฌ์„ฑ์ด Explore ์‹œ๊ฐํ™” ํŽธ์ง‘๊ธฐ ๋‚ด์—์„œ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
setVisConfig ์‹œ๊ฐํ™” ๊ตฌ์„ฑ์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
updateRowLimit ์ฟผ๋ฆฌ ํ–‰ ํ•œ๋„๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

์‹œ๊ฐํ™” SDK ๋ฐ์ดํ„ฐ

์‹œ๊ฐํ™” SDK๋Š” ๋‹ค์Œ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • ์‹œ๊ฐํ™” ๊ตฌ์„ฑ ๋ฐ์ดํ„ฐ
  • ์ฟผ๋ฆฌ ์‘๋‹ต ๋ฐ์ดํ„ฐ

์‹œ๊ฐํ™” ๊ตฌ์„ฑ ๋ฐ์ดํ„ฐ

์†์„ฑ ์„ค๋ช…
queryFieldMeasures ์ธก์ • ์ •๋ณด
queryFieldDimensions ์ธก์ •๊ธฐ์ค€ ์ •๋ณด
queryFieldTableCalculations ํ…Œ์ด๋ธ” ๊ณ„์‚ฐ ์ •๋ณด
queryFieldPivots ํ”ผ๋ฒ— ์ •๋ณด
visConfig ์‹œ๊ฐ์  ๊ตฌ์„ฑ ๋ฐ์ดํ„ฐ. ๊ธฐ๋ณธ ๊ตฌ์„ฑ๊ณผ ๋ณ‘ํ•ฉ๋˜๊ณ  ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ Œ๋”๋ง๋˜๋Š” ์‹œ๊ฐํ™”์— ์ ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
export interface VisualizationConfig {
  queryFieldMeasures: Measure[]
  queryFieldDimensions: Dimension[]
  queryFieldTableCalculations: TableCalculation[]
  queryFieldPivots: PivotConfig[]
  visConfig: RawVisConfig
}

์ฟผ๋ฆฌ ์‘๋‹ต ๋ฐ์ดํ„ฐ

์†์„ฑ ์„ค๋ช…
data ํ–‰ ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด
fieldMeasures ํ•„๋“œ ์ธก์ • ์ •๋ณด.
fieldDimensions ํ•„๋“œ ์ธก์ •๊ธฐ์ค€ ์ •๋ณด.
fieldTableCalculations ํ•„๋“œ ํ…Œ์ด๋ธ” ๊ณ„์‚ฐ ์ •๋ณด.
fieldPivots ํ•„๋“œ ํ”ผ๋ฒ— ์ •๋ณด.
fieldMeasureLike ์ธก์ •์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋Š” ํ•„๋“œ ์ธก์ • ์ •๋ณด ๋ฐ ํ…Œ์ด๋ธ” ๊ณ„์‚ฐ์˜ ์—ฐ๊ฒฐ๋œ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.
fieldDimensionLike ์ธก์ •๊ธฐ์ค€์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋Š” ํ•„๋“œ ์ธก์ •๊ธฐ์ค€ ์ •๋ณด ๋ฐ ํ…Œ์ด๋ธ” ๊ณ„์‚ฐ์˜ ์—ฐ๊ฒฐ๋œ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.