2026๋…„ Apache Superset: ๋Œ€์‹œ๋ณด๋“œ, SQL Lab ๊ทธ๋ฆฌ๊ณ  ๋ฉด์ ‘ ์งˆ๋ฌธ

Apache Superset ์‹ฌ์ธต ๋ถ„์„: ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋Œ€์‹œ๋ณด๋“œ ๊ตฌ์ถ•, SQL Lab๊ณผ Jinja ํ…œํ”Œ๋ฆฟ, Tableau์™€์˜ ๋น„๊ต, ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ์ค‘์š”ํ•œ ๋ฉด์ ‘ ์งˆ๋ฌธ.

2026๋…„ Apache Superset ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋Œ€์‹œ๋ณด๋“œ์™€ SQL Lab

Apache Superset๋Š” ์ขŒ์„๋‹น ๋ผ์ด์„ ์Šค ์—†์ด ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์›ํ•˜๋Š” ํŒ€์„ ์œ„ํ•œ ๊ธฐ๋ณธ ์˜คํ”ˆ์†Œ์Šค ๋น„์ฆˆ๋‹ˆ์Šค ์ธํ…”๋ฆฌ์ „์Šค ํ”Œ๋žซํผ์œผ๋กœ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค. 2026๋…„ ํ˜„์žฌ ์‚ฌ์šฉ๋˜๋Š” 6.x ๋ฆด๋ฆฌ์Šค ๋ผ์ธ์€ ์™„์ „ํ•œ Ant Design v5 ๋ฆฌ๋””์ž์ธ, ๋„ค์ดํ‹ฐ๋ธŒ ๋‹คํฌ ๋ชจ๋“œ, ๊ทธ๋ฆฌ๊ณ  ์ƒ์šฉ ๋„๊ตฌ์™€์˜ ๊ฒฉ์ฐจ๋ฅผ ์ƒ๋‹น ๋ถ€๋ถ„ ์ขํžˆ๋Š” ๊ณ„์ธตํ˜• ์‹œ๋งจํ‹ฑ ๋ ˆ์ด์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹ฌ์ธต ๋ถ„์„์—์„œ๋Š” Superset์ด ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ์‹, SQL Lab๊ณผ Jinja ํ…œํ”Œ๋ฆฟ์ด ๊ฐ•๋ ฅํ•œ ์ด์œ , Tableau์™€์˜ ๋น„๊ต, ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” Apache Superset ๋ฉด์ ‘ ์งˆ๋ฌธ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

Apache Superset์ด๋ž€?

Apache Superset์€ Apache Software Foundation์ด ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ์˜คํ”ˆ์†Œ์Šค ๋ฐ์ดํ„ฐ ํƒ์ƒ‰ ๋ฐ ์‹œ๊ฐํ™” ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. SQLAlchemy๋ฅผ ํ†ตํ•ด SQL์„ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•˜๊ณ , ๋…ธ์ฝ”๋“œ ์ฐจํŠธ ๋นŒ๋”์™€ ์™„์ „ํ•œ SQL IDE๋ฅผ ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋ฉฐ, ์ฐจํŠธ๋ฅผ ๋Œ€ํ™”ํ˜• ๋Œ€์‹œ๋ณด๋“œ๋กœ ์กฐํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ณผ์ •์€ ์‚ฌ์šฉ์ž๋‹น ๋ผ์ด์„ ์Šค ๋น„์šฉ ์—†์ด ์ž์ฒด ํ˜ธ์ŠคํŒ…์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

๋ชจ๋˜ ๋ฐ์ดํ„ฐ ์Šคํƒ์—์„œ Apache Superset์˜ ์œ„์น˜

Superset์€ Flask, SQLAlchemy, ๊ทธ๋ฆฌ๊ณ  React ํ”„๋ŸฐํŠธ์—”๋“œ ์œ„์— ๊ตฌ์ถ•๋œ Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค. ์ž์ฒด ์„ค์ •, ์ฐจํŠธ, ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(Postgres ๋˜๋Š” MySQL)์— ์ €์žฅํ•˜๊ณ , Celery ์›Œ์ปค๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ, ๊ฒฐ๊ณผ๋ฅผ Redis์— ์บ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ์ •์ ์œผ๋กœ ๋ถ„์„ ๋ฐ์ดํ„ฐ๋ฅผ ์ž์ฒด ์Šคํ† ๋ฆฌ์ง€๋กœ ๋ณต์‚ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฐจํŠธ๋Š” ์—ฐ๊ฒฐ๋œ ์›จ์–ดํ•˜์šฐ์Šค์— ๋Œ€ํ•ด ์‹ค์‹œ๊ฐ„ SQL์„ ๋ฐœํ–‰ํ•˜๋ฏ€๋กœ, Superset์€ ์ˆœ์ˆ˜ํ•œ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๋ ˆ์ด์–ด๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์œ„์น˜ ์„ค์ •์€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์Šคํƒ์—์„œ Fivetran์ด๋‚˜ Airbyte ๊ฐ™์€ ์ˆ˜์ง‘ ๋„๊ตฌ๊ฐ€ ์›์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์ ์žฌํ•˜๊ณ , ๋ณ€ํ™˜ ๋ ˆ์ด์–ด๊ฐ€ ์ด๋ฅผ ๋ชจ๋ธ๋งํ•˜๋ฉฐ, Superset์ด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง์— dbt๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŒ€์€ ๋งˆํŠธ ์œ„์— Superset์„ ์ง์ ‘ ์—ฐ๊ฒฐํ•˜๋Š”๋ฐ, ๊นจ๋—ํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋œ ์›จ์–ดํ•˜์šฐ์Šค๊ฐ€ ์…€ํ”„์„œ๋น„์Šค ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ธฐ๋ฐ˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํญ๋„“์€ ๋ฐ์ดํ„ฐ ๋ถ„์„ ์—ญ๋Ÿ‰์„ ์Œ“์œผ๋ ค๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ์ด๋Ÿฌํ•œ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ํ”ํ•œ ๋ฉด์ ‘ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค.

Superset์€ ๊ธฐ๋ณธ์ ์œผ๋กœ 40๊ฐœ๊ฐ€ ๋„˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”์ง„์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ณต์‹ ๋ฌธ์„œ๋Š” Snowflake, BigQuery, Postgres, Trino, ClickHouse, ๊ทธ๋ฆฌ๊ณ  2026๋…„ ๋ฆด๋ฆฌ์Šค์—์„œ ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋œ MongoDB(Atlas์™€ ์ž์ฒด ํ˜ธ์ŠคํŒ… ๋ชจ๋‘)์— ๋Œ€ํ•œ ์ปค๋„ฅํ„ฐ๋ฅผ ๋‚˜์—ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Explore ๋ทฐ๋กœ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋Œ€์‹œ๋ณด๋“œ ๊ตฌ์„ฑํ•˜๊ธฐ

Superset์˜ ๋ชจ๋“  ์ฐจํŠธ๋Š” ๋ฐ์ดํ„ฐ์…‹์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์…‹์€ ์—ฐ๊ฒฐ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋“ฑ๋ก๋œ ๋ฌผ๋ฆฌ ํ…Œ์ด๋ธ”์ด๊ฑฐ๋‚˜, Superset์ด ํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ ์ทจ๊ธ‰ํ•˜๋Š” ์ €์žฅ๋œ SQL ์ฟผ๋ฆฌ์ธ ๊ฐ€์ƒ ๋ฐ์ดํ„ฐ์…‹์ž…๋‹ˆ๋‹ค. ๊ฐ€์ƒ ๋ฐ์ดํ„ฐ์…‹์€ ์‹ค์šฉ์ ์ธ ์ถœ๋ฐœ์ ์ธ๋ฐ, ๋ถ„์„๊ฐ€๊ฐ€ ์›จ์–ดํ•˜์šฐ์Šค์— ๋Œ€ํ•œ DDL ๊ถŒํ•œ ์—†์ด๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์•„๋ž˜ ์˜ˆ์‹œ๋Š” ์›”๊ฐ„ ํ™œ์„ฑ ์‚ฌ์šฉ์ž๋ฅผ ๋ฏธ๋ฆฌ ์ง‘๊ณ„ํ•˜๋Š” ๊ฐ€์ƒ ๋ฐ์ดํ„ฐ์…‹์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฟผ๋ฆฌ๋ฅผ ํ•œ ๋ฒˆ ๋“ฑ๋กํ•˜๋ฉด ์ดํ›„์˜ ๋ชจ๋“  ์ฐจํŠธ๊ฐ€ ํ™œ์„ฑ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ๋™์ผํ•œ ์ •์˜๋ฅผ ์ƒ์†ํ•˜๋ฉฐ, ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์‹œ๋งจํ‹ฑ ๋ ˆ์ด์–ด๊ฐ€ ํŒ€ ์ „๋ฐ˜์˜ ์ง€ํ‘œ ํŽธ์ฐจ(metric drift)๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

sql
-- monthly_active_users.sql (virtual dataset)
SELECT
  date_trunc('month', event_date) AS activity_month,
  plan_tier,
  count(DISTINCT user_id)         AS active_users,
  count(*)                        AS total_events
FROM analytics.fct_events
WHERE event_date >= current_date - interval '24 months'
GROUP BY 1, 2
ORDER BY 1;

๋ฐ์ดํ„ฐ์…‹์ด ์ƒ์„ฑ๋˜๋ฉด Explore ๋ทฐ๋Š” ์ปฌ๋Ÿผ์„ ์ฐจ์›์œผ๋กœ, ์ง‘๊ณ„๋ฅผ ์ง€ํ‘œ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ถ„์„๊ฐ€๋Š” x์ถ•์— activity_month๋ฅผ, ์ง€ํ‘œ๋กœ active_users๋ฅผ, ์‹œ๋ฆฌ์ฆˆ๋กœ plan_tier๋ฅผ ๋†“์Šต๋‹ˆ๋‹ค. ์ฐจํŠธ ์ž์ฒด์—๋Š” SQL์ด ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ง€ํ‘œ๋Š” ๋ฐ์ดํ„ฐ์…‹ ์ˆ˜์ค€์—์„œ ์ €์žฅ๋œ SQL ํ‘œํ˜„์‹์œผ๋กœ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ, count(DISTINCT user_id) ๊ฐ™์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํ•œ ๋ฒˆ๋งŒ ์ž‘์„ฑํ•˜๊ณ  ์–ด๋””์„œ๋‚˜ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ฐจํŠธ๋ฅผ ๋Œ€์‹œ๋ณด๋“œ์— ๋ฐฐ์น˜ํ•˜๋ฉด ๋„ค์ดํ‹ฐ๋ธŒ ํ•„ํ„ฐ๊ฐ€ ๋‚ ์งœ ๋ฒ”์œ„๋‚˜ ์ง€์—ญ ์„ ํƒ๊ธฐ ๊ฐ™์€ ๋‹จ์ผ ์ปจํŠธ๋กค์„ ํŽ˜์ด์ง€์˜ ๋ชจ๋“  ์ฐจํŠธ์— ์ „ํŒŒํ•ฉ๋‹ˆ๋‹ค. ํฌ๋กœ์Šค ํ•„ํ„ฐ๋ง์€ ์—ฌ๊ธฐ์„œ ํ•œ ๊ฑธ์Œ ๋” ๋‚˜์•„๊ฐ‘๋‹ˆ๋‹ค. ํ•œ ์ฐจํŠธ์˜ ๋ง‰๋Œ€๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋‚˜๋จธ์ง€ ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ํ•ด๋‹น ๊ฐ’์œผ๋กœ ํ•„ํ„ฐ๋ง๋˜์–ด, ์ •์ ์ธ ๋ฆฌํฌํŠธ๋ฅผ ํƒ์ƒ‰ํ˜• ๋„๊ตฌ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. Superset์€ ์‹œ๊ณ„์—ด๊ณผ ํ”ผ๋ฒ— ํ…Œ์ด๋ธ”๋ถ€ํ„ฐ deck.gl ์ง€๋ฆฌ ๊ณต๊ฐ„ ๋ ˆ์ด์–ด๊นŒ์ง€ 50๊ฐ€์ง€๊ฐ€ ๋„˜๋Š” ์‹œ๊ฐํ™” ์œ ํ˜•์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ตœ๊ทผ ๋ฆด๋ฆฌ์Šค์—์„œ ๋„์ž…๋œ ECharts ๊ธฐ๋ฐ˜ ๋ Œ๋”๋Ÿฌ๋Š” ๋Œ€์šฉ๋Ÿ‰ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ๋„ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Superset 6.0์€ ๋ฐ์ดํ„ฐ์…‹์„ ์œ„ํ•œ ๊ณ„์ธตํ˜• ํด๋” ์‹œ์Šคํ…œ์„ ์ถ”๊ฐ€ํ•˜์—ฌ, ํ‰๋ฉด ๋ชฉ๋ก์„ ์Šคํฌ๋กคํ•˜๋Š” ๋Œ€์‹  ๊ด€๋ จ ์ง€ํ‘œ์™€ ์ปฌ๋Ÿผ์„ ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ผ๊ธ‰ ๋‹คํฌ ๋ชจ๋“œ๋ฅผ ๊ฐ–์ถ˜ Ant Design v5 ๊ธฐ๋ฐ˜์˜ ์™„์ „ํ•œ ๋””์ž์ธ ๊ฐœํŽธ์„ ์ œ๊ณตํ–ˆ๋Š”๋ฐ, ์ด๋Š” ์˜ค๋ž˜๋œ 3.x ๋ฐฐํฌํŒ์„ ์“ฐ๋‹ค๊ฐ€ ์ด ๋„๊ตฌ๋กœ ๋Œ์•„์˜จ ์‚ฌ๋žŒ์—๊ฒŒ ๊ฐ€์žฅ ๋ˆˆ์— ๋„๋Š” ๋ณ€ํ™”์ž…๋‹ˆ๋‹ค.

์บ์‹ฑ์ด ๋Œ€์‹œ๋ณด๋“œ ์†๋„๋ฅผ ์ขŒ์šฐํ•ฉ๋‹ˆ๋‹ค

๋ชจ๋“  ์ฐจํŠธ๊ฐ€ ์‹ค์‹œ๊ฐ„ SQL์„ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋Œ€์‹œ๋ณด๋“œ ์ง€์—ฐ ์‹œ๊ฐ„์€ ์›จ์–ดํ•˜์šฐ์Šค์™€ ์บ์‹œ๊ฐ€ ์ง€๋ฐฐํ•ฉ๋‹ˆ๋‹ค. Superset์€ ์„ค์ • ๊ฐ€๋Šฅํ•œ ํƒ€์ž„์•„์›ƒ๊ณผ ํ•จ๊ป˜ ๊ฒฐ๊ณผ๋ฅผ Redis์— ์บ์‹œํ•˜๋ฉฐ, ์ธ๋„ค์ผ๊ณผ ๋Œ€์‹œ๋ณด๋“œ ์บ์‹ฑ์ด ์ž์ฃผ ์กฐํšŒ๋˜๋Š” ํŽ˜์ด์ง€๋ฅผ ์˜ˆ์—ดํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์…‹๋ณ„๋กœ ์บ์‹œ ํƒ€์ž„์•„์›ƒ์„ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ(์ผ์ผ ์Šค๋ƒ…์ˆ์—๋Š” ๊ธธ๊ฒŒ, ์ค€์‹ค์‹œ๊ฐ„ ํ…Œ์ด๋ธ”์—๋Š” ์งง๊ฒŒ)์€ ๊ฐ€์žฅ ํšจ๊ณผ์ ์ธ ๋‹จ์ผ ์„ฑ๋Šฅ ์ง€๋ ›๋Œ€์ž…๋‹ˆ๋‹ค.

SQL Lab๊ณผ Jinja ํ…œํ”Œ๋ฆฟ: Superset์˜ ํ•ต์‹ฌ ๊ฐ•์ 

SQL Lab์€ ๋‚ด์žฅ SQL IDE์ด๋ฉฐ, Superset์ด ํฌ์ธํŠธ ์•ค ํด๋ฆญ ๋„๊ตฌ์™€ ์ฐจ๋ณ„ํ™”๋˜๋Š” ์ง€์ ์ž…๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ๋œ ์Šคํ‚ค๋งˆ์— ๋Œ€ํ•œ ์ž๋™ ์™„์„ฑ, ์žฅ์‹œ๊ฐ„ ์‹คํ–‰๋˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์œ„ํ•œ ๋น„๋™๊ธฐ ์‹คํ–‰, ์ฟผ๋ฆฌ ์ด๋ ฅ, ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ์›ํด๋ฆญ์œผ๋กœ ์ฐจํŠธ๋‚˜ ๊ฐ€์ƒ ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ฉด์ ‘์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ๋“ฑ์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์€ Jinja ํ…œํ”Œ๋ฆฟ์ž…๋‹ˆ๋‹ค. Superset์€ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์ปจํ…์ŠคํŠธ ์ธ์‹ ๋งคํฌ๋กœ๋ฅผ ์ฃผ์ž…ํ•˜์—ฌ, ๋‹จ์ผ ์ฟผ๋ฆฌ๊ฐ€ ๋Œ€์‹œ๋ณด๋“œ ํ•„ํ„ฐ, ํ˜„์žฌ ์‚ฌ์šฉ์ž, ๋˜๋Š” ์‹œ๊ฐ„ ๋ฒ”์œ„์— ๋งž์ถฐ ์ ์‘ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์‚ฐ๋ฌธ์—์„œ {{ current_username() }}์ด๋‚˜ {{ filter_values('country') }} ๊ฐ™์€ ํ…œํ”Œ๋ฆฟ ๋ณ€์ˆ˜๋ฅผ ์–ธ๊ธ‰ํ•  ๋•Œ๋Š” ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ, ์ฟผ๋ฆฌ ๋‚ด๋ถ€์—์„œ ๋งคํฌ๋กœ๋Š” ์‹คํ–‰ ์‹œ์ ์— ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค.

sql
-- revenue_by_segment.sql (SQL Lab with Jinja)
SELECT
  segment,
  sum(amount) AS revenue
FROM analytics.fct_orders
WHERE order_date BETWEEN '{{ from_dttm }}' AND '{{ to_dttm }}'
  {% if filter_values('country') %}
    AND country IN ({{ "'" + "','".join(filter_values('country')) + "'" }})
  {% endif %}
GROUP BY segment
ORDER BY revenue DESC;

์—ฌ๊ธฐ์„œ from_dttm๊ณผ to_dttm์€ ๋Œ€์‹œ๋ณด๋“œ ์‹œ๊ฐ„ ๋ฒ”์œ„์— ๋ฐ”์ธ๋”ฉ๋˜๊ณ , filter_values('country')๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ํ•„ํ„ฐ์—์„œ ์„ ํƒํ•œ ๊ฐ’์„ ์ฝ์–ด ์„ ํƒ์ด ์กด์žฌํ•  ๋•Œ๋งŒ ํ•ด๋‹น ๊ฐ’์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ•˜๋‚˜์˜ ์ €์žฅ๋œ ์ฟผ๋ฆฌ๊ฐ€ ์™„์ „ํ•œ ๋Œ€ํ™”ํ˜• ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๊ตฌ๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด ๋งคํฌ๋กœ๋Š” ํ‘œ์ค€ Jinja ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ํ”„๋กœ์ ํŠธ์— ๋ฌธ์„œํ™”๋œ Superset ์ „์šฉ ํ—ฌํผ๋กœ ํ™•์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Jinja๋Š” ๋˜ํ•œ ํ–‰ ์ˆ˜์ค€ ๋ณด์•ˆ ํ‘œํ˜„์‹๊ณผ ์„ค์ •์— ์ €์žฅ๋˜๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋งคํฌ๋กœ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ํŒ€์€ ๋งคํฌ๋กœ๋ฅผ ํ•œ ๋ฒˆ ์ •์˜ํ•˜๊ณ (์˜ˆ: ํ‘œ์ค€ ํšŒ๊ณ„์—ฐ๋„ ๊ฒฝ๊ณ„๋‚˜ ํ…Œ๋„ŒํŠธ ํ•„ํ„ฐ) ์–ด๋–ค ์ฟผ๋ฆฌ์—์„œ๋“  ํ˜ธ์ถœํ•˜์—ฌ, ์ˆ˜์‹ญ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ์…‹ ์ „๋ฐ˜์— ๊ฑธ์ณ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. SQL Lab์€ ์ฟผ๋ฆฌ ์ด๋ ฅ์„ ๋ณด์กดํ•˜๊ณ  ์–ด๋–ค ๊ฒฐ๊ณผ๋“  ์ €์žฅ๋œ ์ฟผ๋ฆฌ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋กœ์ง์ด ๊ฐ€์ƒ ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ์Šน๊ฒฉ๋˜๊ฑฐ๋‚˜ ์›จ์–ดํ•˜์šฐ์Šค๋กœ ํ‘ธ์‹œ๋˜๊ธฐ ์ „์˜ ๊ฐ€๋ฒผ์šด ๋ฒ„์ „ ๊ด€๋ฆฌ ์Šคํฌ๋ž˜์น˜ํŒจ๋“œ ์—ญํ• ๋„ ๊ฒธํ•ฉ๋‹ˆ๋‹ค. SQL ์œˆ๋„์šฐ ํ•จ์ˆ˜์— ์ต์ˆ™ํ•œ ๋ถ„์„๊ฐ€๋Š” SQL Lab์ด ๋‚˜์ค‘์— ๊ฐ€์ƒ ๋ฐ์ดํ„ฐ์…‹์ด ๋  ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ํ”„๋กœํ† ํƒ€์ดํ•‘ํ•˜๊ธฐ์— ์ž์—ฐ์Šค๋Ÿฌ์šด ๊ณต๊ฐ„์ž„์„ ์•Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Superset vs Tableau: ์˜คํ”ˆ์†Œ์Šค์™€ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ BI์˜ ๋Œ€๊ฒฐ

๊ฐ€์žฅ ํ”ํ•œ ํ‰๊ฐ€ ์งˆ๋ฌธ์€ Superset vs Tableau์ž…๋‹ˆ๋‹ค. ๋‘ ๋„๊ตฌ๋Š” ์ •๋ฐ˜๋Œ€์˜ ์ฒ ํ•™์œผ๋กœ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. Tableau๋Š” ๋ฐ์Šคํฌํ†ฑ ์ €์ž‘ ์•ฑ๊ณผ ์ขŒ์„๋‹น ๊ฐ€๊ฒฉ ์ •์ฑ…์„ ๊ฐ–์ถ˜ ์„ธ๋ จ๋œ ์ƒ์šฉ ์ œํ’ˆ์ธ ๋ฐ˜๋ฉด, Superset์€ ๋ผ์ด์„ ์Šค ๋น„์šฉ์ด ์—†๊ณ  ์ „์ฒด ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ž์ฒด ํ˜ธ์ŠคํŒ… ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค.

| ํ•ญ๋ชฉ | Apache Superset | Tableau | |-----------|-----------------|---------| | ๋ผ์ด์„ ์Šค | ๋ฌด๋ฃŒ, Apache 2.0 | ์‚ฌ์šฉ์ž๋‹น ๊ตฌ๋… | | ๋ฐฐํฌ | ์ž์ฒด ํ˜ธ์ŠคํŒ…(Docker, Kubernetes) | Cloud ๋˜๋Š” Server | | ๋ฐ์ดํ„ฐ ๋ชจ๋ธ | ์‹ค์‹œ๊ฐ„ SQL, ์ถ”์ถœ ์—”์ง„ ์—†์Œ | ์ธ๋ฉ”๋ชจ๋ฆฌ ์ถ”์ถœ์„ ์‚ฌ์šฉํ•˜๋Š” VizQL | | ์ปค์Šคํ„ฐ๋งˆ์ด์ง• | ์ „์ฒด ์†Œ์Šค, ํ”Œ๋Ÿฌ๊ทธ์ธ ์ฐจํŠธ | ํ์‡„ํ˜•, ํ™•์žฅ API | | ์˜คํ”„๋ผ์ธ ์ €์ž‘ | ๋ธŒ๋ผ์šฐ์ € ์ „์šฉ | Tableau Desktop | | ๊ฑฐ๋ฒ„๋„Œ์Šค | RBAC, ํ–‰ ์ˆ˜์ค€ ๋ณด์•ˆ | ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ฑฐ๋ฒ„๋„Œ์Šค ์ œํ’ˆ๊ตฐ |

Superset์€ ๋น„์šฉ, ํˆฌ๋ช…์„ฑ, ์›จ์–ดํ•˜์šฐ์Šค ๋„ค์ดํ‹ฐ๋ธŒ ์‹คํ–‰์—์„œ ์•ž์„œ๋ฉฐ, ์ด๋Š” SQL์— ๋Šฅ์ˆ™ํ•˜๊ณ  ์ตœ์‹  ํด๋ผ์šฐ๋“œ ์›จ์–ดํ•˜์šฐ์Šค๋ฅผ ๊ฐ–์ถ˜ ํŒ€์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. Tableau๋Š” ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ์ €์ž‘, ์ด์งˆ์ ์ธ ์†Œ์Šค์˜ ๋ธ”๋ Œ๋”ฉ, ์„ฑ์ˆ™ํ•œ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ฑฐ๋ฒ„๋„Œ์Šค์—์„œ ์šฐ์œ„๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ๊ตฌ๋„๊ฐ€ Power BI ๋Œ€ Tableau ๊ฒฐ์ •์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐฉ์ ์ด๊ณ  ์›จ์–ดํ•˜์šฐ์Šค ๋„ค์ดํ‹ฐ๋ธŒ์ธ ๋„๊ตฌ๋Š” SQL ์‹ค๋ ฅ์„ ๋ณด์ƒํ•˜๊ณ , ์ƒ์šฉ ์ œํ’ˆ๊ตฐ์€ ์™„์„ฑ๋„์™€ ์ง€์›์„ ๋ณด์ƒํ•ฉ๋‹ˆ๋‹ค. ์›จ์–ดํ•˜์šฐ์Šค ์šฐ์„  ์กฐ์ง์—๊ฒŒ Superset์€ ์ข…์ข… ๋” ๋‚˜์€ ์žฅ๊ธฐ์  ์„ ํƒ์ž…๋‹ˆ๋‹ค.

Data Analytics ๋ฉด์ ‘ ์ค€๋น„๊ฐ€ ๋˜์…จ๋‚˜์š”?

์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ, flashcards, ๊ธฐ์ˆ  ํ…Œ์ŠคํŠธ๋กœ ์—ฐ์Šตํ•˜์„ธ์š”.

ํ”„๋กœ๋•์…˜์„ ์œ„ํ•œ Apache Superset ๊ตฌ์„ฑ

Superset์€ ๊ธฐ๋ณธ๊ฐ’์„ ์žฌ์ •์˜ํ•˜๋Š” superset_config.py ํŒŒ์ผ์„ ํ†ตํ•ด ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๊ธฐ๋Šฅ์„ ์ผœ๊ณ  ๋„๋ฉฐ, ์บ์‹ฑ๊ณผ ๋น„๋™๊ธฐ ์ฟผ๋ฆฌ ์„ค์ •์ด ํ•ด๋‹น ๋ฐฐํฌ๊ฐ€ ์‹ค์ œ ํŠธ๋ž˜ํ”ฝ์„ ๊ฒฌ๋””๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์Šค๋‹ˆํŽซ์€ ํ˜„์‹ค์ ์ธ ํ”„๋กœ๋•์…˜ ๊ธฐ์ค€์„ ์„ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.

python
# superset_config.py
import os

SECRET_KEY = os.environ["SUPERSET_SECRET_KEY"]  # rotate, never commit
SQLALCHEMY_DATABASE_URI = os.environ["METADATA_DB_URI"]

FEATURE_FLAGS = {
    "DASHBOARD_RBAC": True,        # per-dashboard role access
    "ALERT_REPORTS": True,         # scheduled email/Slack reports
    "EMBEDDED_SUPERSET": True,     # embed dashboards via SDK
}

# Redis-backed result and metadata caching
CACHE_CONFIG = {
    "CACHE_TYPE": "RedisCache",
    "CACHE_DEFAULT_TIMEOUT": 300,
    "CACHE_REDIS_URL": os.environ["REDIS_URL"],
}

# Celery handles async SQL Lab queries and alerts
class CeleryConfig:
    broker_url = os.environ["REDIS_URL"]
    result_backend = os.environ["REDIS_URL"]

CELERY_CONFIG = CeleryConfig

๋ณด์•ˆ์€ ๊ณ„์ธตํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ญํ•  ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณต๋˜๋ฉฐ, Superset 6.0์€ ์‚ฌ์šฉ์ž ๊ทธ๋ฃน ๊ธฐ๋ฐ˜ ์ ‘๊ทผ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์—ญํ• ์ด ๊ฐœ์ธ์ด ์•„๋‹Œ ๊ทธ๋ฃน์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ํ–‰ ์ˆ˜์ค€ ๋ณด์•ˆ ๊ทœ์น™์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ์…‹์— ๋Œ€ํ•ด ์‹คํ–‰ํ•˜๋Š” ๋ชจ๋“  ์ฟผ๋ฆฌ์— WHERE ์ ˆ์„ ๋ง๋ถ™์—ฌ, ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๋ณต์ œํ•˜์ง€ ์•Š๊ณ ๋„ ํ…Œ๋„ŒํŠธ ๊ฒฉ๋ฆฌ๋ฅผ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์‹œํฌ๋ฆฟ ํ‚ค๋ฅผ ์ ˆ๋Œ€ ๋ฐฐํฌํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค

์ตœ๊ทผ ๋ฒ„์ „์˜ Superset์€ SECRET_KEY๊ฐ€ ๋ฌธ์„œํ™”๋œ ๊ธฐ๋ณธ๊ฐ’ ๊ทธ๋Œ€๋กœ ๋‚จ์•„ ์žˆ์œผ๋ฉด ์‹œ์ž‘์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ํ•ญ์ƒ ๊ฐ•๋ ฅํ•œ ํ™˜๊ฒฝ ์ฃผ์ž… ํ‚ค๋ฅผ ์ œ๊ณตํ•˜๊ณ  superset re-encrypt-secrets ๋ช…๋ น์œผ๋กœ ์ด๋ฅผ ๊ต์ฒดํ•˜์‹ญ์‹œ์˜ค. ํ‚ค๊ฐ€ ์œ ์ถœ๋˜๋ฉด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์Šคํ† ์–ด์— ์ €์žฅ๋œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž๊ฒฉ ์ฆ๋ช…์ด ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

๋ฐฐํฌ๋Š” ๋Œ€๊ฐœ ๊ณต์‹ Docker ์ด๋ฏธ์ง€๋‚˜ Kubernetes์˜ Helm ์ฐจํŠธ๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€๋ฉฐ, ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, Redis, Celery ์›Œ์ปค๊ฐ€ ๋ณ„๋„์˜ ์„œ๋น„์Šค๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์†Œ์Šค ์ €์žฅ์†Œ์™€ 6.0 ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ๋Š” ์ฐธ์กฐ ์•„ํ‚คํ…์ฒ˜์™€ ์—…๊ทธ๋ ˆ์ด๋“œ ๊ฒฝ๋กœ๋ฅผ ์ƒ์„ธํžˆ ๋ฌธ์„œํ™”ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Apache Superset ๋ฉด์ ‘ ์งˆ๋ฌธ

๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€์™€ ๋ถ„์„ ์—”์ง€๋‹ˆ์–ด๋ง ๋ฉด์ ‘์€ Superset์„ ์ ์  ๋” ์ง์ ‘์ ์œผ๋กœ ํŒŒ๊ณ ๋“ญ๋‹ˆ๋‹ค. ์•„๋ž˜ ์งˆ๋ฌธ๋“ค์€ 2026๋…„์— ์ฑ„์šฉํŒ€์ด ์‹ค์ œ๋กœ ๋ฌป๋Š” ๋‚ด์šฉ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

Superset์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๋Š” ์ „ํ†ต์ ์ธ BI ๋„๊ตฌ์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€์š”? Superset์€ ์ฐจํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ๋งˆ๋‹ค ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฟผ๋ฆฌํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ Redis์— ์บ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋…์ž์ ์ธ ์ถ”์ถœ ์—”์ง„์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ํ•ญ์ƒ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜์ง€๋งŒ ๋ถ€ํ•˜๋ฅผ ์›จ์–ดํ•˜์šฐ์Šค๋กœ ์ „๊ฐ€ํ•˜๋ฏ€๋กœ, ์„ฑ๋Šฅ์€ ๊ธฐ๋ฐ˜ ํ…Œ์ด๋ธ”๊ณผ ์บ์‹ฑ ์ „๋žต์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์ƒ ๋ฐ์ดํ„ฐ์…‹์ด๋ž€ ๋ฌด์—‡์ด๋ฉฐ ์–ธ์ œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋‚˜์š”? ๊ฐ€์ƒ ๋ฐ์ดํ„ฐ์…‹์€ ํ…Œ์ด๋ธ”์ฒ˜๋Ÿผ ์ทจ๊ธ‰๋˜๋Š” ์ €์žฅ๋œ SQL ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์›จ์–ดํ•˜์šฐ์Šค DDL ๊ถŒํ•œ ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ง€ํ‘œ ์ •์˜๋ฅผ ์›ํ•˜๋Š” ๋ถ„์„๊ฐ€์—๊ฒŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋ฌด๊ฑฐ์šด ๋ณ€ํ™˜์˜ ๊ฒฝ์šฐ, ๊ฐ€์ƒ ๋ฐ์ดํ„ฐ์…‹์€ ๋ชจ๋“  ์ฟผ๋ฆฌ๋งˆ๋‹ค ์ „์ฒด SQL์„ ์‹คํ–‰ํ•˜๋ฏ€๋กœ (dbt๋กœ ๊ตฌ์ถ•ํ•œ) ๋ชจ๋ธ๋ง๋œ ํ…Œ์ด๋ธ”์ด ๋” ๋‚ซ์Šต๋‹ˆ๋‹ค.

Jinja ํ…œํ”Œ๋ฆฟ์€ ์ฟผ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ๋™์ ์œผ๋กœ ๋งŒ๋“œ๋‚˜์š”? ๋งคํฌ๋กœ๋Š” ์‹คํ–‰ ์ „์— ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ๋Š” ์„ธ์…˜ ์‹ ์›์— ๋ฐ”์ธ๋”ฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๋ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, ์ด ํŒจํ„ด์€ ํ–‰ ์ˆ˜์ค€ ๋ณด์•ˆ์˜ ๊ธฐ๋ฐ˜์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

sql
-- user_scoped_orders.sql
SELECT order_id, amount, status
FROM analytics.fct_orders
WHERE owner_email = '{{ current_username() }}'
ORDER BY order_date DESC;

๋ฉ€ํ‹ฐํ…Œ๋„ŒํŠธ ๊ฒฉ๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ๊ฐ•์ œ๋˜๋‚˜์š”? ํ–‰ ์ˆ˜์ค€ ๋ณด์•ˆ ๊ทœ์น™์ด ์—ญํ• ๋ณ„๋กœ ๋ฐ์ดํ„ฐ์…‹์— ํ•„ํ„ฐ ์ ˆ์„ ๋ถ™์ด๋ฏ€๋กœ, ๋™์ผํ•œ ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ๊ฐ ํ…Œ๋„ŒํŠธ์—๊ฒŒ ์ž์‹ ์˜ ํ–‰๋งŒ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค. ๋Œ€์‹œ๋ณด๋“œ ์ˆ˜์ค€ RBAC์™€ ๊ฒฐํ•ฉํ•˜๋ฉด ๊ณ ๊ฐ๋งˆ๋‹ค ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋А๋ฆฐ ๋Œ€์‹œ๋ณด๋“œ๋Š” ์–ด๋–ป๊ฒŒ ์ง„๋‹จํ•˜๋‚˜์š”? ๋จผ์ € SQL Lab์—์„œ ๊ฐ€์žฅ ๋А๋ฆฐ ์ฐจํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ์›จ์–ดํ•˜์šฐ์Šค์—์„œ ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ณ„ํš์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํ”ํ•œ ์›์ธ์€ ๋ Œ๋”๋งํ•  ๋•Œ๋งˆ๋‹ค ๋ฌด๊ฑฐ์šด ์กฐ์ธ์„ ์‹คํ–‰ํ•˜๋Š” ๊ฐ€์ƒ ๋ฐ์ดํ„ฐ์…‹, ๋ˆ„๋ฝ๋œ ์›จ์–ดํ•˜์šฐ์Šค ํŒŒํ‹ฐ์…˜, ๊ทธ๋ฆฌ๊ณ  ๋„ˆ๋ฌด ๋‚ฎ๊ฒŒ ์„ค์ •๋œ ์บ์‹œ ํƒ€์ž„์•„์›ƒ์ž…๋‹ˆ๋‹ค. ํ•ด๊ฒฐ์ฑ…์€ dbt๋กœ ๋ฐ์ดํ„ฐ์…‹์„ ์ƒ๋ฅ˜์—์„œ ๊ตฌ์ฒดํ™”(materialize)ํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์บ์‹œ ํƒ€์ž„์•„์›ƒ์„ ๋†’์ด๊ณ  ์›จ์–ดํ•˜์šฐ์Šค ์ธ๋ฑ์Šค๋‚˜ ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค.

Alert์™€ Report ๊ธฐ๋Šฅ์€ ๋ฌด์—‡์— ์‚ฌ์šฉ๋˜๋‚˜์š”? ALERT_REPORTS ํ”Œ๋ž˜๊ทธ์™€ Celery beat๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Superset์ด ์ด๋ฉ”์ผ์ด๋‚˜ Slack์œผ๋กœ ์˜ˆ์•ฝ๋œ ๋Œ€์‹œ๋ณด๋“œ ์Šค๋ƒ…์ˆ์„ ์ „์†กํ•˜๊ณ , ์ง€ํ‘œ๊ฐ€ ์ž„๊ณ„๊ฐ’์„ ๋„˜์œผ๋ฉด ์•Œ๋ฆผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ณ„๋„์˜ ๋„๊ตฌ ์—†์ด ๋Œ€๋ถ€๋ถ„์˜ ์šด์˜ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ๋Œ€์‹œ๋ณด๋“œ๊ฐ€ ๊ตฌ์ถ•๋œ ๋’ค ์ž์ฃผ ์ด์–ด์ง€๋Š” ํ›„์† ์ฃผ์ œ์ž…๋‹ˆ๋‹ค.

Superset์ด ์ž˜๋ชป๋œ ์„ ํƒ์ธ ๊ฒฝ์šฐ๋Š” ์–ธ์ œ์ธ๊ฐ€์š”? ํŒ€์— SQL ์—ญ๋Ÿ‰์ด ์ „ํ˜€ ์—†๊ฑฐ๋‚˜, ์˜คํ”„๋ผ์ธ ๋ฐ์Šคํฌํ†ฑ ์ €์ž‘์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜, ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์ œํ’ˆ๊ตฐ์˜ ๊ฑฐ๋ฒ„๋„Œ์Šค์™€ ๋ฒค๋” ์ง€์›์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. Superset์€ SQL์— ๋Šฅ์ˆ™ํ•œ ํŒ€๊ณผ ์ฟผ๋ฆฌํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ์›จ์–ดํ•˜์šฐ์Šค๋ฅผ ์ „์ œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

2026๋…„์˜ Apache Superset์€ SQL ์‹ค๋ ฅ์„ ๋น„์šฉ ์—†๋Š” ์™„์ „ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ ๊ฐ€๋Šฅํ•œ ๋ถ„์„์œผ๋กœ ๋ณด์ƒํ•˜๋Š” ์„ฑ์ˆ™ํ•œ ์›จ์–ดํ•˜์šฐ์Šค ๋„ค์ดํ‹ฐ๋ธŒ BI ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. ํ•ต์‹ฌ ์š”์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Superset์„ ์ž์ฒด ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ž˜ ๋ชจ๋ธ๋ง๋œ ์›จ์–ดํ•˜์šฐ์Šค ์œ„์˜ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๋ ˆ์ด์–ด๋กœ ๋‹ค๋ฃจ์‹ญ์‹œ์˜ค.
  • ๊ฐ€์ƒ ๋ฐ์ดํ„ฐ์…‹๊ณผ ๋ฐ์ดํ„ฐ์…‹ ์ˆ˜์ค€ ์ง€ํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํ•œ ๋ฒˆ ์ •์˜ํ•˜๊ณ  ์—ฌ๋Ÿฌ ์ฐจํŠธ์—์„œ ์žฌ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
  • SQL Lab๊ณผ Jinja ํ…œํ”Œ๋ฆฟ์„ ์ˆ™๋‹ฌํ•˜์‹ญ์‹œ์˜ค. ๋™์  ์ฟผ๋ฆฌ์™€ ํ–‰ ์ˆ˜์ค€ ๋ณด์•ˆ์€ ๊ฐ€์žฅ ๋ ˆ๋ฒ„๋ฆฌ์ง€๊ฐ€ ํฐ Superset ์—ญ๋Ÿ‰์ž…๋‹ˆ๋‹ค.
  • SQL ๋Šฅ์ˆ™๋„, ์›จ์–ดํ•˜์šฐ์Šค ๋„ค์ดํ‹ฐ๋ธŒ ์‹คํ–‰, ๋ฌด๋น„์šฉ ๋ผ์ด์„ ์Šค๊ฐ€ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ ์ €์ž‘๋ณด๋‹ค ์ค‘์š”ํ•  ๋•Œ Tableau ๋Œ€์‹  Superset์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค.
  • ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ๋…ธ์ถœํ•˜๊ธฐ ์ „์— ์ฃผ์ž…๋œ SECRET_KEY, Redis ์บ์‹ฑ, Celery ์›Œ์ปค, ๊ทธ๋ฃน ๊ธฐ๋ฐ˜ RBAC๋กœ ํ”„๋กœ๋•์…˜์„ ์ž ๊ทธ์‹ญ์‹œ์˜ค.

์—ฐ์Šต์„ ์‹œ์ž‘ํ•˜์„ธ์š”!

๋ฉด์ ‘ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์™€ ๊ธฐ์ˆ  ํ…Œ์ŠคํŠธ๋กœ ์ง€์‹์„ ํ…Œ์ŠคํŠธํ•˜์„ธ์š”.

ํƒœ๊ทธ

#apache-superset
#data-analytics
#dashboards
#business-intelligence
#interview

๊ณต์œ 

๊ด€๋ จ ๊ธฐ์‚ฌ

Pandas 3.0 new APIs and breaking changes guide

Pandas 3.0 ์™„๋ฒฝ ๊ฐ€์ด๋“œ(2026): ์ƒˆ๋กœ์šด API, ์ฃผ์š” ๋ณ€๊ฒฝ์‚ฌํ•ญ, ๋ฉด์ ‘ ์งˆ๋ฌธ ์ด์ •๋ฆฌ

Pandas 3.0์˜ Copy-on-Write, PyArrow ๋ฌธ์ž์—ด ๋ฐฑ์—”๋“œ, pd.col() ํ‘œํ˜„์‹ ๋นŒ๋” ๋“ฑ ํ•ต์‹ฌ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ƒ์„ธํžˆ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๋ถ„์„ ์—”์ง€๋‹ˆ์–ด ๋ฉด์ ‘์—์„œ ์ถœ์ œ๋˜๋Š” ํ•ต์‹ฌ ์งˆ๋ฌธ๋„ ํ•จ๊ป˜ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

dbt data build tool for data analysts modeling testing

2026๋…„ ๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€๋ฅผ ์œ„ํ•œ dbt ์™„๋ฒฝ ๊ฐ€์ด๋“œ: ๋ชจ๋ธ๋ง, ํ…Œ์ŠคํŠธ, ๋ฉด์ ‘ ์งˆ๋ฌธ

dbt ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ, ๋จธํ‹ฐ๋ฆฌ์–ผ๋ผ์ด์ œ์ด์…˜ ์ „๋žต, ๋ฐ์ดํ„ฐ ํ’ˆ์งˆ ํ…Œ์ŠคํŠธ, Jinja ๋งคํฌ๋กœ, ๊ทธ๋ฆฌ๊ณ  ์‹ค๋ฌด ๋ฉด์ ‘์—์„œ ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ์งˆ๋ฌธ๊นŒ์ง€ ํฌ๊ด„์ ์œผ๋กœ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

2026๋…„ ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” ๋ฐ ๋น„์ฆˆ๋‹ˆ์Šค ์ธํ…”๋ฆฌ์ „์Šค์—์„œ Power BI์™€ Tableau ๋น„๊ต

Power BI vs Tableau 2026๋…„ ์™„๋ฒฝ ๋น„๊ต: ๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€๊ฐ€ ๋ฐฐ์›Œ์•ผ ํ•  ๋„๊ตฌ๋Š”?

2026๋…„ Power BI์™€ Tableau๋ฅผ ๊ฐ€๊ฒฉ, AI ๊ธฐ๋Šฅ, ์‹œ๊ฐํ™” ์„ฑ๋Šฅ, ์ปค๋ฆฌ์–ด ๊ฐ€์น˜ ์ธก๋ฉด์—์„œ ๋น„๊ต ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๋ถ„์„ ์ „๋ฌธ๊ฐ€๋ฅผ ์œ„ํ•œ BI ๋„๊ตฌ ์„ ํƒ ๊ฐ€์ด๋“œ์ž…๋‹ˆ๋‹ค.