Jira API + Supabase κΈ°λ° κ³ μ±λ₯ μ€μκ° λ³΄μμ΄λ²€νΈ λͺ¨λν°λ§ νλ«νΌ
- 30μ΄λ§λ€ μλ μ λ°μ΄νΈ - Jira API μ§μ νΈμΆ
- 4μ»¬λΌ κ³ λ°λ μΉ΄λ λ μ΄μμ - λ λ§μ μ 보λ₯Ό ν λμ νμΈ
- κ³ κ°μ¬λ³ μκ·Έλμ² μμ - ꡿리μΉ(λ Έλμ), νλ€(νλμ), μΌκ΅¬(μ°λμ) λ±
- AI 보μ λΆμ ν΅ν© - MetaShield AI λΆμ μν΄λ¦ μ€ν
- Jira ν°μΌ μ§μ μ°κ²° - μ νμμ λ°λ‘ μ΄λ
- 42κ° κ°λ³ JQL 쿼리 - κ° κ³ κ°μ¬λ³ μνλ³ μ νν μ§κ³
- μ«μ+λ°μ€ λμμΈ - κ°λ μ± μ΅μ νλ‘ ν λμ νμ
- μν μ°μ μμ μ λ ¬ - μΉμΈλκΈ° β μ ν β νμμ°¨λ¨ β κΈ°μ°¨λ¨ β μ€ν μ
- 3λΆλ§λ€ μλ μ λ°μ΄νΈ - λλ API νΈμΆ μ΅μ ν
- μν΄λ¦ Jira μ΄λ - κ° μ ν΄λ¦μΌλ‘ ν΄λΉ μν ν°μΌ νν°λ§
- λ€μ€ μ°¨νΈ λ·° (λ§λ μ°¨νΈ, μν μ°¨νΈ)
- λΆμ μΉ΄ν κ³ λ¦¬ (κ³ κ°μ¬λ³, μνλ³, μ°μ μμλ³)
- μμΈ λ°μ΄ν° ν μ΄λΈ ν¬ν¨
- 5λΆλ§λ€ μλ μ λ°μ΄νΈ
- μΆμν ν€λ - κ³΅κ° ν¨μ¨μ± κ·Ήλν
- ν κΈ λ²νΌ - νμν λλ§ μΈλΆ μ 보 νμΈ
- μ°κ²° μν μ€μκ° λͺ¨λν°λ§ - 2λΆλ§λ€ μλ 체ν¬
- 7κ° νλ‘μ νΈ μν - κ° κ³ κ°μ¬λ³ μ°κ²° νν© νμ
- λ μ΄μμ μ΅μ ν - λ©μΈ λ©λ΄ μΈλ‘κΈΈμ΄ μΆμ
- μκ·Έλμ² μμ μμ€ν - κ° κ³ κ°μ¬λ³ λΈλλ© μμ ν΅μΌ
- Jira μν μΆμ/νμ₯ - μ¬μ©μ μ νμ μ 보 νμ
- μΉ΄λ ν¬κΈ° μ΅μ ν - 4μ»¬λΌ λ μ΄μμμΌλ‘ μ 보 λ°λ ν₯μ
.env.local
νμΌμ μμ±νκ³ λ€μ μ 보λ₯Ό μ
λ ₯νμΈμ:
# Jira API μ€μ (νμ)
NEXT_PUBLIC_JIRA_DOMAIN=your-company.atlassian.net
JIRA_EMAIL=your-email@company.com
JIRA_API_TOKEN=your-jira-api-token
# π Supabase λ°μ΄ν°λ² μ΄μ€ μ€μ
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
# AI λΆμ API μ€μ (MetaShield)
AZURE_OPENAI_API_KEY=your-azure-openai-api-key
AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com/
AZURE_OPENAI_DEPLOYMENT=your-deployment-name
# 보μ λΆμμ© API Keys
VIRUSTOTAL_API_KEY=your-virustotal-api-key
ABUSEIPDB_API_KEY=your-abuseipdb-api-key
# Next.js μ€μ
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=your-secret-key
- Atlassian κ³μ μ€μ μΌλ‘ μ΄λ
- "API ν ν° μμ±" ν΄λ¦
- ν ν° μ΄λ¦ μ λ ₯ (μ: "MetaWatch SOC Dashboard")
- μμ±λ ν ν°μ 볡μ¬νμ¬ νκ²½λ³μμ μ€μ
# μμ‘΄μ± μ€μΉ
npm install
# κ°λ° μλ² μμ
npm run dev
# λΈλΌμ°μ μμ http://localhost:3000 μ μ
λμ보λ μ μ ν νλ¨μ "Jira μ°κ²° μν" μΉμ μμ API μ°κ²°μ νμΈνμΈμ.
MetaWatch/
βββ src/
β βββ components/
β β βββ dashboard/ # π λμ보λ μμ ―λ€
β β β βββ UrgentSecurityEventsWidget.tsx # λ―Έν΄κ²° μ΄λ²€νΈ 4μ»¬λΌ μΉ΄λ
β β β βββ CustomerStatusOverview.tsx # κ³ κ°μ¬ νν© ν
μ΄λΈ (42κ° JQL)
β β β βββ SecurityStatsChart.tsx # ν΅κ³ μ°¨νΈ (μκ·Έλμ² μμ)
β β β βββ JiraConnectionStatus.tsx # Jira μ°κ²°μν (ν κΈ)
β β βββ layout/ # π¨ λ μ΄μμ μμ€ν
β β β βββ AppLayout.tsx # λ©μΈ μ± λ μ΄μμ
β β β βββ TopTabs.tsx # μλ¨ ν (μΆμν)
β β β βββ Sidebar.tsx # μ¬μ΄λλ° λ©λ΄
β β βββ metawatch/ # π― MetaWatch λμ보λ
β β β βββ MetaWatchDashboard.tsx # λ©μΈ λμ보λ
β β β βββ CustomerDashboard.tsx # κ³ κ°μ¬λ³ λμ보λ
β β βββ metashield/ # π‘οΈ AI 보μ λΆμ
β β β βββ AIAnalysisDashboard.tsx # AI λΆμ λμ보λ
β β βββ ai/ # π€ AI λΆμ μ»΄ν¬λνΈ
β β β βββ AIAnalysisModal.tsx # AI λΆμ λͺ¨λ¬ (2컬λΌ)
β β βββ ui/ # π§ κ³΅ν΅ UI μ»΄ν¬λνΈ
β βββ pages/
β β βββ api/
β β β βββ db/ # π DATABASE κΈ°λ° API (κ³ μ±λ₯)
β β β β βββ unresolved-events.ts # DBμμ λ―Έν΄κ²° μ΄λ²€νΈ μ‘°ν
β β β β βββ security-events.ts # DBμμ ν΅κ³ λ°μ΄ν° μ‘°ν
β β β βββ jira/ # π Jira μ§μ μ°λ
β β β β βββ test-connection.ts # Jira μ°κ²° μν νμΈ
β β β β βββ customer-status.ts # 42κ° κ°λ³ JQL 쿼리
β β β β βββ security-events.ts # λ μ§λ³ 보μμ΄λ²€νΈ μ‘°ν
β β β β βββ unresolved-events.ts # λ―Έν΄κ²° μ΄λ²€νΈ μ‘°ν
β β β βββ sync/ # π λ°μ΄ν° λκΈ°ν μμ€ν
β β β β βββ realtime-sync.ts # μ€μκ° λκΈ°ν (1λΆλ§λ€)
β β β β βββ full-sync.ts # μ 체 λκΈ°ν (μΌ 1ν)
β β β β βββ status.ts # λκΈ°ν μν νμΈ
β β β βββ ai/ # π€ AI λΆμ API
β β β βββ analyze-event.ts # AI 보μ λΆμ λ©μΈ
β β β βββ test.ts # AI API μ°κ²° ν
μ€νΈ
β β βββ index.tsx # λ©μΈ λμ보λ νμ΄μ§
β βββ lib/ # π οΈ μ νΈλ¦¬ν° & μ€μ
β β βββ customer-colors.ts # π¨ μκ·Έλμ² μμ μμ€ν
β β βββ utils.ts # κ³΅ν΅ μ νΈ ν¨μλ€
β βββ config/
β βββ jira-fields.ts # Jira 컀μ€ν
νλ λ§€ν (40+ νλ)
βββ .env.local # νκ²½ λ³μ (μμ± νμ)
βββ CLAUDE.md # κ°λ°μ κ°μ΄λ (μμΈ)
βββ README.md # μ¬μ©μ κ°μ΄λ (μ΄ νμΌ)
βββ package.json # μμ‘΄μ± κ΄λ¦¬
βββ .nvmrc # Node.js λ²μ κ΄λ¦¬
νμ¬ λμ보λλ λ€μ 7κ° κ³ κ°μ¬μ 보μμ΄λ²€νΈλ₯Ό λͺ¨λν°λ§ν©λλ€:
κ³ κ°μ¬ | Jira νλ‘μ νΈ ν€ | νκΈλͺ | π¨ μκ·Έλμ² μμ |
---|---|---|---|
GOODRICH | GOODRICH | κ΅Ώλ¦¬μΉ | π‘ λ Έλμ (#fbbf24) |
FINDA | FINDA | νλ€ | π΅ νλμ (#3b82f6) |
SAMKOO | SAMKOO | μΌκ΅¬μμ΄μ€μ¨ | π’ μ°λμ (#84cc16) |
WCVS | WCVS | ννμμΊ λ²μ€ | π μ£Όν©μ (#f97316) |
GLN | GLN | GLN | π©· νν¬-보λΌμ (#d946ef) |
KURLY | KURLY | 컬리 | π£ μ°λ³΄λΌμ (#a855f7) |
ISU | ISU | μ΄μμμ€ν | π· νλμ (#06b6d4) |
- λ―Έν΄κ²° μ΄λ²€νΈ: 30μ΄ κ°κ²©μΌλ‘ μ λ°μ΄νΈ (κ°μ₯ μ€μ)
- κ³ κ°μ¬ νν©: 2λΆ κ°κ²©μΌλ‘ μ λ°μ΄νΈ (μμ μ λͺ¨λν°λ§)
- ν΅κ³ μ°¨νΈ: 5λΆ κ°κ²©μΌλ‘ μ λ°μ΄νΈ (νΈλ λ λΆμ)
- λ°μ€ν¬ν±: 3μ΄ κ·Έλ¦¬λλ‘ λ§μ ν°μΌμ ν λ²μ νμΈ
- νλΈλ¦Ώ: 2μ΄ κ·Έλ¦¬λλ‘ μ μ ν κ°λ μ±
- λͺ¨λ°μΌ: 1μ΄ μΈλ‘ μ€ν¬λ‘€λ‘ νΈλ¦¬ν λͺ¨λ°μΌ λͺ¨λν°λ§
- μΉ΄λ ν΄λ¦: Jira ν°μΌμΌλ‘ μ§μ μ΄λ
- κ³ κ°μ¬ ν΄λ¦: ν΄λΉ κ³ κ°μ¬μ λͺ¨λ ν°μΌ 보기
- μν μ«μ ν΄λ¦: νΉμ μνμ ν°μΌλ§ νν°λ§
- SOC νκ²½ μ΅μ ν: μ₯μκ° λͺ¨λν°λ§μ μ ν©ν μ΄λμ΄ ν λ§
- κ³ λλΉ μμ: μ€μ μ 보 κ°μ‘° (λΉ¨κ°μ: λ―Έν΄κ²°, μ΄λ‘μ: μλ£)
- μ΅μνμ λμ νΌλ‘: λΆλλ¬μ΄ κ·ΈλΌλμΈνΈμ κ·Έλ¦Όμ
- λͺ¨λ κΈ°κΈ° λμ: λ°μ€ν¬ν±, νλΈλ¦Ώ, λͺ¨λ°μΌ
- ν°μΉ μΉνμ : λͺ¨λ°μΌμμλ μ¬μ΄ μ‘°μ
- λΉ λ₯Έ λ‘λ©: μ΅μ νλ μ±λ₯
- λ‘λ© μ λλ©μ΄μ : λ°μ΄ν° μ λ°μ΄νΈ μν νμ
- νμ€ ν¨κ³Ό: μλ‘μ΄ μ΄λ²€νΈ κ°μ‘°
- λΆλλ¬μ΄ μ ν: Framer Motion μ λλ©μ΄μ
# 1. νκ²½λ³μ νμΈ
cat .env.local
# 2. Jira μ°κ²° ν
μ€νΈ
curl http://localhost:3000/api/jira/test-connection
# 3. κ°λ° μλ² μ¬μμ
npm run dev
- Jira API ν ν° νμΈ: λ§λ£λμκ±°λ κΆνμ΄ λΆμ‘±ν μ μμ΅λλ€
- λ€νΈμν¬ μ°κ²°: λ°©νλ²½μ΄λ νλ‘μ μ€μ μ νμΈνμΈμ
- λΈλΌμ°μ μ½μ: F12 κ°λ°μ λꡬμμ μλ¬ λ©μμ§ νμΈ
- μλ‘κ³ μΉ¨: λΈλΌμ°μ μΊμ λ¬Έμ μΌ μ μμ΅λλ€
- μΈν°λ· μλ: Jira API μλ΅ μλμ λ°λΌ λ‘λ© μκ°μ΄ λ¬λΌμ§λλ€
- λμ μ¬μ©μ: λ§μ μ¬μ©μκ° μ μ μ μλ² λΆνκ° μκΈΈ μ μμ΅λλ€
- GitHub λ ν¬μ§ν 리 μ°κ²°
- λΉλ μ€μ :
- Build Command:
npm run build
- Start Command:
npm start
- Build Command:
- νκ²½ λ³μ μ€μ (μμ .env.local λ΄μ©)
- μλ λ°°ν¬ νμ±ν
- Vercel: Next.js μ΅μ ν
- Netlify: JAMstack λ°°ν¬
- AWS/Google Cloud: 컀μ€ν μλ² νκ²½
- μ΄μ 리ν¬ν : GitHub Issues νμ©
- κΈ°λ₯ μμ²: μλ‘μ΄ κΈ°λ₯μ΄ νμν λ
- λ²κ·Έ 리ν¬νΈ: λ¬Έμ λ°κ²¬ μ μμΈν μ€λͺ κ³Ό ν¨κ»
- μΈμ¦ μμ€ν : μ¬μ©μ λ‘κ·ΈμΈ λ° κΆν κ΄λ¦¬
- μλ¦Ό κΈ°λ₯: Slack, Teams, μ΄λ©μΌ μ°λ
- κ³ κΈ λΆμ: νΈλ λ λΆμ, μμΈ‘ λͺ¨λΈ
- λͺ¨λ°μΌ μ±: λ€μ΄ν°λΈ λͺ¨λ°μΌ μ ν리μΌμ΄μ
MetaWatchλ‘ λ³΄μκ΄μ μ 무μ ν¨μ¨μ±μ λμ΄μΈμ! π‘οΈβ¨