NBE6-8-2-Team03 사이보이즈
TodoDuk은 개인 및 팀 할일 관리를 위한 웹 애플리케이션입니다. Spring Boot를 기반으로 한 REST API 백엔드로 구성되어 있으며, 할일 관리, 팀 협업, 라벨링, 알림 등의 기능을 제공합니다.
- Backend: Spring Boot 3.5.4, JPA/Hibernate, Spring Security
- Database: H2 (개발환경)
- Authentication: JWT + API Key
- Scheduler: Quartz
- API Documentation: Swagger/OpenAPI 3
- Framework: Spring Boot 3.5.3
- Language: Java 21
- Database: H2 (개발), MySQL (운영 지원)
- Cache: Redis (토큰 저장소)
- Security: Spring Security + JWT
- Documentation: SpringDoc OpenAPI 3.x (Swagger)
- Build Tool: Gradle 8.14.3 (Kotlin DSL)
- Framework: Next.js 15.4.1
- Language: TypeScript
- Styling: Tailwind CSS 4.0
- State Management: Zustand
- HTTP Client: Axios
- UI Components: Radix UI, Lucide React
- Dev Tools: ESLint, Prettier
- CI/CD: GitHub Actions
- API Generation: swagger-typescript-api
- Development: Docker (Redis)
graph TB
subgraph "Client Layer"
WEB[Web Browser/Frontend]
end
subgraph "API Gateway"
CORS[CORS Handler]
AUTH[Authentication Filter]
CTRL[Spring Controllers]
end
subgraph "Business Logic Layer"
US[User Service]
TS[Team Service]
TMS[TeamMember Service]
TLS[TodoList Service]
TOS[Todo Service]
LS[Label Service]
TLS2[TodoLabel Service]
RS[Reminder Service]
NS[Notification Service]
end
subgraph "Data Access Layer"
UR[User Repository]
TR[Team Repository]
TMR[TeamMember Repository]
TLR[TodoList Repository]
TOR[Todo Repository]
LR[Label Repository]
TLSR[TodoLabel Repository]
RR[Reminder Repository]
NR[Notification Repository]
TAR[TodoAssignment Repository]
end
subgraph "External Systems"
QUARTZ[Quartz Scheduler]
JWT[JWT Token Service]
FILE[File Upload Service]
end
subgraph "Database"
H2[(H2 Database)]
end
WEB --> CORS
CORS --> AUTH
AUTH --> CTRL
CTRL --> US
CTRL --> TS
CTRL --> TMS
CTRL --> TLS
CTRL --> TOS
CTRL --> LS
CTRL --> TLS2
CTRL --> RS
CTRL --> NS
US --> UR
TS --> TR
TMS --> TMR
TLS --> TLR
TOS --> TOR
LS --> LR
TLS2 --> TLSR
RS --> RR
NS --> NR
TS --> TAR
UR --> H2
TR --> H2
TMR --> H2
TLR --> H2
TOR --> H2
LR --> H2
TLSR --> H2
RR --> H2
NR --> H2
TAR --> H2
RS --> QUARTZ
US --> JWT
US --> FILE
erDiagram
Users ||--o{ TodoLists : has
Users ||--o{ TeamMembers : belongs_to
Users ||--o{ Labels : owns
Users ||--o{ Notifications : receives
Teams ||--o{ TeamMembers : has
Teams ||--o{ TodoLists : contains
Teams ||--o{ TodoAssignments : manages
TodoLists ||--o{ Todos : contains
Todos ||--o{ TodoLabels : has
Todos ||--o{ Reminders : scheduled
Todos ||--o{ TodoAssignments : assigned_to
Labels ||--o{ TodoLabels : applied_to
Users {
int id PK
string userEmail UK
string password
string nickName
boolean isAdmin
string profileImgUrl
string apiKey UK
datetime createDate
datetime modifyDate
}
Teams {
int id PK
string teamName
string description
datetime createDate
datetime modifyDate
}
TeamMembers {
int id PK
int user_id FK
int team_id FK
enum role
datetime joinedAt
datetime createDate
datetime modifyDate
}
TodoLists {
int id PK
string name
string description
int user_id FK
int team_id FK
datetime createDate
datetime modifyDate
}
Todos {
int id PK
string title
string description
boolean isCompleted
int priority
datetime startDate
datetime dueDate
int todoList_id FK
datetime createDate
datetime modifyDate
}
Labels {
int id PK
string name
string color
datetime createDate
datetime modifyDate
}
TodoLabels {
int id PK
int todo_id FK
int label_id FK
datetime createDate
datetime modifyDate
}
Reminders {
int id PK
int todo_id FK
datetime remindAt
string method
datetime createDate
datetime modifyDate
}
Notifications {
int id PK
int user_id FK
string title
string description
string url
boolean isRead
datetime createDate
datetime modifyDate
}
TodoAssignments {
int id PK
int todo_id FK
int assigned_user_id FK
int team_id FK
datetime assignedAt
enum status
datetime createDate
datetime modifyDate
}
flowchart TD
START([시작]) --> LOGIN{로그인 요청}
LOGIN -->|회원가입| REGISTER[회원가입 처리]
LOGIN -->|로그인| AUTH[인증 처리]
REGISTER --> SAVE_USER[사용자 정보 저장]
SAVE_USER --> GEN_API[API Key 생성]
GEN_API --> SUCCESS_REG[회원가입 성공]
AUTH --> CHECK_USER{사용자 존재 확인}
CHECK_USER -->|없음| FAIL[로그인 실패]
CHECK_USER -->|존재| CHECK_PWD{비밀번호 확인}
CHECK_PWD -->|틀림| FAIL
CHECK_PWD -->|맞음| GEN_TOKEN[Access Token 생성]
GEN_TOKEN --> SET_COOKIE[쿠키 설정]
SET_COOKIE --> SUCCESS_LOGIN[로그인 성공]
SUCCESS_REG --> END([종료])
SUCCESS_LOGIN --> END
FAIL --> END
flowchart TD
START([Todo 관리 시작]) --> ACTION{액션 선택}
ACTION -->|Todo 생성| CREATE_TODO[Todo 생성]
ACTION -->|Todo 수정| UPDATE_TODO[Todo 수정]
ACTION -->|Todo 삭제| DELETE_TODO[Todo 삭제]
ACTION -->|완료 처리| TOGGLE_TODO[완료 상태 토글]
ACTION -->|담당자 지정| ASSIGN_TODO[담당자 지정]
CREATE_TODO --> GET_TODOLIST{TodoList 확인}
GET_TODOLIST -->|없음| CREATE_TODOLIST[TodoList 생성]
GET_TODOLIST -->|있음| SAVE_TODO[Todo 저장]
CREATE_TODOLIST --> SAVE_TODO
SAVE_TODO --> SUCCESS1[Todo 생성 성공]
UPDATE_TODO --> FIND_TODO{Todo 존재 확인}
FIND_TODO -->|없음| NOT_FOUND[Todo 없음]
FIND_TODO -->|있음| CHECK_PERMISSION{수정 권한 확인}
CHECK_PERMISSION -->|권한 없음| PERM_FAIL[권한 실패]
CHECK_PERMISSION -->|권한 있음| UPDATE_DATA[Todo 데이터 업데이트]
UPDATE_DATA --> SUCCESS2[Todo 수정 성공]
DELETE_TODO --> FIND_TODO2{Todo 존재 확인}
FIND_TODO2 -->|없음| NOT_FOUND
FIND_TODO2 -->|있음| CHECK_DELETE_PERM{삭제 권한 확인}
CHECK_DELETE_PERM -->|권한 없음| PERM_FAIL
CHECK_DELETE_PERM -->|권한 있음| DELETE_LABELS[연관 라벨 삭제]
DELETE_LABELS --> DELETE_ASSIGNMENTS[담당자 정보 삭제]
DELETE_ASSIGNMENTS --> DELETE_TODO_DATA[Todo 데이터 삭제]
DELETE_TODO_DATA --> SUCCESS3[Todo 삭제 성공]
ASSIGN_TODO --> CHECK_TEAM_MEMBER{팀 멤버 확인}
CHECK_TEAM_MEMBER -->|아님| TEAM_FAIL[팀 멤버 아님]
CHECK_TEAM_MEMBER -->|맞음| CREATE_ASSIGNMENT[담당자 지정]
CREATE_ASSIGNMENT --> SUCCESS4[담당자 지정 성공]
SUCCESS1 --> END([종료])
SUCCESS2 --> END
SUCCESS3 --> END
SUCCESS4 --> END
NOT_FOUND --> END
PERM_FAIL --> END
TEAM_FAIL --> END
flowchart TD
START([팀 관리 시작]) --> AUTH_CHECK{인증 확인}
AUTH_CHECK -->|실패| AUTH_FAIL[인증 실패]
AUTH_CHECK -->|성공| ACTION{액션 선택}
ACTION -->|팀 생성| CREATE_TEAM[팀 생성]
ACTION -->|팀 수정| MODIFY_TEAM[팀 정보 수정]
ACTION -->|멤버 관리| MEMBER_MGMT[멤버 관리]
ACTION -->|팀 삭제| DELETE_TEAM[팀 삭제]
CREATE_TEAM --> SAVE_TEAM[팀 정보 저장]
SAVE_TEAM --> CREATE_LEADER[생성자를 리더로 추가]
CREATE_LEADER --> SUCCESS1[팀 생성 성공]
MODIFY_TEAM --> CHECK_LEADER{리더 권한 확인}
CHECK_LEADER -->|권한 없음| PERM_FAIL[권한 실패]
CHECK_LEADER -->|권한 있음| UPDATE_TEAM[팀 정보 업데이트]
UPDATE_TEAM --> SUCCESS2[수정 성공]
MEMBER_MGMT --> MEMBER_ACTION{멤버 액션}
MEMBER_ACTION -->|멤버 추가| ADD_MEMBER[멤버 추가]
MEMBER_ACTION -->|역할 변경| CHANGE_ROLE[역할 변경]
MEMBER_ACTION -->|멤버 제거| REMOVE_MEMBER[멤버 제거]
ADD_MEMBER --> CHECK_EMAIL{이메일 존재 확인}
CHECK_EMAIL -->|없음| EMAIL_FAIL[사용자 없음]
CHECK_EMAIL -->|있음| ADD_TO_TEAM[팀에 추가]
ADD_TO_TEAM --> SUCCESS3[멤버 추가 성공]
DELETE_TEAM --> CHECK_DELETE_AUTH{삭제 권한 확인}
CHECK_DELETE_AUTH -->|권한 없음| PERM_FAIL
CHECK_DELETE_AUTH -->|권한 있음| REMOVE_ASSIGNMENTS[담당자 정보 삭제]
REMOVE_ASSIGNMENTS --> REMOVE_TODOLISTS[팀 할일목록 삭제]
REMOVE_TODOLISTS --> REMOVE_TEAM_DATA[팀 데이터 삭제]
REMOVE_TEAM_DATA --> SUCCESS4[팀 삭제 성공]
SUCCESS1 --> END([종료])
SUCCESS2 --> END
SUCCESS3 --> END
SUCCESS4 --> END
AUTH_FAIL --> END
PERM_FAIL --> END
EMAIL_FAIL --> END
graph LR
subgraph "Actors"
U[User]
TL[Team Leader]
TM[Team Member]
SYS[System]
end
subgraph "Authentication & User Management"
UC1[Register Account]
UC2[Login/Logout]
UC3[View Profile]
UC4[Update Profile]
UC5[Upload Profile Image]
end
subgraph "Todo Management"
UC6[Create Todo]
UC7[Update Todo]
UC8[Delete Todo]
UC9[Mark Complete]
UC10[View Todos]
UC11[Filter Todos]
end
subgraph "Todo List Management"
UC12[Create Todo List]
UC13[Update Todo List]
UC14[Delete Todo List]
UC15[View Todo Lists]
end
subgraph "Label Management"
UC16[Create Label]
UC17[Apply Labels to Todo]
UC18[Remove Labels]
UC19[View Labels]
end
subgraph "Team Management"
UC20[Create Team]
UC21[Update Team Info]
UC22[Delete Team]
UC23[View Team Details]
UC24[Add Team Member]
UC25[Remove Team Member]
UC26[Change Member Role]
UC27[View Team Stats]
end
subgraph "Team Todo Management"
UC28[Create Team Todo]
UC29[Assign Todo to Member]
UC30[Unassign Todo]
UC31[View Team Todos]
UC32[Track Assignment History]
end
subgraph "Reminder & Notification"
UC33[Create Reminder]
UC34[Delete Reminder]
UC35[View Reminders]
UC36[Receive Notifications]
UC37[Mark Notification Read]
UC38[Schedule Reminder Job]
end
%% User relationships
U --> UC1
U --> UC2
U --> UC3
U --> UC4
U --> UC5
U --> UC6
U --> UC7
U --> UC8
U --> UC9
U --> UC10
U --> UC11
U --> UC12
U --> UC13
U --> UC14
U --> UC15
U --> UC16
U --> UC17
U --> UC18
U --> UC19
U --> UC33
U --> UC34
U --> UC35
U --> UC36
U --> UC37
%% Team Leader relationships
TL --> UC20
TL --> UC21
TL --> UC22
TL --> UC24
TL --> UC25
TL --> UC26
%% Team Member relationships
TM --> UC23
TM --> UC27
TM --> UC28
TM --> UC29
TM --> UC30
TM --> UC31
TM --> UC32
%% System relationships
SYS --> UC38
flowchart TD
REQUEST[클라이언트 요청] --> CORS_CHECK[CORS 검증]
CORS_CHECK --> AUTH_FILTER[인증 필터]
AUTH_FILTER --> PERMIT_CHECK{인증 불필요 경로?}
PERMIT_CHECK -->|Yes| CONTROLLER[컨트롤러 실행]
PERMIT_CHECK -->|No| TOKEN_CHECK[토큰 확인]
TOKEN_CHECK --> HEADER_CHECK{Authorization 헤더?}
HEADER_CHECK -->|Yes| EXTRACT_HEADER[헤더에서 토큰 추출]
HEADER_CHECK -->|No| COOKIE_CHECK[쿠키에서 토큰 추출]
EXTRACT_HEADER --> VALIDATE_TOKEN{토큰 유효성 검증}
COOKIE_CHECK --> VALIDATE_TOKEN
VALIDATE_TOKEN -->|Valid AccessToken| SET_AUTH[Security Context 설정]
VALIDATE_TOKEN -->|Invalid AccessToken| API_KEY_CHECK[API Key로 사용자 조회]
VALIDATE_TOKEN -->|No Token| UNAUTHORIZED[인증 실패]
API_KEY_CHECK -->|Found| GENERATE_NEW[새 AccessToken 생성]
API_KEY_CHECK -->|Not Found| UNAUTHORIZED
GENERATE_NEW --> SET_COOKIE[쿠키 설정]
SET_COOKIE --> SET_AUTH
SET_AUTH --> CONTROLLER
UNAUTHORIZED --> ERROR_RESPONSE[401 에러 응답]
CONTROLLER --> RESPONSE[응답 반환]
- 팀 생성: 사용자가 팀을 생성하면 자동으로 리더 권한 부여
- 멤버 초대: 리더만 새로운 멤버 추가 가능 (이메일 기반)
- 권한 관리: 리더는 멤버 역할 변경 및 제거 가능
- 팀 삭제: 마지막 리더는 제거 불가, 팀 삭제 시 관련 데이터 연쇄 삭제
- 개인 할일: 사용자 개별 관리
- 팀 할일: 팀 멤버만 생성/수정 가능
- 할일 할당: 팀 멤버를 할일에 담당자로 지정
- 할당 기록: 모든 할당 변경사항 추적 및 이력 관리
- 리마인더 설정: 할일에 대한 시간 기반 알림 설정
- 스케줄링: Quartz를 통한 백그라운드 작업 실행
- 알림 생성: 예정된 시간에 알림 자동 생성
- 알림 관리: 사용자별 알림 조회 및 읽음 처리
- 사용자 인증: JWT + API Key 기반 보안 시스템
- 개인 할일 관리: CRUD, 우선순위, 마감일, 완료 상태 관리
- 팀 협업: 팀 생성, 멤버 관리, 역할 기반 권한 제어
- 팀 할일 관리: 팀원 간 할일 공유 및 담당자 지정
- 라벨링: 색상 기반 라벨로 할일 분류
- 리마인더: 시간 기반 알림 스케줄링
- 파일 업로드: 프로필 이미지 관리
- RESTful API: 표준 REST 아키텍처
- 트랜잭션 관리: Spring의 선언적 트랜잭션
- 예외 처리: 전역 예외 처리기로 일관된 오류 응답
- 데이터 검증: Bean Validation을 통한 입력 데이터 검증
- CORS 지원: 프론트엔드와의 안전한 통신
- API 문서화: Swagger/OpenAPI 3 자동 문서 생성
태그 종류
feature
: 새로운 기능 추가 (feature)fix
: 버그 수정chore
: 코드 변경이 아닌 빌드, 설정, 문서 수정 등 잡일성 작업docs
: 문서 수정style
: 코드 포맷팅, 세미콜론 누락 등 코드 스타일 관련 변경refactor
: 리팩토링 (기능 변화 없이 코드 구조 개선)test
: 테스트 추가/수정perf
: 성능 개선 [기술 분야] / [작업 종류] / [이슈넘버]-[구현 기능] Ex)be/feature/1-login
여기서 이슈 넘버는 git issue 등록 시 나오는 숫자로 한다