Skip to content

minyeamer/flooks

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

20 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

LookFlex β€” μ»€μŠ€ν…€ λΉ„μ¦ˆλ‹ˆμŠ€ λŒ€μ‹œλ³΄λ“œ ν”Œλž«νΌ

Google Looker Studio의 ν•œκ³„λ₯Ό κ·Ήλ³΅ν•˜κ³ , 컀머슀 도메인에 μ΅œμ ν™”λœ 사내 μ „μš© 데이터 μ‹œκ°ν™” ν”Œλž«νΌ


λͺ©μ°¨

  1. ν”„λ‘œμ νŠΈ λ°°κ²½ 및 λͺ©ν‘œ
  2. ν•΄κ²°ν•˜λ €λŠ” 문제
  3. μ‹œμŠ€ν…œ κ°œμš”
  4. 기술 μŠ€νƒ
  5. μ•„ν‚€ν…μ²˜ 섀계
  6. 디렉터리 ꡬ쑰
  7. μ£Όμš” κΈ°λŠ₯ λͺ©λ‘
  8. 데이터 흐름
  9. 배포 μ „λž΅
  10. 개발 λ‘œλ“œλ§΅

1. ν”„λ‘œμ νŠΈ λ°°κ²½ 및 λͺ©ν‘œ

LookFlexλŠ” Google Looker Studioλ₯Ό λŒ€μ²΄ν•˜κΈ° μœ„ν•΄ μ‹œμž‘λœ 사내 μ „μš© λŒ€μ‹œλ³΄λ“œ ν”Œλž«νΌμž…λ‹ˆλ‹€. BigQuery에 적재된 맀좜 및 κ΄‘κ³  데이터λ₯Ό 기반으둜, ꡬ성원 κ°μžκ°€ μ›ν•˜λŠ” λ°©μ‹μœΌλ‘œ 데이터λ₯Ό μ‘°νšŒν•˜κ³  μ‹œκ°ν™”ν•  수 μžˆλŠ” ν™˜κ²½μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

핡심 λͺ©ν‘œ

  • ν…Œμ΄λΈ” μ€‘μ‹¬μ˜ 데이터 쑰회 및 뢄석 ν™˜κ²½ 제곡
  • μ‚¬μš©μžλ³„ λ·°/λ©”νŠΈλ¦­ μ»€μŠ€ν„°λ§ˆμ΄μ§• μ„€μ • μ €μž₯ 및 볡원
  • 쑰건뢀 μ„œμ‹, μ •λ ¬, 필터링을 UI뿐만 μ•„λ‹ˆλΌ μ„€μ • νŒŒμΌλ‘œλ„ 관리
  • 100λͺ… 미만 규λͺ¨μ˜ 사내 ꡬ성원 λŒ€μƒ, μ—­ν•  기반 μ ‘κ·Ό μ œμ–΄
  • 둜컬 μ„œλ²„ μš°μ„  운영, 이후 인터넷 곡개 배포 κ°€λŠ₯ν•œ ꡬ쑰

2. ν•΄κ²°ν•˜λ €λŠ” 문제

문제 Looker Studio ν˜„ν™© LookFlex λͺ©ν‘œ
λ ˆμ΄μ•„μ›ƒ μžμœ λ„ λΆ€μ‘± κ·Έλ¦¬λ“œ 간격이 λ„“μ–΄ ν‘œ λ°°μΉ˜κ°€ λΆ€μžμ—°μŠ€λŸ¬μ›€ px λ‹¨μœ„ 자유 배치 + κ·Έλ¦¬λ“œ μ„€μ • μ˜΅μ…˜ 제곡
λ©”νŠΈλ¦­ λ³€κ²½ UX 뢈편 쑰회 κΆŒν•œ μ‚¬μš©μžκ°€ 헀더 μ•„μ΄μ½˜μ„ μ°Ύμ•„ 클릭해야 함 μ‚¬μ΄λ“œλ°” λ˜λŠ” 상단 컨트둀 νŒ¨λ„λ‘œ 직관적 μ „ν™˜
쑰건뢀 μ„œμ‹ μ„€μ • λΉ„νš¨μœ¨ μ—΄ λ‹¨μœ„λ‘œ 마우슀 UI μ‘°μž‘ 반볡 JSON/YAML μ„€μ •μœΌλ‘œ 일괄 적용, UIμ—μ„œλ„ νŽΈμ§‘ κ°€λŠ₯
λ·° μ €μž₯/곡유 λΆˆκ°€ 개인 섀정이 μ €μž₯λ˜μ§€ μ•ŠμŒ μ‚¬μš©μžλ³„ μ»€μŠ€ν…€ λ·°λ₯Ό DB에 μ €μž₯ν•˜κ³  볡원
μ—­ν•  기반 μ ‘κ·Ό μ œμ–΄ 미흑 보기/νŽΈμ§‘ κΆŒν•œμ΄ λ‹¨μˆœν•¨ Admin / Editor / Viewer μ—­ν•  뢄리

3. μ‹œμŠ€ν…œ κ°œμš”

[BigQuery]
    β”‚  배치 ETL (예: 맀일 μƒˆλ²½ 집계)
    β–Ό
[FastAPI λ°±μ—”λ“œ]  ←──────────────────────────────┐
    β”‚  REST API (JWT 인증)                       β”‚
    β–Ό                                           β”‚
[Next.js ν”„λ‘ νŠΈμ—”λ“œ]  ←→  [μ‚¬μš©μž λΈŒλΌμš°μ €]       β”‚
                                                β”‚
[PostgreSQL]  ←── μ‚¬μš©μž 계정, λŒ€μ‹œλ³΄λ“œ μ„€μ • μ €μž₯  β”‚
[Redis]       ←── 쿼리 κ²°κ³Ό μΊμ‹œ (선택)  β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

4. 기술 μŠ€νƒ

4-1. ν”„λ‘ νŠΈμ—”λ“œ

ν•­λͺ© 선택 이유
ν”„λ ˆμž„μ›Œν¬ Next.js 14+ (App Router) SSR/SSG 지원, API Route ν™œμš© κ°€λŠ₯, 배포 μœ μ—°μ„±
μ–Έμ–΄ TypeScript νƒ€μž… μ•ˆμ „μ„±, μœ μ§€λ³΄μˆ˜μ„±
μŠ€νƒ€μΌλ§ Tailwind CSS + shadcn/ui λΉ λ₯Έ UI ꡬ성, μ»΄ν¬λ„ŒνŠΈ μ»€μŠ€ν„°λ§ˆμ΄μ§• 용이
ν…Œμ΄λΈ” TanStack Table v8 정렬·필터·가상 μŠ€ν¬λ‘€Β·μ‘°κ±΄λΆ€ μ„œμ‹Β·μ»¬λŸΌ μ»€μŠ€ν„°λ§ˆμ΄μ§•μ„ μ½”λ“œ λ ˆλ²¨μ—μ„œ μ™„μ „ μ œμ–΄
차트 Apache ECharts (echarts-for-react) λ³΅μž‘ν•œ μ»€μŠ€ν„°λ§ˆμ΄μ§•, λŒ€μš©λŸ‰ 데이터 λ Œλ”λ§ μ„±λŠ₯ 우수
μ„œλ²„ μƒνƒœ 관리 TanStack Query (React Query) 캐싱, λ°±κ·ΈλΌμš΄λ“œ κ°±μ‹ , λ‘œλ”©/μ—λŸ¬ μƒνƒœ 관리
ν΄λΌμ΄μ–ΈνŠΈ μƒνƒœ Zustand κ²½λŸ‰, λ‹¨μˆœν•œ μ „μ—­ μƒνƒœ 관리
폼 React Hook Form + Zod μœ νš¨μ„± 검사, νƒ€μž… μΆ”λ‘ 
λ‚ μ§œ date-fns κ²½λŸ‰ λ‚ μ§œ μœ ν‹Έλ¦¬ν‹°

4-2. λ°±μ—”λ“œ

ν•­λͺ© 선택 이유
ν”„λ ˆμž„μ›Œν¬ FastAPI (Python 3.11+) 비동기 지원, μžλ™ OpenAPI λ¬Έμ„œ, BigQuery λ“± 데이터 μƒνƒœκ³„μ™€ 동일 μ–Έμ–΄
ORM SQLAlchemy 2.0 (async) PostgreSQL과의 비동기 톡합, λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 관리 용이
λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ Alembic SQLAlchemy와 ν†΅ν•©λœ DB μŠ€ν‚€λ§ˆ 버전 관리
인증 JWT (python-jose) + bcrypt (passlib) Stateless 인증, 둜컬/인터넷 ν™˜κ²½ λͺ¨λ‘ 적합
데이터 검증 Pydantic v2 FastAPI와 λ„€μ΄ν‹°λΈŒ 톡합, λΉ λ₯Έ 직렬화
BigQuery 연동 google-cloud-bigquery 곡식 Python ν΄λΌμ΄μ–ΈνŠΈ, pandas 연동 지원
배치 μŠ€μΌ€μ€„λŸ¬ APScheduler (λ˜λŠ” μ™ΈλΆ€ cron) μ •ν•΄μ§„ μ‹œκ°„μ— BigQuery β†’ PostgreSQL ETL μ‹€ν–‰

4-3. λ°μ΄ν„°λ² μ΄μŠ€ / 인프라

ν•­λͺ© 선택 이유
μ£Ό DB PostgreSQL 16 μ‚¬μš©μž 계정, λŒ€μ‹œλ³΄λ“œ ꡬ성, μ»€μŠ€ν…€ μ„€μ • μ €μž₯
μΊμ‹œ (선택) Redis 7 BigQuery 쿼리 κ²°κ³Ό 캐싱, μ„Έμ…˜ 토큰 관리
μ»¨ν…Œμ΄λ„ˆ Docker + Docker Compose 둜컬 μ„œλ²„ 일관성 μžˆλŠ” μ‹€ν–‰ ν™˜κ²½, 이후 ν΄λΌμš°λ“œ 이전 용이
λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ Nginx ν”„λ‘ νŠΈΒ·λ°±μ—”λ“œ 단일 도메인 λΌμš°νŒ…, ν–₯ν›„ HTTPS 적용
ν™˜κ²½ λ³€μˆ˜ 관리 .env + python-dotenv / Next.js env 둜컬/ν”„λ‘œλ•μ…˜ ν™˜κ²½ 뢄리

4-4. 기술 μŠ€νƒ μš”μ•½ λ‹€μ΄μ–΄κ·Έλž¨

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Browser                          β”‚
β”‚  Next.js (TypeScript)                               β”‚
β”‚  TanStack Table β”‚ ECharts β”‚ TanStack Query β”‚ Zustand β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚ HTTPS / REST API
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                  Nginx (Reverse Proxy)               β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚                                 β”‚
β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”                 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”
β”‚  FastAPI    β”‚                 β”‚   Next.js      β”‚
β”‚  (Python)   β”‚                 β”‚   (Static/SSR) β”‚
β”‚  Port 8000  β”‚                 β”‚   Port 3000    β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜                 β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   PostgreSQL  β”‚  Redis   β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
       β”‚
β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”
β”‚  BigQuery   β”‚  (Google Cloud β€” 읽기 μ „μš©)
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

5. μ•„ν‚€ν…μ²˜ 섀계

5-1. 인증 흐름

1. μ‚¬μš©μž β†’ POST /api/auth/login (email + password)
2. FastAPI β†’ bcrypt λΉ„λ°€λ²ˆν˜Έ 검증
3. FastAPI β†’ JWT Access Token (15λΆ„) + Refresh Token (7일) λ°œκΈ‰
4. ν”„λ‘ νŠΈ β†’ Access Token을 λ©”λͺ¨λ¦¬μ— μ €μž₯, Refresh Token은 HttpOnly Cookie
5. 만료 μ‹œ β†’ /api/auth/refresh 둜 μžλ™ κ°±μ‹ 

5-2. μ—­ν• (Role) 섀계

μ—­ν•  κΆŒν•œ
Admin μ‚¬μš©μž 관리, λ°μ΄ν„°μ†ŒμŠ€ μ—°κ²°, λŒ€μ‹œλ³΄λ“œ μƒμ„±Β·νŽΈμ§‘Β·μ‚­μ œ
Editor λŒ€μ‹œλ³΄λ“œ νŽΈμ§‘, λ·° μ €μž₯, 쑰건뢀 μ„œμ‹ μ„€μ •
Viewer λŒ€μ‹œλ³΄λ“œ 쑰회, 개인 λ·° μ €μž₯ (λ‹€λ₯Έ μ‚¬λžŒμ—κ²ŒλŠ” λΉ„κ³΅κ°œ)

5-3. λŒ€μ‹œλ³΄λ“œ μ„€μ • μ €μž₯ ꡬ쑰 (PostgreSQL)

μ‚¬μš©μžλ³„ μ»€μŠ€ν„°λ§ˆμ΄μ§• 섀정은 JSONB 컬럼으둜 μœ μ—°ν•˜κ²Œ μ €μž₯ν•©λ‹ˆλ‹€.

-- λŒ€μ‹œλ³΄λ“œ
CREATE TABLE dashboards (
    id          UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    name        VARCHAR(255) NOT NULL,
    owner_id    UUID REFERENCES users(id),
    config      JSONB,          -- λ ˆμ΄μ•„μ›ƒ, μœ„μ ― 배치 정보
    is_public   BOOLEAN DEFAULT false,
    created_at  TIMESTAMPTZ DEFAULT now(),
    updated_at  TIMESTAMPTZ DEFAULT now()
);

-- μ‚¬μš©μžλ³„ λ·° μ˜€λ²„λΌμ΄λ“œ (개인 μ»€μŠ€ν„°λ§ˆμ΄μ§•)
CREATE TABLE user_view_configs (
    id              UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    user_id         UUID REFERENCES users(id),
    dashboard_id    UUID REFERENCES dashboards(id),
    widget_id       VARCHAR(100),
    config          JSONB,      -- λ©”νŠΈλ¦­ 선택, 쑰건뢀 μ„œμ‹, μ •λ ¬ λ“±
    created_at      TIMESTAMPTZ DEFAULT now(),
    updated_at      TIMESTAMPTZ DEFAULT now(),
    UNIQUE (user_id, dashboard_id, widget_id)
);

config JSONB μ˜ˆμ‹œ (ν…Œμ΄λΈ” μœ„μ ―)

{
  "metrics": ["settlement_amount", "margin", "roi"],
  "sort": { "column": "settlement_amount", "direction": "desc" },
  "conditionalFormatting": [
    {
      "column": "roi",
      "rules": [
        { "condition": "lt", "value": 0, "style": { "backgroundColor": "#fee2e2", "color": "#dc2626" } },
        { "condition": "gte", "value": 50, "style": { "backgroundColor": "#dcfce7", "color": "#16a34a" } }
      ]
    }
  ],
  "columnWidths": { "brand": 120, "roi": 80 },
  "frozenColumns": ["brand"]
}

6. 디렉터리 ꡬ쑰

lookflex/
β”œβ”€β”€ apps/
β”‚   β”œβ”€β”€ frontend/                  # Next.js μ•±
β”‚   β”‚   β”œβ”€β”€ app/                   # App Router
β”‚   β”‚   β”‚   β”œβ”€β”€ (auth)/            # 둜그인/νšŒμ›κ°€μž… νŽ˜μ΄μ§€
β”‚   β”‚   β”‚   β”œβ”€β”€ dashboard/         # λŒ€μ‹œλ³΄λ“œ λ·°
β”‚   β”‚   β”‚   └── admin/             # κ΄€λ¦¬μž νŽ˜μ΄μ§€
β”‚   β”‚   β”œβ”€β”€ components/
β”‚   β”‚   β”‚   β”œβ”€β”€ table/             # TanStack Table 기반 μ»΄ν¬λ„ŒνŠΈ
β”‚   β”‚   β”‚   β”œβ”€β”€ chart/             # ECharts 래퍼 μ»΄ν¬λ„ŒνŠΈ
β”‚   β”‚   β”‚   └── ui/                # shadcn/ui 곡톡 μ»΄ν¬λ„ŒνŠΈ
β”‚   β”‚   β”œβ”€β”€ lib/
β”‚   β”‚   β”‚   β”œβ”€β”€ api/               # API ν΄λΌμ΄μ–ΈνŠΈ (axios/fetch)
β”‚   β”‚   β”‚   └── store/             # Zustand μŠ€ν† μ–΄
β”‚   β”‚   └── ...
β”‚   β”‚
β”‚   └── backend/                   # FastAPI μ•±
β”‚       β”œβ”€β”€ app/
β”‚       β”‚   β”œβ”€β”€ api/
β”‚       β”‚   β”‚   β”œβ”€β”€ auth.py        # 인증 λΌμš°ν„°
β”‚       β”‚   β”‚   β”œβ”€β”€ dashboards.py  # λŒ€μ‹œλ³΄λ“œ CRUD
β”‚       β”‚   β”‚   β”œβ”€β”€ data.py        # BigQuery 데이터 쑰회
β”‚       β”‚   β”‚   └── users.py       # μ‚¬μš©μž 관리
β”‚       β”‚   β”œβ”€β”€ core/
β”‚       β”‚   β”‚   β”œβ”€β”€ config.py      # ν™˜κ²½λ³€μˆ˜, μ„€μ •
β”‚       β”‚   β”‚   └── security.py    # JWT, bcrypt
β”‚       β”‚   β”œβ”€β”€ db/
β”‚       β”‚   β”‚   β”œβ”€β”€ models.py      # SQLAlchemy λͺ¨λΈ
β”‚       β”‚   β”‚   └── session.py     # DB μ„Έμ…˜
β”‚       β”‚   β”œβ”€β”€ services/
β”‚       β”‚   β”‚   β”œβ”€β”€ bigquery.py    # BigQuery 쿼리 μ„œλΉ„μŠ€
β”‚       β”‚   β”‚   └── etl.py         # 배치 ETL 둜직
β”‚       β”‚   └── main.py
β”‚       └── alembic/               # DB λ§ˆμ΄κ·Έλ ˆμ΄μ…˜
β”‚
β”œβ”€β”€ docker-compose.yml
β”œβ”€β”€ docker-compose.prod.yml
β”œβ”€β”€ nginx/
β”‚   └── nginx.conf
└── README.md

7. μ£Όμš” κΈ°λŠ₯ λͺ©λ‘

Phase 1 β€” 핡심 기반 (MVP)

  • μ‚¬μš©μž 인증 (둜그인 / λ‘œκ·Έμ•„μ›ƒ / JWT κ°±μ‹ )
  • μ—­ν•  기반 μ ‘κ·Ό μ œμ–΄ (Admin / Editor / Viewer)
  • BigQuery μ—°κ²° 및 데이터 쑰회 API
  • ν…Œμ΄λΈ” μœ„μ ―: μ •λ ¬, ν•„ν„°, νŽ˜μ΄μ§€λ„€μ΄μ…˜
  • λŒ€μ‹œλ³΄λ“œ λ ˆμ΄μ•„μ›ƒ μ €μž₯/뢈러였기
  • μ‚¬μš©μžλ³„ λ©”νŠΈλ¦­ 선택 μ €μž₯ (개인 λ·°)

Phase 2 β€” ν…Œμ΄λΈ” 고도화

  • 쑰건뢀 μ„œμ‹: JSON μ„€μ • 및 UI νŽΈμ§‘κΈ° 지원
  • 컬럼 κ³ μ •(freeze), 컬럼 λ„ˆλΉ„ μ‘°μ • μ €μž₯
  • ν–‰ κ·Έλ£Ήν•‘ 및 μ†Œκ³„/합계 ν–‰
  • λ“œλ¦΄λ‹€μš΄ (λΈŒλžœλ“œ β†’ μƒν’ˆ β†’ SKU)
  • CSV / Excel 내보내기

Phase 3 β€” 차트 및 UX

  • 꺾은선 κ·Έλž˜ν”„, λ§‰λŒ€ κ·Έλž˜ν”„, λˆ„μ  λ§‰λŒ€ (ECharts)
  • λ‚ μ§œ λ²”μœ„ ν•„ν„° (μ „μ—­ 컨트둀 νŒ¨λ„)
  • ν•„ν„° κ°’ URL νŒŒλΌλ―Έν„° 동기화 (링크 곡유)
  • λŒ€μ‹œλ³΄λ“œ 뢁마크 / 즐겨찾기

Phase 4 β€” 운영 및 ν™•μž₯

  • Admin νŽ˜μ΄μ§€: μ‚¬μš©μž μ΄ˆλŒ€, μ—­ν•  λ³€κ²½
  • 감사 둜그 (λˆ„κ°€ μ–Έμ œ μ–΄λ–€ 데이터 쑰회)
  • 배치 ETL λͺ¨λ‹ˆν„°λ§ (λ§ˆμ§€λ§‰ μ‹€ν–‰ μ‹œκ°„, μ‹€νŒ¨ μ•Œλ¦Ό)
  • HTTPS / μ™ΈλΆ€ 인터넷 배포 지원

8. 데이터 흐름

8-1. 배치 ETL (BigQuery β†’ PostgreSQL 집계 μΊμ‹œ, 선택)

μ†Œκ·œλͺ¨ 사내 ν™˜κ²½μ—μ„œλŠ” BigQueryλ₯Ό 직접 μ‘°νšŒν•΄λ„ λ¬΄λ°©ν•˜μ§€λ§Œ, 응닡 속도 및 λΉ„μš© μ΅œμ ν™”κ°€ ν•„μš”ν•˜λ©΄ 집계 κ²°κ³Όλ₯Ό PostgreSQL에 μΊμ‹±ν•©λ‹ˆλ‹€.

맀일 μƒˆλ²½ Nμ‹œ (APScheduler / cron)
  β†’ FastAPI ETL μ„œλΉ„μŠ€ μ‹€ν–‰
  β†’ BigQueryμ—μ„œ 일별 집계 쿼리 μ‹€ν–‰
  β†’ κ²°κ³Όλ₯Ό PostgreSQL `daily_aggregates` ν…Œμ΄λΈ”μ— upsert
  β†’ Redis μΊμ‹œ λ¬΄νš¨ν™”

8-2. μ‹€μ‹œκ°„ 쑰회 흐름 (직접 쿼리 λͺ¨λ“œ)

λΈŒλΌμš°μ € β†’ GET /api/data/sales?date=2026-02-02&brand=λ‹₯ν„°νŠΈλ£¨
  β†’ FastAPI β†’ google-cloud-bigquery ν΄λΌμ΄μ–ΈνŠΈλ‘œ 쿼리 μ‹€ν–‰
  β†’ κ²°κ³Ό JSON λ°˜ν™˜ β†’ TanStack Queryκ°€ 캐싱 (staleTime μ„€μ •)
  β†’ TanStack Table둜 λ Œλ”λ§

9. 배포 μ „λž΅

둜컬 μ„œλ²„ (ν˜„μž¬)

# 전체 μŠ€νƒ μ‹€ν–‰
docker compose up -d

# μ„œλΉ„μŠ€ ꡬ성
# - frontend:  http://localhost:3000
# - backend:   http://localhost:8000
# - nginx:     http://localhost:80  (단일 μ§„μž…μ )
# - postgres:  localhost:5432
# - redis:     localhost:6379

인터넷 곡개 배포 (ν–₯ν›„)

ν•­λͺ© λ°©μ•ˆ
μ„œλ²„ 사내 μ„œλ²„μ— 곡인 IP ν• λ‹Ή λ˜λŠ” AWS EC2 / GCP Compute Engine
HTTPS Let's Encrypt + Nginx certbot
도메인 사내 도메인 λ˜λŠ” μ„œλΈŒλ„λ©”μΈ μ„€μ •
CI/CD GitHub Actions β†’ Docker 이미지 λΉŒλ“œ β†’ μ„œλ²„ SSH 배포
λ°±μ—… PostgreSQL pg_dump 일 1회 cron + GCS/S3 μ—…λ‘œλ“œ

Docker Compose 기반으둜 κ°œλ°œν•˜λ©΄ 둜컬 β†’ ν΄λΌμš°λ“œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ‹œ docker-compose.prod.yml μ˜€λ²„λΌμ΄λ“œλ§ŒμœΌλ‘œ ν™˜κ²½ μ „ν™˜μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.


10. 개발 λ‘œλ“œλ§΅

2026 Q1  ───────────────────────────────────────────────────────►
  β”‚
  β”œβ”€ [Week 1-2]  ν”„λ‘œμ νŠΈ 골격 μ„ΈνŒ…
  β”‚               Docker Compose, PostgreSQL, FastAPI μ΄ˆκΈ°ν™”
  β”‚               Next.js ν”„λ‘œμ νŠΈ μ„ΈνŒ…, 인증 UI
  β”‚
  β”œβ”€ [Week 3-4]  인증 μ™„μ„± + BigQuery μ—°κ²°
  β”‚               JWT λ°œκΈ‰/검증, μ—­ν•  미듀웨어
  β”‚               BigQuery μ„œλΉ„μŠ€ 계정 연동, 데이터 API
  β”‚
  β”œβ”€ [Week 5-6]  MVP ν…Œμ΄λΈ” μœ„μ ―
  β”‚               TanStack Table 기반 맀좜 μš”μ•½ ν…Œμ΄λΈ”
  β”‚               λ©”νŠΈλ¦­ 선택, μ •λ ¬, κΈ°λ³Έ ν•„ν„°
  β”‚
  β”œβ”€ [Week 7-8]  μ„€μ • μ €μž₯ + 쑰건뢀 μ„œμ‹
  β”‚               μ‚¬μš©μžλ³„ λ·° config DB μ €μž₯/뢈러였기
  β”‚               쑰건뢀 μ„œμ‹ UI νŽΈμ§‘κΈ° + JSON νŒŒμ‹±
  β”‚
2026 Q2
  β”œβ”€ [Week 9-12]  차트 μœ„μ ― + λŒ€μ‹œλ³΄λ“œ λ ˆμ΄μ•„μ›ƒ
  β”‚
  └─ [Week 13+]   운영 κΈ°λŠ₯, μ™ΈλΆ€ 배포 μ€€λΉ„

κΈ°μ—¬ 및 개발 ν™˜κ²½ μ„€μ •

상세 λ‚΄μš©μ€ 각 μ•±μ˜ READMEλ₯Ό μ°Έκ³ ν•˜μ„Έμš”.

# μ €μž₯μ†Œ 클둠
git clone https://github.com/cuz/lookflex.git
cd lookflex

# ν™˜κ²½ λ³€μˆ˜ 볡사
cp .env.example .env
# .env νŒŒμΌμ—μ„œ BigQuery μ„œλΉ„μŠ€ 계정 ν‚€ 경둜, DB λΉ„λ°€λ²ˆν˜Έ λ“± μ„€μ •

# 전체 μŠ€νƒ μ‹€ν–‰
docker compose up -d

LookFlex β€” Built to replace Looker Studio, one table at a time.

About

An interactive BI dashboard platform

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages