MandalGraph = λ§λ€λΌνΈ(Mandalart) + Graph Database + Radial Visualization
μ€μ¬ λͺ©νμμ λ°©μ¬νμΌλ‘ λ»μ΄λκ°λ λͺ©ν κ΄λ¦¬ μμ€ν
μ
λλ€.
κΈ°λ₯
μ€λͺ
μ¬μ© λ°©λ²
Create (μμ±)
μ λͺ©ν λ
Έλ μμ±
μΊλ²μ€ λλΈν΄λ¦ λλ λ
Έλ ν
λ리 λλκ·Έ
Read (μ‘°ν)
λͺ©ν μμΈ μ 보 νμΈ
λ
Έλ ν΄λ¦ μ μ€λ₯Έμͺ½ ν¨λμ νμ
Update (μμ )
λͺ©ν μ 보 μΈλΌμΈ νΈμ§
μ λͺ©/μ€λͺ
/μν/μ°μ μμ ν΄λ¦νμ¬ μ¦μ μμ
Delete (μμ )
λͺ©ν μμ
μ°ν΄λ¦ 컨ν
μ€νΈ λ©λ΄ β μμ
λ°©λ²
λμ
κ²°κ³Ό
μΊλ²μ€ λλΈν΄λ¦
λΉ κ³΅κ° λλΈν΄λ¦
ν΄λΉ μμΉμ μ λ£¨νΈ λ
Έλ μμ±
ν
λ리 λλκ·Έ β λΉ κ³΅κ°
λ
Έλ ν
λ리μμ λλκ·Έ
μ μμ λ
Έλ + μ°κ²° μ£μ§ μμ±
ν
λ리 λλκ·Έ β λ€λ₯Έ λ
Έλ
λ
Έλ ν
λ리μμ λ€λ₯Έ λ
Έλλ‘ λλκ·Έ
λ λ
Έλ κ° μ£μ§λ§ μμ±
λ
Έλ νΈμ§ (μΈλΌμΈ νΈμ§)
λͺ¨λ νΈμ§μ ν΄λ¦ μ¦μ κ°λ₯νλ©°, μλ μ μ₯ λ©λλ€.
νλ
νΈμ§ λ°©μ
μ λͺ©
ν΄λ¦ β μ
λ ₯ β Enter λλ λ°κΉ₯ ν΄λ¦μΌλ‘ μ μ₯
μ€λͺ
ν΄λ¦ β ν
μ€νΈ μ
λ ₯ β μλ μ μ₯ (λλ°μ΄μ€)
μν
TODO/IN_PROGRESS/DONE λ²νΌ ν΄λ¦ β μ¦μ λ³κ²½
μ°μ μμ
λ³ 1~5κ° ν΄λ¦ β μ¦μ λ³κ²½
μ‘°μ
λμ
λ
Έλ λλκ·Έ
λ
Έλ μμΉ μ΄λ (μμΉ μΊμλ¨)
λ
Έλ λλΈν΄λ¦
ν΄λΉ λ
Έλλ₯Ό μ€μ¬μΌλ‘ λ·° μ΄λ
λ°°κ²½ λλκ·Έ
μΊλ²μ€ ν¨λ
λ§μ°μ€ ν
μ€ μΈ/μμ
μ°ν΄λ¦
컨ν
μ€νΈ λ©λ΄ (μμ λ
Έλ μΆκ°, μμ )
μ¬μ©μλΉ μ΅λ 5κ°μ λ
립 ν ν΄λ‘μ§ κ΄λ¦¬ κ°λ₯
κ° ν ν΄λ‘μ§λ μμ ν λΆλ¦¬λ λͺ©ν κ·Έλν
ν ν΄λ‘μ§ μμ±/μμ /μ ν μ§μ
κΈ°μ
λ²μ
μ©λ
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
λΉλ λꡬ
κΈ°μ
λ²μ
μ©λ
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 λ¬Έμν
κΈ°μ
λ²μ
μ©λ
Neo4j
5.x
κ·Έλν λ°μ΄ν°λ² μ΄μ€
Neo4j AuraDB
-
ν΄λΌμ°λ Neo4j (νλ‘λμ
)
κΈ°μ
μ©λ
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) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Java 17+
Node.js 18+
Docker & Docker Compose
Maven 3.9+
2. Neo4j λ°μ΄ν°λ² μ΄μ€ μμ
cd backend
mvn spring-boot:run
cd frontend
npm install
npm run dev
νλ‘λμ
λ°°ν¬ (Docker)
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
Method
Endpoint
μ€λͺ
POST
/api/auth/register
νμκ°μ
POST
/api/auth/login
λ‘κ·ΈμΈ (JWT λ°κΈ)
GET
/api/auth/me
νμ¬ μ¬μ©μ μ 보
Method
Endpoint
μ€λͺ
GET
/api/topologies
λ΄ ν ν΄λ‘μ§ λͺ©λ‘
POST
/api/topologies
ν ν΄λ‘μ§ μμ±
DELETE
/api/topologies/{id}
ν ν΄λ‘μ§ μμ
Method
Endpoint
μ€λͺ
GET
/api/topologies/{id}/goals
ν ν΄λ‘μ§ λ΄ λͺ©ν λͺ©λ‘
POST
/api/topologies/{id}/goals
λͺ©ν μμ±
GET
/api/goals/{id}
λͺ©ν μμΈ μ‘°ν
PUT
/api/goals/{id}
λͺ©ν μμ
DELETE
/api/goals/{id}
λͺ©ν μμ
Method
Endpoint
μ€λͺ
POST
/api/relations
κ΄κ³ μμ±
PUT
/api/relations/{id}
κ΄κ³ μμ
DELETE
/api/relations/{id}
κ΄κ³ μμ
Method
Endpoint
μ€λͺ
GET
/api/graph/radial/{goalId}
λ°©μ¬ν κ·Έλν λ°μ΄ν°
GET
/api/topologies/{id}/graph
ν ν΄λ‘μ§ μ 체 κ·Έλν
interface Goal {
id : string ;
title : string ;
description ?: string ;
status : 'TODO' | 'IN_PROGRESS' | 'DONE' ;
priority : number ; // 1-5
createdAt : string ;
updatedAt : string ;
}
interface Relation {
id : string ;
sourceId : string ;
targetId : string ;
type : 'STRONG' | 'WEAK' ;
strength ?: number ; // 0.0-1.0 (WEAK νμ
)
}
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 νμν©λλ€!