Skip to content

Latest commit

Β 

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Docker Container Management Dashboard Frontend

Docker μ»¨ν…Œμ΄λ„ˆ λͺ¨λ‹ˆν„°λ§ 및 관리λ₯Ό μœ„ν•œ μ›Ή λŒ€μ‹œλ³΄λ“œμž…λ‹ˆλ‹€.

기술 μŠ€νƒ

  • React: UI μ»΄ν¬λ„ŒνŠΈ 라이브러리
  • TypeScript: 정적 νƒ€μž… 지원
  • Vite: λΉŒλ“œ 도ꡬ
  • TailwindCSS: CSS ν”„λ ˆμž„μ›Œν¬
  • Tanstack Query: μ„œλ²„ μƒνƒœ 관리 및 데이터 페칭
  • React Router DOM: ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ λΌμš°νŒ…

μ£Όμš” κΈ°λŠ₯

  • μ»¨ν…Œμ΄λ„ˆ λͺ©λ‘ 쑰회 및 필터링
  • μ»¨ν…Œμ΄λ„ˆ 상세 정보 확인
  • μ»¨ν…Œμ΄λ„ˆ μ‹œμž‘/쀑지/μž¬μ‹œμž‘ λ“± μ œμ–΄
  • μ‹œμŠ€ν…œ λ¦¬μ†ŒμŠ€ λͺ¨λ‹ˆν„°λ§
  • μžλ™ μŠ€μΌ€μΌλ§ μ •μ±… 관리

ν”„λ‘œμ νŠΈ ꡬ쑰

이 ν”„λ‘œμ νŠΈλŠ” Feature-Sliced Design (FSD) μ•„ν‚€ν…μ²˜λ₯Ό λ”°λ¦…λ‹ˆλ‹€.

src/
β”œβ”€β”€ app/         # μ•± μˆ˜μ€€ μ„€μ • (λΌμš°νŒ…, λ ˆμ΄μ•„μ›ƒ, ν…Œλ§ˆ, ν”„λ‘œλ°”μ΄λ”)
β”‚   β”œβ”€β”€ providers/  # μ•± μ „μ—­ ν”„λ‘œλ°”μ΄λ” μ„€μ •
β”‚   β”‚   └── query-provider.tsx  # Tanstack Query ν”„λ‘œλ°”μ΄λ”
β”‚   └── App.tsx    # 루트 μ•± μ»΄ν¬λ„ŒνŠΈ
β”œβ”€β”€ pages/       # νŽ˜μ΄μ§€ ꡬ성
β”‚   β”œβ”€β”€ home/    # ν™ˆ νŽ˜μ΄μ§€(λŒ€μ‹œλ³΄λ“œ)
β”‚   β”œβ”€β”€ containers/  # μ»¨ν…Œμ΄λ„ˆ κ΄€λ ¨ νŽ˜μ΄μ§€
β”‚   └── scaling/  # μŠ€μΌ€μΌλ§ μ •μ±… κ΄€λ ¨ νŽ˜μ΄μ§€
β”œβ”€β”€ widgets/     # λ ˆμ΄μ•„μ›ƒ 블둝 (헀더, μ‚¬μ΄λ“œλ°” λ“±)
β”‚   β”œβ”€β”€ header/  # 헀더 μ»΄ν¬λ„ŒνŠΈ
β”‚   β”œβ”€β”€ sidebar/  # μ‚¬μ΄λ“œλ°” λ‚΄λΉ„κ²Œμ΄μ…˜
β”‚   β”œβ”€β”€ layout/  # νŽ˜μ΄μ§€ λ ˆμ΄μ•„μ›ƒ ꡬ쑰
β”‚   β”œβ”€β”€ container-grid/  # μ»¨ν…Œμ΄λ„ˆ κ·Έλ¦¬λ“œ μœ„μ ―
β”‚   └── stats-overview/  # 톡계 κ°œμš” μœ„μ ―
β”œβ”€β”€ features/    # κΈ°λŠ₯ λ‹¨μœ„
β”‚   β”œβ”€β”€ container-actions/  # μ»¨ν…Œμ΄λ„ˆ μ•‘μ…˜ κ΄€λ ¨ κΈ°λŠ₯
β”‚   └── scaling-policy/  # μŠ€μΌ€μΌλ§ μ •μ±… κ΄€λ ¨ κΈ°λŠ₯ 
β”œβ”€β”€ entities/    # 도메인 둜직 및 λͺ¨λΈ
β”‚   β”œβ”€β”€ container/  # μ»¨ν…Œμ΄λ„ˆ κ΄€λ ¨ 도메인 둜직
β”‚   └── system/  # μ‹œμŠ€ν…œ 정보 κ΄€λ ¨ 도메인 둜직
β”œβ”€β”€ shared/      # μ „μ—­ UI, μœ ν‹Έλ¦¬ν‹°, νƒ€μž…
β”‚   β”œβ”€β”€ api/  # API ν΄λΌμ΄μ–ΈνŠΈ 및 μœ ν‹Έλ¦¬ν‹°
β”‚   β”œβ”€β”€ ui/  # UI κΈ°λ³Έ μ»΄ν¬λ„ŒνŠΈ
β”‚   β”œβ”€β”€ lib/  # μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜
β”‚   └── types/  # 곡톡 νƒ€μž… μ •μ˜
└── processes/   # 높은 μˆ˜μ€€μ˜ λΉ„μ¦ˆλ‹ˆμŠ€ ν”„λ‘œμ„ΈμŠ€

μ£Όμš” 파일 및 μ—­ν• 

  • src/main.tsx: μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ§„μž…μ 
  • src/app/App.tsx: 루트 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ»΄ν¬λ„ŒνŠΈ
  • src/app/providers/query-provider.tsx: Tanstack Query μ„€μ •
  • src/widgets/layout/ui/layout.tsx: 메인 λ ˆμ΄μ•„μ›ƒ ꡬ쑰
  • src/widgets/sidebar/ui/sidebar.tsx: μ‚¬μ΄λ“œλ°” λ‚΄λΉ„κ²Œμ΄μ…˜ μ»΄ν¬λ„ŒνŠΈ
  • src/widgets/header/ui/header.tsx: 상단 헀더 μ»΄ν¬λ„ŒνŠΈ
  • package.json: ν”„λ‘œμ νŠΈ μ˜μ‘΄μ„± 및 슀크립트
  • vite.config.ts: Vite λΉŒλ“œ 도ꡬ μ„€μ •
  • tailwind.config.js: Tailwind CSS μ„€μ •

API 톡신

Tanstack Queryλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„œλ²„μ™€μ˜ 톡신 및 μƒνƒœ 관리λ₯Ό κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€:

  • useContainers: μ»¨ν…Œμ΄λ„ˆ λͺ©λ‘ 쑰회
  • useContainer: μ»¨ν…Œμ΄λ„ˆ 상세 정보 쑰회
  • useContainerAction: μ»¨ν…Œμ΄λ„ˆ λ™μž‘ μˆ˜ν–‰ (μ‹œμž‘, 쀑지 λ“±)
  • useContainerTimeline: μ»¨ν…Œμ΄λ„ˆ μ„±λŠ₯ νƒ€μž„λΌμΈ 데이터 쑰회
  • useScalingPolicies: μžλ™ μŠ€μΌ€μΌλ§ μ •μ±… λͺ©λ‘ 쑰회
  • useCreateScalingPolicy: μžλ™ μŠ€μΌ€μΌλ§ μ •μ±… 생성
  • useDashboardSummary: λŒ€μ‹œλ³΄λ“œ μš”μ•½ 정보 쑰회
  • useSystemSummary: μ‹œμŠ€ν…œ μš”μ•½ 정보 쑰회

μ„€μΉ˜ 및 μ‹€ν–‰

# μ˜μ‘΄μ„± μ„€μΉ˜
npm install

# 개발 μ„œλ²„ μ‹€ν–‰
npm run dev

λΉŒλ“œ

npm run build

ν…ŒμŠ€νŠΈ

npm run test

개발 κ°€μ΄λ“œλΌμΈ

  • 클린 μ½”λ“œ: 의미 μžˆλŠ” 이름, μž‘μ€ ν•¨μˆ˜, DRY 원칙 적용
  • React λͺ¨λ²” 사둀: ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ, ν›… κ·œμΉ™ μ€€μˆ˜, μ μ ˆν•œ μƒνƒœ 관리
  • Tailwind CSS: μœ ν‹Έλ¦¬ν‹° 클래슀 μ‚¬μš©, μ»΄ν¬λ„ŒνŠΈ μŠ€νƒ€μΌ 일관성 μœ μ§€
  • TypeScript: μΈν„°νŽ˜μ΄μŠ€ μ‚¬μš©, λͺ…ν™•ν•œ νƒ€μž… μ •μ˜, μ—„κ²©ν•œ νƒ€μž… 체크
  • FSD 원칙: λ ˆμ΄μ–΄ κ°„ μ˜μ‘΄μ„± κ·œμΉ™ μ€€μˆ˜, 단방ν–₯ μ˜μ‘΄μ„± μœ μ§€

CM2-Frontend

Docker μ»¨ν…Œμ΄λ„ˆ 관리λ₯Ό μœ„ν•œ ꡐ윑용 λŒ€μ‹œλ³΄λ“œ ν”„λ‘ νŠΈμ—”λ“œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μž…λ‹ˆλ‹€.

🎯 ν”„λ‘œμ νŠΈ λͺ©ν‘œ

이 ν”„λ‘œμ νŠΈλŠ” ꡐ윑용 μΏ λ²„λ„€ν‹±μŠ€ μ‹œκ°ν™” ν•™μŠ΅ ν”Œλž«νΌμ„ λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€:

  • μ‹€μ‹œκ°„ ν΄λŸ¬μŠ€ν„° λͺ¨λ‹ˆν„°λ§μ„ ν†΅ν•œ μΏ λ²„λ„€ν‹±μŠ€ κ°œλ… ν•™μŠ΅
  • μ‹œκ°μ  μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν†΅ν•œ 직관적인 μ‹œμŠ€ν…œ 이해
  • μ‹€μ œ ν΄λŸ¬μŠ€ν„° ν™˜κ²½κ³Όμ˜ μƒν˜Έμž‘μš©μ„ ν†΅ν•œ μ‹€μŠ΅ κ²½ν—˜

πŸš€ μ£Όμš” κΈ°λŠ₯

πŸ“Š ν΄λŸ¬μŠ€ν„° λͺ¨λ‹ˆν„°λ§ (μ‹ κ·œ)

  • μ‹€μ‹œκ°„ ν΄λŸ¬μŠ€ν„° μƒνƒœ λͺ¨λ‹ˆν„°λ§: 5μ΄ˆλ§ˆλ‹€ μžλ™ κ°±μ‹ 
  • λ…Έλ“œ μƒνƒœ μ‹œκ°ν™”: λ§€λ‹ˆμ €/μ›Œμ»€ λ…Έλ“œ ꡬ뢄 및 μƒνƒœ ν‘œμ‹œ
  • λ¦¬μ†ŒμŠ€ μ‚¬μš©λŸ‰ λŒ€μ‹œλ³΄λ“œ: CPU, λ©”λͺ¨λ¦¬, λ””μŠ€ν¬ μ‚¬μš©λ₯  μ‹€μ‹œκ°„ 좔적
  • μ»¨ν…Œμ΄λ„ˆ μƒνƒœ μš”μ•½: μ‹€ν–‰/쀑지/였λ₯˜ μƒνƒœλ³„ μ»¨ν…Œμ΄λ„ˆ ν˜„ν™©
  • ꡐ윑적 ν•™μŠ΅ 포인트: 각 κ°œλ…μ— λŒ€ν•œ μ„€λͺ…κ³Ό κ°€μ΄λ“œ

🏠 λŒ€μ‹œλ³΄λ“œ

  • 전체 μ‹œμŠ€ν…œ μƒνƒœ κ°œμš”
  • λΉ λ₯Έ μƒνƒœ 확인 μΉ΄λ“œ
  • ν΄λŸ¬μŠ€ν„° λͺ¨λ‹ˆν„°λ§μœΌλ‘œμ˜ 원클릭 이동

πŸ“¦ μ»¨ν…Œμ΄λ„ˆ 관리

  • μ»¨ν…Œμ΄λ„ˆ λͺ©λ‘ 쑰회
  • κ°œλ³„ μ»¨ν…Œμ΄λ„ˆ 상세 정보

πŸ›  기술 μŠ€νƒ

  • Frontend: React 18 + TypeScript
  • μƒνƒœ 관리: TanStack Query (React Query)
  • μŠ€νƒ€μΌλ§: TailwindCSS + shadcn/ui
  • μ•„ν‚€ν…μ²˜: Feature-Sliced Design (FSD)
  • λΉŒλ“œ 도ꡬ: Vite
  • λΌμš°νŒ…: React Router
  • Mock API: MSW (Mock Service Worker)
  • 데이터 μ˜μ†μ„±: localStorage

πŸ“ ν”„λ‘œμ νŠΈ ꡬ쑰

src/
β”œβ”€β”€ app/                    # μ•± 레벨 μ„€μ •
β”œβ”€β”€ pages/                  # νŽ˜μ΄μ§€ μ»΄ν¬λ„ŒνŠΈλ“€
β”‚   β”œβ”€β”€ cluster-monitoring/ # πŸ†• ν΄λŸ¬μŠ€ν„° λͺ¨λ‹ˆν„°λ§ νŽ˜μ΄μ§€
β”‚   β”œβ”€β”€ dashboard/          # 메인 λŒ€μ‹œλ³΄λ“œ
β”‚   └── containers/         # μ»¨ν…Œμ΄λ„ˆ κ΄€λ ¨ νŽ˜μ΄μ§€λ“€
β”œβ”€β”€ widgets/                # λ ˆμ΄μ•„μ›ƒ 블둝듀
β”œβ”€β”€ features/               # κΈ°λŠ₯별 λͺ¨λ“ˆλ“€
β”œβ”€β”€ entities/               # 도메인 둜직
└── shared/                 # 곡톡 μœ ν‹Έλ¦¬ν‹°
    β”œβ”€β”€ api/                # API ν΄λΌμ΄μ–ΈνŠΈ 및 ν›…λ“€
    └── ui/                 # 곡톡 UI μ»΄ν¬λ„ŒνŠΈλ“€

πŸ”— 데이터 관리

이 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ **MSW(Mock Service Worker)**와 localStorageλ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€:

🎭 Mock API (MSW)

  • μ„œλΉ„μŠ€ 관리:
    • GET /api/services - μ„œλΉ„μŠ€ λͺ©λ‘ 쑰회
    • POST /api/services - μ„œλΉ„μŠ€ 생성
    • PATCH /api/services/:id/scale - μ„œλΉ„μŠ€ μŠ€μΌ€μΌλ§
    • DELETE /api/services/:id - μ„œλΉ„μŠ€ μ‚­μ œ
  • μ‹œμŠ€ν…œ 정보:
    • GET /api/summary - μ‹œμŠ€ν…œ μš”μ•½ 정보
  • μ»¨ν…Œμ΄λ„ˆ 관리:
    • GET /api/containers - μ»¨ν…Œμ΄λ„ˆ λͺ©λ‘
  • ν΄λŸ¬μŠ€ν„° 관리:
    • GET /api/cluster/nodes - ν΄λŸ¬μŠ€ν„° λ…Έλ“œ λͺ©λ‘
    • PATCH /api/cluster/nodes/:id/availability - λ…Έλ“œ κ°€μš©μ„± λ³€κ²½

πŸ’Ύ 데이터 μ˜μ†μ„± (localStorage)

  • μžλ™ μ €μž₯: λͺ¨λ“  데이터 변경사항이 localStorage에 μžλ™ μ €μž₯
  • νŽ˜μ΄μ§€ μƒˆλ‘œκ³ μΉ¨ μœ μ§€: λΈŒλΌμš°μ €λ₯Ό μƒˆλ‘œκ³ μΉ¨ν•΄λ„ 데이터가 μœ μ§€λ¨
  • 초기 데이터: 첫 λ°©λ¬Έ μ‹œ 미리 μ •μ˜λœ μƒ˜ν”Œ λ°μ΄ν„°λ‘œ μ΄ˆκΈ°ν™”
  • μ‹€μ‹œκ°„ 동기화: UI 변경사항이 μ¦‰μ‹œ localStorage에 반영

πŸŽ“ ꡐ윑적 νŠΉμ§•

μ‹€μ‹œκ°„ ν•™μŠ΅

  • 5-10초 κ°„κ²©μ˜ μžλ™ 데이터 κ°±μ‹ μœΌλ‘œ μ‹€μ‹œκ°„ λ³€ν™” κ΄€μ°°
  • μ‹œκ°μ  μƒνƒœ ν‘œμ‹œκΈ°λ₯Ό ν†΅ν•œ 직관적 이해

κ°œλ… μ„€λͺ…

  • 각 νŽ˜μ΄μ§€λ§ˆλ‹€ ν¬ν•¨λœ "ν•™μŠ΅ 포인트" μ„Ήμ…˜
  • μΏ λ²„λ„€ν‹±μŠ€ 핡심 κ°œλ…μ— λŒ€ν•œ μ‹€μš©μ  μ„€λͺ…

μΈν„°λž™ν‹°λΈŒ μš”μ†Œ

  • 클릭 κ°€λŠ₯ν•œ μƒνƒœ μΉ΄λ“œ
  • μ‹€μ‹œκ°„ μƒˆλ‘œκ³ μΉ¨ κΈ°λŠ₯
  • νŽ˜μ΄μ§€ κ°„ μ›ν™œν•œ λ„€λΉ„κ²Œμ΄μ…˜

πŸš€ μ‹œμž‘ν•˜κΈ°

μ„€μΉ˜

npm install

개발 μ„œλ²„ μ‹€ν–‰

npm run dev

λΉŒλ“œ

npm run build

πŸ“± μ£Όμš” νŽ˜μ΄μ§€

1. λŒ€μ‹œλ³΄λ“œ (/)

  • 전체 μ‹œμŠ€ν…œ μƒνƒœ κ°œμš”
  • ν΄λŸ¬μŠ€ν„° λͺ¨λ‹ˆν„°λ§μœΌλ‘œμ˜ λΉ λ₯Έ μ ‘κ·Ό

2. ν΄λŸ¬μŠ€ν„° λͺ¨λ‹ˆν„°λ§ (/cluster-monitoring) πŸ†•

  • μ‹€μ‹œκ°„ λͺ¨λ‹ˆν„°λ§: ν΄λŸ¬μŠ€ν„° μƒνƒœ μ‹€μ‹œκ°„ 좔적
  • λ…Έλ“œ 관리: 각 λ…Έλ“œμ˜ μƒνƒœμ™€ μ—­ν•  확인
  • λ¦¬μ†ŒμŠ€ λͺ¨λ‹ˆν„°λ§: CPU, λ©”λͺ¨λ¦¬, λ””μŠ€ν¬ μ‚¬μš©λŸ‰
  • ꡐ윑 κ°€μ΄λ“œ: μΏ λ²„λ„€ν‹±μŠ€ κ°œλ… ν•™μŠ΅ 지원

3. μ»¨ν…Œμ΄λ„ˆ 관리 (/containers)

  • μ»¨ν…Œμ΄λ„ˆ λͺ©λ‘ 및 μƒνƒœ 확인
  • κ°œλ³„ μ»¨ν…Œμ΄λ„ˆ 상세 정보

πŸ”„ μ‹€μ‹œκ°„ μ—…λ°μ΄νŠΈ

  • ν΄λŸ¬μŠ€ν„° 정보: 5μ΄ˆλ§ˆλ‹€ κ°±μ‹ 
  • μ‹œμŠ€ν…œ μš”μ•½: 10μ΄ˆλ§ˆλ‹€ κ°±μ‹ 
  • λŒ€μ‹œλ³΄λ“œ 데이터: 10μ΄ˆλ§ˆλ‹€ κ°±μ‹ 

🎨 UI/UX νŠΉμ§•

  • λ°˜μ‘ν˜• λ””μžμΈ: λͺ¨λ°”일뢀터 λ°μŠ€ν¬ν†±κΉŒμ§€ 지원
  • 닀크/라이트 ν…Œλ§ˆ: μ‚¬μš©μž μ„ ν˜Έμ— λ”°λ₯Έ ν…Œλ§ˆ 선택
  • λ‘œλ”© μƒνƒœ: μŠ€μΌˆλ ˆν†€ UI와 λ‘œλ”© 인디케이터
  • μ—λŸ¬ 처리: μ‚¬μš©μž μΉœν™”μ  μ—λŸ¬ λ©”μ‹œμ§€

πŸ“š ν•™μŠ΅ λ¦¬μ†ŒμŠ€

이 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 톡해 λ‹€μŒ κ°œλ…λ“€μ„ ν•™μŠ΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

  • ν΄λŸ¬μŠ€ν„° μ•„ν‚€ν…μ²˜: λ§€λ‹ˆμ € λ…Έλ“œμ™€ μ›Œμ»€ λ…Έλ“œμ˜ μ—­ν• 
  • λ¦¬μ†ŒμŠ€ λͺ¨λ‹ˆν„°λ§: μ‹œμŠ€ν…œ μ„±λŠ₯ μ§€ν‘œ 해석
  • μ»¨ν…Œμ΄λ„ˆ 라이프사이클: μ»¨ν…Œμ΄λ„ˆ μƒνƒœ λ³€ν™” 좔적
  • μ‹€μ‹œκ°„ 운영: μ‹€μ œ 운영 ν™˜κ²½μ—μ„œμ˜ λͺ¨λ‹ˆν„°λ§ 방법

ꡐ윑 λͺ©μ μœΌλ‘œ 개발된 μΏ λ²„λ„€ν‹±μŠ€ ν•™μŠ΅ ν”Œλž«νΌμž…λ‹ˆλ‹€. μ‹€μ œ ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œλŠ” 좔가적인 λ³΄μ•ˆ 및 μ„±λŠ₯ μ΅œμ ν™”κ°€ ν•„μš”ν•©λ‹ˆλ‹€.

Releases

Packages

Used by

Contributors

Languages