이 문서는 MandalGraph 프로젝트의 구현 진행 상황을 추적합니다.
PRD에 정의된 12시간 타임라인을 따르되, Frontend 먼저 진행 후 Backend를 연결하는 방식으로 진행합니다.
- Frontend 초기화 (React, D3.js, Zustand, Tailwind)
- UI 컴포넌트 (RadialGraph, GoalDetailPanel, GoalForm)
- Docker + Neo4j
- Backend (Spring Boot 3.2, Neo4j)
- Goal CRUD API 연동
- 그래프 API 연동
- 타입 동기화 완료
완료일: 2026-01-25 담당: Claude Code + Antigravity
| 기능 | 상태 | 파일 |
|---|---|---|
| 노드 테두리 드래그 → 새 노드+엣지 생성 | ✅ | RadialGraph.tsx |
| 노드 테두리 드래그 → 다른 노드 연결 | ✅ | RadialGraph.tsx |
| 캔버스 더블클릭 → 루트 노드 생성 | ✅ | RadialGraph.tsx, App.tsx |
| 노드 더블클릭 → 편집 모달 열기 | ✅ | App.tsx |
| 왼쪽 노드 목록 드래그 앤 드롭 | ✅ | NodeList.tsx |
| 노드 중앙 드래그 → 노드 이동 | ✅ | RadialGraph.tsx |
| 배경 드래그 → 캔버스 패닝 | ✅ | RadialGraph.tsx |
완료일: 2026-01-25 담당: Claude Code
| 기능 | 상태 | 설명 |
|---|---|---|
| Depth 기반 색상 그라데이션 | ✅ | 중심: 진한색, depth↑: 연한색 |
| 무지개 테마 선택기 | ✅ | 빨주노초파남보 7색 |
| Depth 기반 노드 크기 | ✅ | 45px → 20px (depth별 -7px) |
| Depth 선택 드롭다운 제거 | ✅ | maxDepth=10 고정 |
| 엣지 클릭 → 관계 편집 모달 | ✅ | EdgeFormModal.tsx |
| 노드 연결 시 관계 유형 선택 | ✅ | weak/strong, 관련도, 라벨 |
| 엣지 라벨 표시 | ✅ | 엣지 중간에 텍스트 |
frontend/src/
├── types/index.ts # ColorTheme, label, description 추가
├── components/
│ ├── graph/
│ │ ├── RadialGraph.tsx # 그라데이션, 엣지 라벨, 더블클릭
│ │ └── GraphControls.tsx # 테마 선택기
│ ├── panel/
│ │ ├── EdgeFormModal.tsx # [NEW] 엣지 편집 모달
│ │ └── index.ts # export 추가
│ └── sidebar/
│ └── NodeList.tsx
├── api/
│ └── relationApi.ts # deleteByEndpoints 추가
└── App.tsx # 엣지 모달 상태, 핸들러
완료일: 2026-01-26 담당: Claude Code
backend/src/main/java/com/mandalgraph/
├── controllers/RelationController.java # REST 엔드포인트
├── services/RelationService.java # 비즈니스 로직
└── dtos/
├── CreateRelationRequest.java
├── UpdateRelationRequest.java
└── RelationDto.java
- APOC
relationshipFilter쿼리 문자열 직접 삽입 - 빈 데이터 반환 문제 해결
// GoalRelation.java - 필드 추가됨
private String label;
private String description;// GraphEdge.java - 필드 추가됨
private Long id;
private String label;
private String description;| 메서드 | 엔드포인트 | 설명 | 상태 |
|---|---|---|---|
| POST | /api/goals |
목표 생성 | ✅ |
| GET | /api/goals/{id} |
단일 목표 조회 | ✅ |
| GET | /api/goals/roots |
루트 목표 목록 | ✅ |
| GET | /api/goals/{id}/children |
하위 목표 목록 | ✅ |
| GET | /api/goals/{id}/status-summary |
상태 요약 | ✅ |
| PUT | /api/goals/{id} |
목표 수정 | ✅ |
| DELETE | /api/goals/{id} |
목표 삭제 | ✅ |
| 메서드 | 엔드포인트 | 설명 | 상태 |
|---|---|---|---|
| GET | /api/relations/by-source/{id} |
소스 노드의 관계 조회 | ✅ |
| GET | /api/relations/by-target/{id} |
타겟 노드의 관계 조회 | ✅ |
| GET | /api/relations/{id} |
ID로 관계 조회 | ✅ |
| POST | /api/relations |
관계 생성 | ✅ |
| PUT | /api/relations/{id} |
관계 수정 | ✅ |
| DELETE | /api/relations/{id} |
ID로 삭제 | ✅ |
| DELETE | /api/relations/by-endpoints |
source/target으로 삭제 | ✅ |
| 메서드 | 엔드포인트 | 설명 | 상태 |
|---|---|---|---|
| GET | /api/graph/radial/{goalId} |
방사형 그래프 | ✅ |
┌────────────────────────────────────────────────────────────┐
│ 사용자 인터랙션 │
├────────────────────────────────────────────────────────────┤
│ │
│ [캔버스 더블클릭] │
│ ↓ │
│ goalApi.create({title: "새 목표"}) → 루트 노드 생성 │
│ │
│ [테두리 드래그 → 빈공간] │
│ ↓ │
│ goalApi.create({..., parentId}) → 자식 노드 생성 │
│ │
│ [노드 더블클릭] │
│ ↓ │
│ goalApi.getById() → 편집 모달 열기 │
│ ↓ │
│ goalApi.update() → DB 업데이트 │
│ │
│ [노드 연결 (테두리→노드)] │
│ ↓ │
│ EdgeFormModal 열기 → 유형/강도/라벨 선택 │
│ ↓ │
│ relationApi.create() → 관계 생성 │
│ │
│ [엣지 클릭] │
│ ↓ │
│ EdgeFormModal 열기 (편집 모드) │
│ ↓ │
│ relationApi.create() → 관계 업데이트 (TODO: PUT 필요) │
│ │
└────────────────────────────────────────────────────────────┘
완료일: 2026-01-26 담당: Claude Code
| 기능 | 상태 | 설명 |
|---|---|---|
| 노드 클릭 → 상세 패널 | ✅ | D3 드래그 핸들러 내 클릭 감지 |
| 노드 더블클릭 → 중심 이동 | ✅ | 300ms 이내 재클릭 감지 |
| 길게 누르기 → 삭제 버튼 | ✅ | 800ms 홀드 시 X 버튼 표시 |
| API URL 중복 수정 | ✅ | userApi.ts, topologyApi.ts |
frontend/src/
├── api/
│ ├── userApi.ts # /api 접두사 제거
│ └── topologyApi.ts # /api 접두사 제거
├── components/graph/
│ └── RadialGraph.tsx # 클릭/더블클릭/롱프레스 구현
└── pages/
└── GraphEditorPage.tsx # onNodeDelete 핸들러 추가
완료일: 2026-01-26 담당: Claude Code
| 기능 | 상태 | 설명 |
|---|---|---|
| 노션 스타일 문서 패널 | ✅ | 제목/설명 자동 저장 (디바운스) |
| 우클릭 컨텍스트 메뉴 | ✅ | 중심설정, 하위추가, 상태변경, 삭제 |
| 텍스트 높이 자동 조절 | ✅ | 설명 입력 시 자동 확장 |
| 상태 즉시 변경 | ✅ | 버튼 클릭으로 DB 업데이트 |
frontend/src/
├── components/graph/
│ ├── NodeContextMenu.tsx # [NEW] 우클릭 메뉴
│ ├── RadialGraph.tsx # onNodeContextMenu 추가
│ └── index.ts # export 추가
├── components/panel/
│ └── GoalDetailPanel.tsx # 노션 스타일 전면 개편
└── pages/
└── GraphEditorPage.tsx # 컨텍스트 메뉴 핸들러
- Spring Security + JWT 기반 인증
- 로그인/회원가입 API
- Frontend 토큰 관리
| 기능 | 상태 | 설명 |
|---|---|---|
| Spring Security 설정 | ⏳ | 의존성, 필터 체인 |
| JWT 유틸리티 | ⏳ | 토큰 생성/검증 |
| AuthController | ⏳ | 로그인, 회원가입 |
| User 비밀번호 | ⏳ | BCrypt 해싱 |
| Frontend 토큰 관리 | ⏳ | Authorization 헤더 |
-
추가 UX 개선
- 로딩 스피너
- 에러 토스트 메시지
- 빈 상태 안내
-
성능 최적화
- 대량 노드 렌더링 최적화
- 그래프 데이터 캐싱
-
배포 준비
- 환경 변수 분리
- Docker 프로덕션 설정
frontend/src/
├── types/index.ts # Goal, GraphNode, GraphEdge, ColorTheme
├── api/
│ ├── client.ts # Axios 인스턴스 (+ Authorization 헤더)
│ ├── goalApi.ts # Goal CRUD
│ ├── relationApi.ts # Relation CRUD
│ ├── graphApi.ts # Graph 조회
│ ├── userApi.ts # User API
│ └── topologyApi.ts # Topology API
├── stores/
│ ├── authStore.ts # 인증 상태
│ └── topologyStore.ts # 토폴로지 상태
├── pages/
│ ├── LoginPage.tsx # 로그인 화면
│ ├── TopologyListPage.tsx # 토폴로지 목록
│ └── GraphEditorPage.tsx # 그래프 편집기
├── components/
│ ├── graph/
│ │ ├── RadialGraph.tsx # D3.js 방사형 그래프
│ │ ├── GraphControls.tsx # 테마 선택, weak 토글
│ │ ├── GraphLegend.tsx # 범례
│ │ └── NodeContextMenu.tsx # 우클릭 메뉴
│ ├── panel/
│ │ ├── GoalDetailPanel.tsx # 노션 스타일 목표 상세
│ │ ├── GoalForm.tsx # 목표 폼
│ │ ├── EdgeFormModal.tsx # 엣지 편집 모달
│ │ └── StatusBadge.tsx # 상태 배지
│ ├── sidebar/
│ │ └── NodeList.tsx # 드래그 가능 노드 목록
│ └── navigation/
│ ├── Header.tsx
│ └── Breadcrumb.tsx
└── App.tsx # 라우터 설정