AI와 통계로 사용자의 하루를 설계하는 일정 관리 서비스 PinIt 의 백엔드 서버
PinIt 이 추구하는 핵심 목적은 다음 세 가지입니다.
-
사용자의 통계 기록 및 피드백
- 사용자의 일정/집중 시간/업무 시간을 지속적으로 기록
- 주간·월간 단위의 리포트와 피드백을 제공하여 “시간 쓰는 습관”을 개선
-
AI와 상호작용하며 복잡한 일정을 구체화
- “이 프로젝트 2주 안에 끝내고 싶은데, 어떻게 쪼개야 하지?” 같은 의문에 대해
- AI가 작업을 쪼개고, 각 작업을 캘린더 상의 슬롯에 구체적인 계획으로 배치하는 것을 목표
이 저장소는 위 목적을 달성하기 위한 백엔드 도메인·API·비즈니스 로직을 담당합니다.
- Language: Java
- Framework
- Spring Boot (Web, Validation 등)
- Spring Data JPA
- Persistence
- JPA(Hibernate)
- Querydsl (타입 세이프한 조회용)
- Database: MySQL (로컬/운영 환경에서 사용)
- Build: Gradle (Gradle Wrapper 포함)
- Test: JUnit 5, Spring Test 등
정확한 의존성 버전 및 설정은
build.gradle,src/main/resources설정 파일을 참고하세요.
사용자가 실제로 수행하는 “할 일/작업”에 해당합니다.
- 일정 타입 (집중 작업, 행정 작업, 짧은 업무 등)
- 중요도 / 긴급도
- 예상 소요 시간
- 마감 일자
- 현재 상태 (예정, 진행 중, 완료 등)
- 고정 일정 여부 (캘린더 상에서 움직일 수 있는지 여부)
일정 간 “선후 관계”를 관리하는 도메인입니다.
from일정이 먼저 끝나야to일정을 시작할 수 있음- 일정 간 사이클 검사를 통해 잘못된 의존 관계를 방지
- 일정 삭제 시 관련 의존 관계를 적절히 처리
복잡한 의존관계/사이클 검사는 “복잡한 일정(프로젝트)”을 AI와 함께 구체화할 때 핵심이 되는 도메인입니다.
사용자의 시간 사용 패턴 및 환경을 담는 도메인입니다.
- 계정 정보 (아이디, 닉네임 등)
- 생활 패턴 (수면 시간, 식사 시간, 쉬는 날 등)
- 이번 주 집중 시간, 업무 시간 등의 집계 정보
이 정보들을 기반으로, **AI 추천 시 “그 사람에게 맞는 플랜”**을 만들 수 있도록 설계합니다.
-
일정 생성
- 일정의 기본 정보(제목, 타입, 마감일, 중요도, 긴급도, 예상 소요 시간 등)를 입력받아 생성
-
일정 조회
- 특정 날짜의 일정 목록 조회
- 주간 단위 일정 조회 (ex.
/schedules/week)
-
일정 상세 조회
- 단일 일정의 상세 정보 반환
-
일정 수정 (PATCH)
- 변경된 필드만 부분 업데이트
- DTO에 없는 필드가
null로 덮어씌워지는 문제를 피하기 위해 **“Patch 전용 객체/도메인 로직”**을 두는 방향으로 설계
-
일정 삭제
- 삭제 시 관련 의존관계를 포함한 도메인 규칙을 지키도록 구현
-
일정 간 선행/후행 관계 등록
-
일정 삭제 시, 연관된 의존관계 정리
-
사이클 검사
- 사용자의 모든 의존 그래프를 기반으로 위상 정렬 등으로 사이클 여부 검사
- 잘못된 의존관계로 인해 계획이 꼬이는 것을 방지
(구현/설계 범위에 맞추어 점진적으로 확장)
- 일/주 단위 집중 작업 시간 집계
- 일/주 단위 일반 업무 시간 집계
- 통계 API를 통해 프론트에서 시각화 및 피드백 화면 구성
이 백엔드는 AI와 상호작용하기 위한 도메인/데이터 기반을 제공하는 것을 목표로 합니다.
-
간단한 일정 추천
- 3시간 정도 걸릴 것 같은 일정이 있을 때,
- 사용자의 남은 시간/우선순위/집중 시간 통계 등을
- 강화학습 모델에 전달하여 일정을 수행할 시점을 추천받는 기능
- RLHF 기반으로 사용자의 시간 관리 성향을 반영하는 AI
-
복잡한 일정 쪼개기
- “TOEIC 900점, 2개월 안에” 같은 일정을 등록하려 할 때
- LLM에게 일정 검토 요청
- 목표를 달성 가능한 단위 작업으로 분해
- 각 작업들 간 선후관계(Dependency) 생성
- 각 작업을 캘린더 상의 슬롯으로 배치하는 로직/AI 연동
- “TOEIC 900점, 2개월 안에” 같은 일정을 등록하려 할 때
현재 저장소는 도메인/데이터/트랜잭션 레이어를 먼저 단단하게 다지는 것에 초점을 두고 있으며, AI 연동은 별도 서비스(OpenAI 등)와 HTTP 또는 메시지 큐로 연동하는 형태를 염두에 두고 있습니다.
-
DDD 지향 설계
- 일정, 의존관계, 사용자 통계를 각각의 도메인으로 바라보고, 도메인 규칙(사이클 검사, 선행 완료 조건 등)을 도메인 레이어에 집중
-
명령형보다 선언형에 가까운 Patch 설계
- HTTP PATCH에서 필드별 조건문/switch-case 대신 “Patch 객체 → 도메인 메소드” 형태로 적용하여 가독성과 유지보수성 향상
-
트랜잭션 경계 분리
- 일정과 의존관계를 별도 애그리거트로 바라보고
- UX 관점에서 “일정 삭제 실패/롤백” 같은 문제를 최소화하도록 설계