
프로젝트 한눈에 보기
흩어진 생각을 입력하면 AI가 할 일과 아이디어로 정리를 돕는 생산성 서비스입니다. 사용자가 결과를 확인·수정한 뒤 실행으로 옮길 수 있도록, 웹·Windows·Android를 공통 백엔드에 연결했습니다.
- 개발 기간
- 2026.04 — 진행 중
- 프로젝트 형태
- 1인 프로젝트
- 기술 스택
- Java · Spring Boot · PostgreSQL · Redis
- 제공 상태
- 웹·Windows 제공 / Android 비공개 테스트 중 · 2026.09.19 테스트 종료 후 공개 배포 예정
내가 맡은 일
요구사항과 설계 방향을 구상하고 AI의 검토를 받아 구체화했습니다. 코드 구현은 AI에 위임한 뒤 요구사항·실행 결과를 검토했으며, 서브에이전트와 스킬로 리뷰·테스트를 진행하고 직접 사용자 테스트를 이어 갔습니다.
대표 기록
시작한 이유
해야 할 일이 많아지고 바빠지면서, 평소에는 잘 정하던 일의 우선순위가 흐려지기 시작했습니다. 여러 일이 한꺼번에 떠오르다 보니 지금 무엇을 해야 하는지 놓치는 순간도 잦아졌습니다. 머릿속에 흩어진 일을 편하게 정리하고 다음 행동을 확인할 수 있는 방법이 필요했습니다.
아이디어를 기록할 때도 비슷한 부담이 있었습니다. 저에게 Notion은 페이지를 만들고 구성을 정하는 과정부터 하나의 일처럼 느껴졌고, 가벼운 메모 도구에서는 생각을 원하는 계층 구조로 정리하기가 아쉬웠습니다. 기록할 때 형식부터 고민하지 않아도 되는 서비스를 만들고 싶었습니다.
| 겪었던 불편 | 덤핏에서 풀어낸 방향 |
|---|---|
| 일이 몰리면 우선순위가 흐려지고 지금 할 일을 놓침 | 대시보드에서 지금 할 일과 다음 할 일을 확인 |
| 기록하기 전에 페이지와 구조부터 정하는 부담 | 브레인 덤프에 먼저 입력하고 AI가 할 일 후보를 제안 |
| 빠르게 적은 아이디어를 계층적으로 정리하기 어려움 | 상·하위 아이디어 연결과 할 일 전환 |
덤핏의 목표는 생각을 예쁘게 보관하는 데서 끝나지 않습니다. 할 일과 아이디어를 정리되지 않은 상태로 남기더라도, 다음에 무엇을 할지 결정하고 실행하는 흐름으로 이어지게 하는 것입니다.
AI와 사용자의 역할
사용자는 떠오르는 생각을 자유롭게 입력합니다. AI가 제목·설명·마감·예상 시간 등을 포함한 할 일 후보를 만들면, 사용자가 필요한 항목을 선택하고 수정합니다. 분석 요청과 저장 요청을 나누어, AI의 응답이 곧바로 사용자의 할 일이 되지 않도록 구성했습니다.
- 생각 입력
형식과 순서를 정하지 않고 떠오른 내용을 작성합니다.
- AI 분석
서버가 분석을 요청하고 구조화된 할 일 후보를 받습니다.
- 사용자 검토
등록할 후보를 선택하고 제목·마감 등의 내용을 수정합니다.
- 검증·저장
서버가 덤프 소유권과 입력 조건을 확인한 뒤 확정한 할 일을 저장합니다.
처음부터 정한 확인·수정 원칙
AI가 사용자의 의도를 항상 정확하게 해석할 수는 없다고 판단했습니다. 초기 설계부터 결과를 확인하고 수정한 뒤 저장한다는 원칙을 정했고, 이후 실제 사용 흐름을 점검하면서 등록 전 후보 수정 UI도 보완했습니다. 정리를 맡기는 편리함과 잘못된 결과를 바로잡는 과정을 함께 두었습니다.
세 플랫폼과 공통 백엔드
- 웹
React
- Windows
Electron
- Android
React Native · Expo
공통 API 요청
Java · Spring Security OAuth2 · JPA / 인증·소유권·입력 검증과 도메인 정책
데이터 저장 · 외부 서비스 연동
- PostgreSQL
할 일·아이디어·사용자 설정 / Flyway로 스키마 변경 관리
- Redis
서버 세션·외부 연동 토큰·AI 사용량
- OpenAI
생각 구조화·중요도·예상 시간 분석
- Google
로그인·Calendar 일정 가져오기
- FCM · Resend
푸시·이메일 알림
앱 확장에서도 기존 인증 구조 재사용
웹에서 시작해 Windows와 Android로 확장했습니다. Android는 네이티브 앱 경험과 기존 React 개발 경험을 고려해 React Native·Expo를 선택했습니다. 모바일의 Google ID 토큰을 서버에서 검증한 뒤 서버 세션을 발급하도록 연결해, 별도 JWT 인증 체계를 추가하는 대신 기존 계정과 세션 인프라를 활용했습니다.
플랫폼마다 로그인 세션은 별도로 가질 수 있습니다. 함께 유지해야 하는 것은 계정과 인증 처리 방식, 그리고 외부 연동 자원을 찾는 식별 기준입니다. Google Calendar는 일정을 할 일로 가져오는 기능이며 양방향 동기화는 제공하지 않습니다.
AI 호출 비용과 서비스 지속성의 절충
AI 기능마다 점수를 차감하고 하루 한도를 한국 시각 자정에 갱신합니다. 일일 한도는 100점이며 브레인 덤프와 아이디어 분석은 각각 5점입니다. 서버의 차감 규칙과 화면에 표시하는 비용을 함께 관리합니다.
Redis에서 사용량을 확인하지 못하면 요청을 허용하고 경고를 남기도록 했습니다. 제한 저장소의 장애가 AI 기능 전체의 중단으로 이어지는 것을 피하는 선택입니다. 대신 그 장애 동안에는 사용량 상한을 강제할 수 없다는 한계가 있습니다.
AI 중요도와 시간에 따른 긴급도 분리
우선순위 점수는 기본적으로 마감까지 남은 시간의 긴급도 60%와 AI 중요도 40%를 합산합니다. 시간이 지나 마감이 가까워져도 AI를 다시 호출할 필요 없이 규칙에 따라 점수가 변합니다. 사용자가 직접 지정한 값이 있으면 그 값을 중요도에 사용하고 최소값으로 보장하되, 마감이 임박하면 그보다 높아질 수 있도록 했습니다. 이 점수는 화면의 정렬에 활용하는 요소 중 하나입니다.
AI 오분류와 사용자 맥락
문제: AI는 나에게 익숙한 업무 표현을 몰랐습니다.
팀스파르타에서 프리랜서로 일하며 캘린더에 업무 일정을 ‘스파르타-고객사명’으로 기록했습니다. 저에게는 업무를 뜻하는 표현이었지만, AI는 그 배경을 알지 못해 다른 카테고리로 분류하거나 우선순위를 낮게 판단했습니다. 비슷한 결과를 매번 직접 수정하는 일이 반복되었습니다.
판단: 결과를 고치는 데서 분석 입력을 보완하는 쪽으로
반복되는 수정에는 AI에 전달되지 않은 사용자 맥락이 있다고 판단했습니다. 자주 쓰는 용어와 업무 배경, 중요하게 생각하는 기준을 직접 알려줄 수 있도록 ‘AI 메모리’를 추가했습니다. 같은 문장도 그 사용자에게 어떤 의미인지 함께 참고하도록 한 것입니다.
- 맥락 저장
마이페이지에서 작성한 AI 메모리를 사용자 설정에 저장합니다.
- 사용자별 조회
분석 요청 시 서버가 해당 사용자의 맥락을 불러옵니다.
- 함께 분석
맥락과 분석 대상을 프롬프트에 전달합니다. 맥락이 없으면 해당 블록을 제외합니다.
사용자 설정의 aiMemory는 수정과 비우기를 지원하며, 화면·서버·DB에 500자 제한을 반영했습니다. 예상 시간 추정, 우선순위 분석, 하위 할 일 제안, 브레인 덤프 분석, 아이디어 추출에 같은 사용자 맥락을 전달합니다. 저장·부분 수정·빈 값·길이 경계를 검사하는 테스트를 구성했습니다.
| 항목 | 맥락 추가 전 | 맥락 추가 후 |
|---|---|---|
| 카테고리 | 다른 카테고리로 분류되는 경우가 있었음 | 업무로 분류됨을 확인 |
| 우선순위 | 업무 중요도에 비해 낮게 판단 | 높게 설정됨을 확인 |
| 대응 방식 | 개별 결과를 반복 수정 | 사용자 맥락을 분석 입력에 반영 |
탈퇴와 계정 복구
탈퇴 후 30일 동안 복구할 수 있는 유예 정책을 도입한 뒤, Android 앱에서 탈퇴한 계정이 자동으로 복구되는 문제가 있었습니다. 로그인 상태를 회복하는 동작과 계정 탈퇴를 철회하는 동작이 연결된 것이 원인이었습니다.
- 탈퇴 완료
서버에서 계정을 비활성 상태로 변경합니다.
- 후속 정리 요청
앱이 로그아웃 과정에서 기기 토큰 해제를 요청합니다.
- 자동 재로그인
401 SESSION_INVALIDATED 응답을 일반적인 세션 만료처럼 처리합니다.
- 의도하지 않은 복구
서버가 재로그인을 유예 기간 내 복귀로 해석해 탈퇴를 철회합니다.
클라이언트 재시도와 서버 복구 조건을 함께 보완
앱의 자동 재로그인만 막는 것으로 끝내지 않고, 서버도 로그인 요청만으로 복구 의사를 추론하지 않도록 변경했습니다. 같은 401 응답이더라도 비활성 계정인지 일반적인 인증 문제인지에 따라 후속 동작이 달라져야 했습니다.
| 경계 | 변경한 동작 |
|---|---|
| 앱 자동 재로그인 | SESSION_INVALIDATED 응답은 자동 재로그인 대상에서 제외 |
| 서버 계정 복구 | allowRestore가 명시적으로 true일 때만 유예 계정 복구 |
| 사용자가 누른 로그인 | 먼저 복구 동의 없이 시도하고, 409 WITHDRAWAL_PENDING이면 확인창 표시 |
| 복구 확인 이후 | 동의한 경우에만 복구 요청, 거절하면 로그아웃 상태 유지 |
| 콘텐츠 복구 범위 | 탈퇴 처리 시각과 삭제 시각이 일치하는 항목만 복구 |
탈퇴 전에 사용자가 직접 삭제한 항목은 복구 대상에서 제외했습니다. 웹에서도 복구 확인 후 OAuth 흐름을 다시 시작하고, 세션에 저장한 복구 의사는 콜백에서 한 번 소비하도록 했습니다. 중단된 복구 의사가 이후 일반 로그인에 남는 경우까지 고려한 처리입니다.
상태 전이의 경계를 테스트로 확인하도록 구성
- 동의 누락·거절·수락복구 플래그가 없거나 false이면 복구 대기 상태를 유지하고, true인 요청에서 복구 경로로 진입하는지 검사합니다.
- 일반 로그인·재시도활성 계정 로그인은 유지하면서 비활성 계정 응답의 자동 재로그인을 제외하는지 검사합니다.
- 복구 데이터·유예 기간탈퇴 전 삭제한 데이터는 되살리지 않고, 유예 기간 종료 후에는 복구를 거절하고 영구 삭제하는 조건을 검사합니다.
로그 수집과 보관
장기적으로 자체 AI 모델을 활용해 할 일 분류와 우선순위 판단을 더 정교하게 만들고 싶었습니다. 이 가능성을 생각하며 로그 수집도 고민했습니다. 다만 미래의 활용 가능성과 지금 남겨야 하는 정보의 범위를 나누어 다뤘고, 현재 자체 모델이나 학습용 데이터셋은 구축하지 않았습니다.
활동 로그의 원문을 길이 정보로 대체
활동 로그에는 작업 종류와 변경 전후 상태를 기록합니다. 이때 제목·설명·내용·이름 같은 텍스트 원문이 반복해서 남지 않도록 공통 처리를 두었습니다. 예를 들어 제목 자체 대신 titleLength를 기록합니다. 새 로그뿐 아니라 기존 로그의 JSON에서도 원문 필드를 제거하도록 DB 마이그레이션을 추가했습니다.
| 기록 | 현재 저장하는 범위 |
|---|---|
| 활동 로그 | 작업 종류·대상·전후 상태와 텍스트 길이 정보 |
| AI 사용량 로그 | 기능 종류·차감 점수·누적량·잔여량·허용 여부와 사유. 프롬프트·응답 본문 필드 없음 |
| 사용자 AI 메모리 | 사용자가 직접 작성한 분석용 맥락. 사용량 로그와 별도의 사용자 설정 |
원문 제거의 대상은 활동 로그의 스냅샷입니다. 사용자가 서비스를 이용하는 데 필요한 할 일·아이디어 본문 저장과는 별개입니다. 원문 필드 대신 길이만 남기는 동작과 빈 입력 처리를 테스트 대상으로 두었습니다.
탈퇴일 대신 로그 생성일을 삭제 기준으로
기존 로그 정리는 계정의 탈퇴 시점을 기준으로 동작했습니다. 탈퇴하지 않은 활성 회원의 기록에는 조건이 적용되지 않아 오래된 로그가 계속 남을 수 있었습니다. 활동 로그와 AI 사용량 로그의 삭제 기준을 각 로그의 생성 시각으로 바꾸고, 기간이 지난 문의도 정리하도록 변경했습니다.
| 대상 | 기본 기간 | 기간을 계산하는 기준 |
|---|---|---|
| 활동 로그 | 90일 | 로그 생성 시각 |
| AI 사용량 로그 | 180일 | 로그 생성 시각 |
| 문의 | 365일 | 답변 시각, 답변이 없으면 접수 시각 |
활성 회원의 오래된 로그는 삭제하고 기간 내 로그는 유지하는 조건, 오래된 처리 완료 문의를 정리하는 조건을 테스트에 담았습니다. 위 기간은 코드의 기본 설정이며 운영 환경에서 실제 적용한 값이나 삭제 실적을 의미하지는 않습니다.
사용자 테스트와 품질
직접 서비스를 사용하면서 기능의 성공 여부뿐 아니라, 문제가 생겼을 때 원인을 이해하고 다시 시도할 수 있는지도 확인했습니다. 디자인을 개편하고 접근성을 보완했으며, 사용 중 만난 입력·화면 흐름의 문제를 개선 대상으로 삼았습니다.
사용자가 이해하고 전달할 수 있는 오류 안내
- 서버가 응답한 오류입력 수정 등 사용자가 조치할 수 있는 오류에는 서버의 안내 문구를 표시합니다.
- 응답을 받지 못한 오류네트워크 오류를 서버 응답 오류와 구분하고, 예상하지 못한 실패에는 진단 코드를 함께 제공합니다.
- Google 로그인 단계로그인 과정의 오류를 별도로 구분합니다. 사용자가 로그인을 취소한 경우에는 오류 메시지를 띄우지 않습니다.
이 오류 분류와 진단 코드 체계는 Android 앱에 구현했습니다. 단순히 ‘실패했습니다’로 끝내는 대신, 사용자가 상황을 이해하고 문제를 전달할 수 있는 단서를 남기는 데 목적을 두었습니다.
레트로 표현과 읽기·조작의 기준 분리
우주 픽셀 컨셉을 유지하면서 글자 크기·고대비·굵은 글자 등의 표시 설정을 반영했습니다. 장식과 글자 색의 역할을 나누고 본문과 입력에는 읽기 쉬운 글꼴을 사용했습니다. 로고·행성·보상에는 개성을 남기되, 입력과 목록에서는 장식의 비중을 줄이는 방향으로 다듬었습니다.
웹 공통 대화상자에는 접근 가능한 이름과 Escape 키 동작, 중첩 대화상자 닫기 등을 확인하는 테스트를 두었습니다. 표시 설정과 공통 UI 개선은 세 플랫폼에 반영했으며, NVDA·TalkBack의 핵심 흐름과 일부 배경 대비에 대한 수동 확인은 후속 과제로 남아 있습니다.
결과와 다음 단계
직접 사용하며 반복해서 고치던 AI 결과를 사용자 맥락이라는 제품 기능으로 연결했고, 실제 업무 일정의 분류와 우선순위가 의도에 맞게 바뀌는 것을 확인했습니다. 웹·Windows·Android가 공통 백엔드를 사용하는 과정에서는 인증 식별 기준과 계정 상태, 로그의 수집·삭제 조건처럼 플랫폼을 넘어 일관되어야 하는 규칙을 다뤘습니다.
이 프로젝트에서 제가 계속 맡은 역할은 문제와 개선 방향을 정하고, AI가 구현한 결과가 요구사항과 실제 사용 흐름에 맞는지 검토하는 일이었습니다. 동작하는 기능을 만드는 데서 더 나아가, 사용자가 결과를 수정하고 실패 원인을 이해할 수 있는 과정도 함께 다듬었습니다.
- 자체 AI 모델할 일 분류와 우선순위 등 AI 판단을 더 정교하게 만드는 것이 목표입니다. 모델 구축 방식, 사용할 데이터와 평가 방법은 앞으로 구체화할 예정입니다.
- Android 공개 배포2026.09.18 현재 비공개 테스트 중이며, 2026.09.19 테스트 종료 후 프로덕션 배포를 계획하고 있습니다.
- 데이터 정합성코인 잔액의 동시 갱신 문제를 후속 개선 대상으로 두고 있습니다. 보상 정책 구현과 동시 요청에서의 정합성 보장은 구분해 검증해야 합니다.
- 마이그레이션 검증테스트 프로파일의 스키마 자동 갱신이 실제 마이그레이션과의 차이를 가릴 가능성을 점검하고, 검증 방식을 보완할 계획입니다.