Skip to content

HellWorlding/mandalgraph

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

18 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

MandalGraph

MandalGraph = λ§Œλ‹€λΌνŠΈ(Mandalart) + Graph Database + Radial Visualization

쀑심 λͺ©ν‘œμ—μ„œ λ°©μ‚¬ν˜•μœΌλ‘œ λ»—μ–΄λ‚˜κ°€λŠ” λͺ©ν‘œ 관리 μ‹œμŠ€ν…œμž…λ‹ˆλ‹€.

MandalGraph React Spring Boot Neo4j

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

CRUD κΈ°λŠ₯ (핡심)

κΈ°λŠ₯ μ„€λͺ… μ‚¬μš© 방법
Create (생성) μƒˆ λͺ©ν‘œ λ…Έλ“œ 생성 μΊ”λ²„μŠ€ 더블클릭 λ˜λŠ” λ…Έλ“œ ν…Œλ‘λ¦¬ λ“œλž˜κ·Έ
Read (쑰회) λͺ©ν‘œ 상세 정보 확인 λ…Έλ“œ 클릭 μ‹œ 였λ₯Έμͺ½ νŒ¨λ„μ— ν‘œμ‹œ
Update (μˆ˜μ •) λͺ©ν‘œ 정보 인라인 νŽΈμ§‘ 제λͺ©/μ„€λͺ…/μƒνƒœ/μš°μ„ μˆœμœ„ ν΄λ¦­ν•˜μ—¬ μ¦‰μ‹œ μˆ˜μ •
Delete (μ‚­μ œ) λͺ©ν‘œ μ‚­μ œ 우클릭 μ»¨ν…μŠ€νŠΈ 메뉴 β†’ μ‚­μ œ

λ…Έλ“œ 생성 방법

방법 λ™μž‘ κ²°κ³Ό
μΊ”λ²„μŠ€ 더블클릭 빈 곡간 더블클릭 ν•΄λ‹Ή μœ„μΉ˜μ— μƒˆ 루트 λ…Έλ“œ 생성
ν…Œλ‘λ¦¬ λ“œλž˜κ·Έ β†’ 빈 곡간 λ…Έλ“œ ν…Œλ‘λ¦¬μ—μ„œ λ“œλž˜κ·Έ μƒˆ μžμ‹ λ…Έλ“œ + μ—°κ²° μ—£μ§€ 생성
ν…Œλ‘λ¦¬ λ“œλž˜κ·Έ β†’ λ‹€λ₯Έ λ…Έλ“œ λ…Έλ“œ ν…Œλ‘λ¦¬μ—μ„œ λ‹€λ₯Έ λ…Έλ“œλ‘œ λ“œλž˜κ·Έ 두 λ…Έλ“œ κ°„ μ—£μ§€λ§Œ 생성

λ…Έλ“œ νŽΈμ§‘ (인라인 νŽΈμ§‘)

λͺ¨λ“  νŽΈμ§‘μ€ 클릭 μ¦‰μ‹œ κ°€λŠ₯ν•˜λ©°, μžλ™ μ €μž₯λ©λ‹ˆλ‹€.

ν•„λ“œ νŽΈμ§‘ 방식
제λͺ© 클릭 β†’ μž…λ ₯ β†’ Enter λ˜λŠ” λ°”κΉ₯ 클릭으둜 μ €μž₯
μ„€λͺ… 클릭 β†’ ν…μŠ€νŠΈ μž…λ ₯ β†’ μžλ™ μ €μž₯ (λ””λ°”μš΄μŠ€)
μƒνƒœ TODO/IN_PROGRESS/DONE λ²„νŠΌ 클릭 β†’ μ¦‰μ‹œ λ³€κ²½
μš°μ„ μˆœμœ„ 별 1~5개 클릭 β†’ μ¦‰μ‹œ λ³€κ²½

κ·Έλž˜ν”„ μ‘°μž‘

μ‘°μž‘ λ™μž‘
λ…Έλ“œ λ“œλž˜κ·Έ λ…Έλ“œ μœ„μΉ˜ 이동 (μœ„μΉ˜ μΊμ‹œλ¨)
λ…Έλ“œ 더블클릭 ν•΄λ‹Ή λ…Έλ“œλ₯Ό μ€‘μ‹¬μœΌλ‘œ λ·° 이동
λ°°κ²½ λ“œλž˜κ·Έ μΊ”λ²„μŠ€ νŒ¨λ‹
마우슀 휠 쀌 인/아웃
우클릭 μ»¨ν…μŠ€νŠΈ 메뉴 (μžμ‹ λ…Έλ“œ μΆ”κ°€, μ‚­μ œ)

Multi-Topology 지원

  • μ‚¬μš©μžλ‹Ή μ΅œλŒ€ 5개의 독립 ν† ν΄λ‘œμ§€ 관리 κ°€λŠ₯
  • 각 ν† ν΄λ‘œμ§€λŠ” μ™„μ „νžˆ λΆ„λ¦¬λœ λͺ©ν‘œ κ·Έλž˜ν”„
  • ν† ν΄λ‘œμ§€ 생성/μ‚­μ œ/μ „ν™˜ 지원

기술 μŠ€νƒ

Frontend

기술 버전 μš©λ„
React 18.x UI ν”„λ ˆμž„μ›Œν¬
TypeScript 5.x νƒ€μž… μ•ˆμ „μ„±
D3.js 7.x λ°©μ‚¬ν˜• κ·Έλž˜ν”„ μ‹œκ°ν™”
Zustand 4.x μƒνƒœ 관리
Axios 1.x HTTP ν΄λΌμ΄μ–ΈνŠΈ
Tailwind CSS 3.x μŠ€νƒ€μΌλ§
Vite 5.x λΉŒλ“œ 도ꡬ

Backend

기술 버전 μš©λ„
Spring Boot 3.2+ μ›Ή ν”„λ ˆμž„μ›Œν¬
Java 17+ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄
Spring Data Neo4j 7.x Neo4j ORM
Spring Security 6.x 인증/인가
JJWT 0.12.x JWT 토큰 처리
Maven 3.9+ λΉŒλ“œ 도ꡬ
SpringDoc OpenAPI 2.x API λ¬Έμ„œν™”

Database

기술 버전 μš©λ„
Neo4j 5.x κ·Έλž˜ν”„ λ°μ΄ν„°λ² μ΄μŠ€
Neo4j AuraDB - ν΄λΌμš°λ“œ Neo4j (ν”„λ‘œλ•μ…˜)

Infrastructure

기술 μš©λ„
Docker μ»¨ν…Œμ΄λ„ˆν™”
Docker Compose λ©€ν‹° μ»¨ν…Œμ΄λ„ˆ μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜
Nginx λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ, SSL μ’…λ£Œ
AWS EC2 μ„œλ²„ ν˜ΈμŠ€νŒ…
Let's Encrypt SSL μΈμ¦μ„œ

μ•„ν‚€ν…μ²˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        Frontend (React)                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚ Radial View β”‚  β”‚ Detail Panelβ”‚  β”‚ Navigation/Breadcrumb   β”‚ β”‚
β”‚  β”‚ (D3.js)     β”‚  β”‚ (InlineEdit)β”‚  β”‚                         β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                             β”‚ REST API (JWT Auth)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    Backend (Spring Boot)                        β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚GoalControllerβ”‚ β”‚AuthControllerβ”‚ β”‚ TopologyController      β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜               β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚                    Service Layer                          β”‚  β”‚
β”‚  β”‚  (GoalService, AuthService, TopologyService)             β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚              Neo4j Repository (Spring Data Neo4j)         β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚ Bolt Protocol
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         Neo4j Database                          β”‚
β”‚                    (AuraDB / Docker Container)                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

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

둜컬 개발 ν™˜κ²½

1. 사전 μš”κ΅¬ 사항

  • Java 17+
  • Node.js 18+
  • Docker & Docker Compose
  • Maven 3.9+

2. Neo4j λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμž‘

docker-compose up -d

3. Backend μ‹€ν–‰

cd backend
mvn spring-boot:run

4. Frontend μ‹€ν–‰

cd frontend
npm install
npm run dev

5. 접속

ν”„λ‘œλ•μ…˜ 배포 (Docker)

1. ν™˜κ²½ λ³€μˆ˜ μ„€μ •

cp .env.production.example .env.production
# .env.production 파일 νŽΈμ§‘

2. Docker Compose둜 λΉŒλ“œ 및 μ‹€ν–‰

docker-compose -f docker-compose.prod.yml up -d --build

3. SSL μΈμ¦μ„œ λ°œκΈ‰ (Let's Encrypt)

sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

API μ—”λ“œν¬μΈνŠΈ

인증 API

Method Endpoint μ„€λͺ…
POST /api/auth/register νšŒμ›κ°€μž…
POST /api/auth/login 둜그인 (JWT λ°œκΈ‰)
GET /api/auth/me ν˜„μž¬ μ‚¬μš©μž 정보

ν† ν΄λ‘œμ§€ API

Method Endpoint μ„€λͺ…
GET /api/topologies λ‚΄ ν† ν΄λ‘œμ§€ λͺ©λ‘
POST /api/topologies ν† ν΄λ‘œμ§€ 생성
DELETE /api/topologies/{id} ν† ν΄λ‘œμ§€ μ‚­μ œ

λͺ©ν‘œ (Goal) API

Method Endpoint μ„€λͺ…
GET /api/topologies/{id}/goals ν† ν΄λ‘œμ§€ λ‚΄ λͺ©ν‘œ λͺ©λ‘
POST /api/topologies/{id}/goals λͺ©ν‘œ 생성
GET /api/goals/{id} λͺ©ν‘œ 상세 쑰회
PUT /api/goals/{id} λͺ©ν‘œ μˆ˜μ •
DELETE /api/goals/{id} λͺ©ν‘œ μ‚­μ œ

관계 (Relation) API

Method Endpoint μ„€λͺ…
POST /api/relations 관계 생성
PUT /api/relations/{id} 관계 μˆ˜μ •
DELETE /api/relations/{id} 관계 μ‚­μ œ

κ·Έλž˜ν”„ API

Method Endpoint μ„€λͺ…
GET /api/graph/radial/{goalId} λ°©μ‚¬ν˜• κ·Έλž˜ν”„ 데이터
GET /api/topologies/{id}/graph ν† ν΄λ‘œμ§€ 전체 κ·Έλž˜ν”„

데이터 λͺ¨λΈ

Goal (λͺ©ν‘œ)

interface Goal {
  id: string;
  title: string;
  description?: string;
  status: 'TODO' | 'IN_PROGRESS' | 'DONE';
  priority: number; // 1-5
  createdAt: string;
  updatedAt: string;
}

Relation (관계)

interface Relation {
  id: string;
  sourceId: string;
  targetId: string;
  type: 'STRONG' | 'WEAK';
  strength?: number; // 0.0-1.0 (WEAK νƒ€μž…)
}

Topology (ν† ν΄λ‘œμ§€)

interface Topology {
  id: string;
  name: string;
  description?: string;
  createdAt: string;
}

μ‹œκ°μ  λ””μžμΈ

μ—£μ§€ μŠ€νƒ€μΌ

νƒ€μž… stroke-width stroke dasharray μ„€λͺ…
STRONG 3px #3b82f6 none 직접 μ—°κ²°
WEAK 1.5px #9ca3af 5,5 μΆ”λ‘ /μ•½ν•œ μ—°κ²°

λ…Έλ“œ μƒνƒœ 색상

μƒνƒœ 색상
TODO νšŒμƒ‰ (#9ca3af)
IN_PROGRESS νŒŒλž€μƒ‰ (#3b82f6)
DONE μ΄ˆλ‘μƒ‰ (#22c55e)

EC2 μ„œλ²„ μ—…λ°μ΄νŠΈ 방법

μ„œλ²„μ—μ„œ μ΅œμ‹  μ½”λ“œλ₯Ό λ°›μœΌλ €λ©΄:

# EC2 접속
ssh -i mandalkey.pem ec2-user@18.139.253.173

# ν”„λ‘œμ νŠΈ λ””λ ‰ν† λ¦¬λ‘œ 이동
cd mandalgraph

# μ΅œμ‹  μ½”λ“œ λ°›κΈ°
git pull origin main

# μ»¨ν…Œμ΄λ„ˆ μž¬λΉŒλ“œ 및 μž¬μ‹œμž‘
docker-compose -f docker-compose.prod.yml up -d --build

λΌμ΄μ„ μŠ€

MIT License

κΈ°μ—¬

이슈 및 PR ν™˜μ˜ν•©λ‹ˆλ‹€!

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors