30 KiB
30 KiB
인수인계 메모
프로젝트 개요
- 프로젝트명: 10 Minute Planner 웹 UI
- 기술 스택: Vue 3 + Vite + TailwindCSS + JavaScript
- 현재 기준 버전:
v0.1.42준비 중 - Git 원격 저장소:
https://git.sori.studio/zenn/planner.sori.studio.git
기준 디자인
- Figma 펼침형 보기:
https://www.figma.com/design/ZgIAmg2YlVWpABD7JVLPzY/Untitled?node-id=1-36&m=dev - Figma 집중형 보기 + 사이드 정보:
https://www.figma.com/design/ZgIAmg2YlVWpABD7JVLPzY/Untitled?node-id=1-2472&m=dev
현재 제품 방향
- 기본 UX 방향은
1페이지 + 추가 정보 패널이다. 2페이지 펼침 보기는 비교용 보조 모드로 함께 유지한다.- 화면 인상은 종이 다이어리 같아야 하지만, 상호작용은 웹앱처럼 빠르고 자연스러워야 한다.
- 현재는 개인용 단일 브라우저 흐름으로 개발 중이지만, 이후 회원 기반 개인 문서 관리 서비스로 확장해야 한다.
- 최종적으로는 프론트엔드와 백엔드를 Docker로 묶어서 UGREEN NAS에서 구동할 예정이다.
backend/폴더에 백엔드 초안이 추가되었고, 현재는 프론트와 분리된 구조로 관리한다.
현재 구현 상태
- 메인 화면 셸:
src/App.vue - 플래너 종이 레이아웃:
src/components/PlannerPage.vue - 우측 달력 컴포넌트:
src/components/MiniCalendar.vue - 프론트 인증 모달:
src/components/AuthDialog.vue - 프론트 인증 클라이언트:
src/lib/authClient.js - 백엔드 엔트리 포인트:
backend/src/server.js - 백엔드 DB 스키마:
backend/src/db/schema.js - 백엔드 인증 라우트:
backend/src/routes/auth.js - 백엔드 목표 라우트:
backend/src/routes/goals.js - 백엔드 비밀번호/세션 유틸:
backend/src/lib/password.js - Docker Compose 진입점:
docker-compose.yml - 프론트 Dockerfile:
Dockerfile - 백엔드 Dockerfile:
backend/Dockerfile - nginx 프록시 설정:
deploy/nginx/default.conf - 실행 가이드 문서:
README.md - Tailwind 설정은 완료되어 있으며, 이 프로젝트의 스타일링 기준으로 유지한다.
- 현재 선택 날짜는 시스템 날짜 기준으로 시작한다.
COMMENT,TASKS,MEMO는 화면에서 바로 편집할 수 있다.- TASKS 왼쪽 라벨은 순번 고정이 아니라 자유 입력 가능하며, 기본값은 빈 상태다.
- MEMO 왼쪽 라벨 칸도 자유 입력 가능하다.
- TASKS 체크박스는 토글 가능하며, 체크 상태는 바로 시각적으로 반영된다.
- STATS 완료율은 전체 15칸이 아니라, 실제로 입력된 TASKS만 기준으로 계산한다.
TIME TABLE은 드래그로 10분 블록을 연속 선택할 수 있다.TIME TABLE은 우클릭 드래그 시 선택된 블록을 지우는 방식으로도 편집할 수 있다.TIME TABLE숫자 영역은 선택/드래그로 텍스트가 잡히지 않도록 막아두었다.TOTAL TIME은 타임테이블에서 선택된 블록 수를 기준으로 자동 계산된다.- 달력은 연/월 이동이 가능하며, 현재 보이는 월과 선택된 날짜 상태를 분리해서 관리한다.
- 달력 상단은 월 좌우 화살표, 클릭형 연도 선택,
TODAY버튼 구조로 동작한다. - 입력 내용이 있는 날짜는 달력 하단에 빨간 점으로 표시된다.
- 상단 날짜 표시에서는 토요일의
(토)만 파란색, 일요일의(일)만 빨간색으로 표시한다. - 플래너 상태는
localStorage에 저장되며, 날짜별 기록과 선택 날짜, 달력 보고 있던 월까지 복원된다. localStorage접근 로직은src/lib/plannerStorage.js로 분리하기 시작했고, 이후 API/DB adapter로 교체하기 쉬운 구조로 정리 중이다.- 프론트는 헤더에서
LOGIN/SIGN UP모달을 열 수 있고, 로그인 상태면 닉네임과LOGOUT버튼을 표시한다. - 인증 토큰과 현재 사용자 정보는 프론트 로컬 저장소에 따로 유지하고, 앱 시작 시
/api/auth/me로 세션 복원을 시도한다. - 프론트 플래너 API 클라이언트는
src/lib/plannerApi.js에 추가되었다. - 프론트 목표 API 클라이언트는
src/lib/goalsApi.js에 추가되었다. - 루트에서
npm run dev:backend,npm run db:generate,npm run db:migrate로 백엔드 명령을 호출할 수 있다. - 화면 탭은
PLANNER / STATS / GOALS / SETTINGS기준으로 확장되었다. - 기존 상단 헤더는 왼쪽 사이드 내비게이션으로 재구성되었고, A5 본문이 더 넓게 보이도록 조정되었다.
- 상단 전환 버튼으로
PLANNER / STATS화면을 오갈 수 있다. - 통계 화면에서는 전체 집중 시간, 평균 완료율, 기록 일수, 최근 7일 흐름, 최근 기록, 베스트 데이를 보여준다.
- 통계 화면은 시작일/종료일을 직접 선택해 그 기간 기준으로 지표를 다시 계산할 수 있다.
NEXT DAY영역의 요일도 본문 날짜와 같은 규칙으로 주말 색상이 적용된다.- 플래너 화면에서는
PRINT DAY버튼으로 현재 선택 날짜 문서를 바로 출력할 수 있다. - 인쇄 시에는 현재 선택된 하루 플래너 본문만 남기고, 헤더/사이드패널/통계 화면은 숨긴다.
- 출력 버튼은
PRINT 1-UP/PRINT 2-UP으로 분리되어 있다. PRINT 2-UP은 현재 날짜와 다음 날짜를 A4 가로 기준으로 나란히 출력하는 용도다.- 인쇄는 일반 화면을 그대로 찍는 방식이 아니라, 별도의
print-only전용 레이아웃을 사용한다. - A5 원본 비율을 유지한 채 A4 가로 안에 들어가도록
1-UP/2-UP각각 별도 배율로 압축한다. PRINT 1-UP은 A4 세로,PRINT 2-UP은 A4 가로 기준으로 분리해서 처리한다.- 브라우저 기본 인쇄 머리말/꼬리말이 켜져 있어도 2장으로 넘어가지 않도록 실제 인쇄 영역은 종이보다 조금 작게 잡는다.
- 인쇄 시
main,print-only,print-paper래퍼의 패딩/높이/페이지 분할 규칙까지 함께 제어해야 빈 2페이지를 줄일 수 있다. 1-UP은 여백이 과하지 않도록 다시 확대했고,2-UP은 한 페이지 고정 안정성을 위해 가로 폭과 세로 높이를 조금 더 보수적으로 조정했다.1-UP은 세로 가운데 정렬을 없애고 상단 기준으로 붙여야 여백이 덜 커 보인다.- 현재
1-UP은 프레임 자체를 A4 세로에 가깝게 키우고 배율을 크게 올려 빈 여백을 줄이는 방향으로 맞추고 있다. - 백엔드 초안은
Fastify + Drizzle + PostgreSQL조합으로 전환되었다. - 백엔드에는
/api/auth/signup,/api/auth/login,/api/auth/me가 추가되었다. - 백엔드에는
/api/auth/verification/request,/api/auth/verification/confirm이메일 인증 토큰 API가 추가되었다. - 백엔드에는
/api/auth/password-reset/request,/api/auth/password-reset/confirm비밀번호 재설정 토큰 API가 추가되었다. - 백엔드에는
/api/admin/overview관리자 요약 API가 추가되었다. - 백엔드에는
/api/planner/:entryDate단건 조회/저장과/api/planner?from=...&to=...범위 조회가 추가되었다. - 비밀번호는 Node 내장
crypto.scrypt기반 해시로 저장하고, 세션 토큰은auth_sessions테이블에 해시 형태로 저장한다. - 초기 실행 시
backend/src/db/init.js에서 테이블이 없으면 자동 생성하도록 맞춰두었다. - 플래너 저장은
planner_entries (user_id, entry_date)고유 키 기준으로 upsert 하도록 구성했다. - 현재 샌드박스에서는 포트 바인딩 제한 때문에 백엔드 실제 리슨 확인이 막힐 수 있다.
listen EPERM 0.0.0.0:3001은 코드 자체보다 실행 환경 제약에 가깝다.
확정된 결정사항
- 정적인 HTML보다 Vue가 적합하다. 날짜 전환, 모드 토글, 사이드 패널 요약, 이후 저장 기능 등 상태 기반 상호작용이 많기 때문이다.
- TailwindCSS는 Vue를 사용하더라도 반드시 유지해야 하는 스타일링 방식이다.
- 현재 데이터는 레이아웃과 상호작용 검증을 위한 목업 데이터다.
- 현재 저장은
localStorage를 사용하지만, 적절한 시점에 DB를 붙여 사용자별 저장 구조로 전환해야 한다. - 백엔드는 빠른 MVP라면 PocketBase도 가능하지만, 현재 요구사항에서는 전용 Node.js API + DB 구성이 더 유연하다.
- 이유는 회원가입, 사용자별 문서 관리, 통계 계산, 출력/이미지 저장, 이후 Docker Compose 배포까지 고려하면 서버 로직 제어권이 더 중요하기 때문이다.
- 상단 날짜는 시스템 날짜 또는 현재 선택된 플래너 날짜 기준으로 자동 표시되어야 한다.
D-DAY는 지금은 보류이며, 이후 별도의 목표 관리 패널과 연결해서 계산한다.COMMENT,TASKS,MEMO는 모두 입력 가능한 필드가 되어야 한다.- TASKS 라벨은 번호만 고정하지 말고 자유 입력이 가능해야 한다.
- 번호 사용이 필요한 경우를 위해 우측 패널에서 TASKS 라벨을 순번으로 한 번에 채울 수 있어야 한다.
TOTAL TIME은 타임테이블 선택 상태를 기반으로 자동 계산되어야 한다.- 타임테이블은 마우스 드래그로 여러 줄을 지나가더라도 시간 흐름 기준으로 연속 선택되도록 해석해야 한다.
- 타임테이블 편집은 좌클릭 드래그로 칠하기, 우클릭 드래그로 지우기 방식이 더 자연스럽다.
- 달력에는 연/월 이동 기능이 필요하다.
- 내용이 저장된 날짜에는 달력에 빨간 점 표시가 필요하다.
- 현재 단계의 저장 방식은
localStorage이며, 이후 외부 저장소 도입 전까지 기본 저장 경로로 사용한다. - 장기적으로는 회원 가입 후 사용자별로 각자 문서를 작성/관리할 수 있어야 한다.
- 공유 문서 서비스가 아니라, 사용자 개인 보관과 회고 중심의 서비스 구조를 목표로 한다.
- 사용자는 스스로 통계를 확인할 수 있어야 하고, 특정 날짜에 작성한 문서는 출력 가능해야 한다.
- 공유를 위해 나중에 이미지 저장 기능도 필요하지만, 실제 출력 품질과 텍스트 선명도는 HTML/CSS 인쇄 레이아웃을 우선 유지하는 편이 좋다.
- 원격 저장소
origin은https://git.sori.studio/zenn/planner.sori.studio.git로 연결되어 있다. - 앞으로 버전 체크포인트 커밋은
v0.1.7 - 작업 요약처럼 버전 뒤에 짧은 작업 설명을 함께 남기는 형식으로 통일한다. docker-compose.yml초안은 이미 추가되었고, 포트 번호와 실제 외부 공개 범위는 NAS 배포 단계에서 다시 확정하면 된다.backend/.env.example에는 기본PORT,DATABASE_URL,CORS_ORIGIN예시가 들어 있다.
다음 권장 작업
TODO.md기준으로 작은 단위씩 구현을 진행한다.- 목표나 통계 기능보다 먼저, 플래너 본문의 입력과 상호작용을 우선 구현한다.
- 통계 화면 구현은 현재
localStorage기반으로 먼저 진행해도 된다. - DB는 기능 탐색 속도를 해치지 않는 선에서, 저장 레이어를 분리할 수 있는 적절한 시점에 붙이는 것이 좋다.
- 현재 기준 추천 백엔드 방향은
Vue 프론트엔드 + Node.js API + PostgreSQL이다. - Docker 배포를 시작하는 시점이므로 SQLite보다 PostgreSQL을 기본 저장소로 유지하는 편이 낫다.
- 현재 인증 방식은 Bearer 토큰 기반의 간단한 세션 구조이며, 추후 쿠키/리프레시 토큰 전략으로 확장할 수 있다.
- 다음 프론트 단계에서는
src/lib/plannerStorage.js를 유지하되, 인증 이후 백엔드 저장소 adapter를 추가해서localStorage와 전환 가능하게 만드는 흐름이 좋다. - 현재 프론트는 인증만 연결된 상태이고, 플래너 저장은 아직
localStorage기준이다. - 로그인 상태에서는 플래너 수정 시 날짜별 서버 저장을 예약하고, 로그인 직후에는 서버 데이터를 먼저 가져오도록 연결하기 시작했다.
- 현재는 로컬 저장도 계속 유지하면서 서버 저장을 병행하는 과도기 구조다.
- 로그인 시 서버 플래너 데이터로
plannerRecords를 교체하고, 로그아웃 시에는 로컬 저장 기반 데이터로 다시 복귀하도록 정리했다. - 이로 인해 다른 사용자 로그인 시 이전 로컬 데이터가 서버 계정 데이터와 섞일 위험을 줄였다.
- 로그인 상태에서 특정 날짜의 플래너 내용을 완전히 비우면, 서버 저장 대신 해당 날짜 엔트리를 삭제하도록 정리했다.
- 현재는 로그인 전 플래너 진입을 막고, 인증 후에만 실제 플래너/통계 화면을 사용하도록 변경했다.
- 클라우드 저장 상태는 헤더가 아니라 오른쪽 하단의 작은 토스트 형태로 표시되도록 변경했다.
- 저장 완료 토스트는 한 줄짜리의 작은 상태 문구로 줄여서 존재감을 낮췄다.
- D-DAY는 플래너 안에서 목표를 고르는 구조가 아니라, GOALS 화면에서 목표와 표시 기간을 먼저 설정하는 구조로 정리했다.
- 플래너 화면 오른쪽 패널에서는 현재 날짜에 적용된 목표가 있을 때만 D-DAY 토글을 켤 수 있고, 목표 검색 UI는 제거했다.
- 목표는
active_from,active_until기간을 가질 수 있고, 현재 날짜가 그 범위에 들어올 때만 플래너 본문 D-DAY 후보가 된다. - TASK LABELS도 별도 버튼 2개 대신 동일한 토글 UI로 단순화했다. ON이면 01~15를 채우고 OFF이면 비운다.
- SETTINGS 화면이 추가되어 닉네임, 이메일, 비밀번호 변경을 분리해서 관리할 수 있다.
- 백엔드에는
/api/auth/profile,/api/auth/password,/api/goals/:goalId수정 API가 추가되었다. - 백엔드에는
/api/goals/:goalId삭제 API도 추가되었다. - 왼쪽 사이드, 플래너 본문 래퍼, 오른쪽 정보 패널 모두 둥근 카드 톤으로 맞춰서 화면 전체의 통일감을 높였다.
- 플래너 집중 보기에서는 본문과 오른쪽 패널이 각각 독립 스크롤되도록 바뀌어서 동시에 참조하기 쉽다.
- TASK LABELS, D-DAY 토글은 공통 사이즈의 스위치로 통일했고,
translate기반 애니메이션으로 부드럽게 움직이게 했다. - 목표 생성 폼은 기본적으로
표시 시작일 = 오늘,표시 종료일 = 목표일흐름으로 자동 채워진다. - D-DAY 기간은 서로 겹칠 수 없고, 프론트와 백엔드 모두 중복 기간을 감지하면 저장을 막는다.
- 현재 날짜에 적용된 목표가 있는 경우 D-DAY는 기본적으로 보이고, 해당 날짜에서만 토글로 숨길 수 있다.
- 목표 상태 개념은 제거했고, 목표는 기간이 있으면 곧바로 D-DAY 후보가 되는 단순 구조로 정리했다.
- GOALS 화면에서는 수정 중인 카드가 시각적으로 강조되고, 목표 삭제 버튼이 추가되었다.
- 목표 삭제 시 과거 날짜를 포함해 어떤 날짜에서도 해당 목표는 더 이상 표시되지 않는다.
- 우측 패널의
PREV SNAPSHOT은 선택 날짜 이전의 가장 최근 기록을 읽어서 날짜, 집중 시간, 완료 개수, 코멘트 또는 대표 작업을 보여준다. - 우측 패널의
READ NEXT는 다음 날 첫 작업, 오늘의 미완료 작업, 오늘 코멘트를 기반으로 이어보기 문구를 자동 생성한다. - 백엔드는 SQLite 파일 기반 구조에서 PostgreSQL 연결 구조로 교체되었다.
planner_entries.payload는 문자열이 아니라 PostgreSQLJSONB로 저장되도록 바뀌었다.docker-compose.yml기준으로postgres,backend,frontend(nginx)3개 서비스 초안이 추가되었다.- 프론트는 nginx에서
/api를 백엔드로 프록시하는 구조라서, 배포 시 브라우저가 별도 API 포트를 직접 알 필요가 없다. - 프론트 API 클라이언트는
VITE_API_BASE_URL끝에/api가 포함되어 있어도/api/api/...중복 주소가 생기지 않도록 정규화한다. - 로그인 실패 시에는 내부 라우트 문자열이나 서버 경로를 그대로 노출하지 않고, 사용자용 안내 문구만 보여준다.
- 비로그인 상태에서는 왼쪽 사이드 내비게이션을 숨기고, 중앙 로그인 안내 화면만 보여주도록 정리했다.
- 배포용
docker-compose.yml과 별도로 개발용docker-compose.dev.yml을 추가했다. - 개발용 compose는 프론트
5173, 백엔드3001, PostgreSQL5432를 열고, 소스 마운트 + Vite HMR + Node watch 기반으로 자동 반영된다. - 개발/배포 실행 방법은 루트
README.md에 먼저 적고,HANDOFF.md에는 변경 이유와 주의사항 위주로 남긴다. - API 클라이언트는 body가 없는
GET,DELETE요청에Content-Type: application/json을 붙이지 않도록 수정했다. 날짜 선택 시 발생하던Body cannot be empty...오류는 이 문제였다. - 날짜 이동 중 목표 자동 보정으로
goalEnabled만 꺼지는 경우에는, 실제 내용이 없는 기록이라면 클라우드 동기화 토스트를 띄우지 않도록 정리했다. - 집중 보기에서 오른쪽 패널 폭을 넓혀
1920x1080기준 활용도를 높였고,TASK LABELS / D-DAY / CALENDAR는 상단 고정 영역으로 올렸다. STATS와NEXT DAY는 반반 카드가 아니라 각각 한 줄씩 쓰도록 바꿔서 날짜 길이에 따라 높이가 흔들리는 문제를 줄였다.- 미니 달력은 42칸 기준으로 렌더링하고, 요일 헤더를
SUN ~ SAT순서로 고정해서 일요일 시작 달력 기준을 더 명확하게 맞췄다. - 집중 보기 오른쪽 패널은 다시 정리해서
왼쪽 컬럼: CALENDAR / TASK LABELS / D-DAY,오른쪽 컬럼: STATS / NEXT DAY,하단 전체 폭: READ NEXT / PREV SNAPSHOT구조로 맞췄다. - 달력은 과하게 키우지 않고 컴팩트한 크기를 유지한 채, 우측 정보 패널 내부 배치만 다시 조정하는 쪽으로 방향을 잡았다.
PRINT 2-UP은 브라우저/프린터 기본 여백 차이로 오른쪽 페이지가 잘릴 수 있어서, 프레임 폭과 스케일을 조금 더 보수적으로 줄여 안정성을 높였다.- 플래너 집중 보기 반응형 기준은
1620px 이상: 우측 패널 2열,1280px 이상 ~ 1619px 이하: 우측 패널 1열 + 최대 360px,1280px 미만: 우측 패널 오버레이구조로 다시 정리했다. - 오버레이 구간에서는 본문 오른쪽 위의
OPEN SIDE PANEL버튼으로 패널을 열고, 배경 클릭이나CLOSE버튼으로 닫는다. 2 PAGE SPREAD는 화면 폭을 기준으로 배율을 자동 계산해서 오른쪽 페이지가 잘리는 현상을 줄이는 방향으로 조정했다.1280px미만에서는 왼쪽 내비게이션도 본문 위에 쌓이지 않고MENU버튼으로 여는 드로어형 패널로 전환된다.- 태블릿/모바일 구간에서는
왼쪽 내비게이션 드로어 + 오른쪽 정보 패널 오버레이 + 본문 단일 컬럼조합으로 보는 흐름을 기본값으로 삼는다. - 통계 화면과 우측
FOCUSED TIME요약처럼 사용자에게 보여주는 집중 시간 표기는00H 00M대신00시간 00분한글 형식으로 바꿨다. - 좌측 메뉴 드로어와 우측 정보 패널 오버레이는 이제 열고 닫힐 때 페이드 + 슬라이드 애니메이션이 적용된다.
- 모바일처럼 좁은 화면에서는 본문 래퍼 패딩을 조금 줄이고, 우측 패널 열기 버튼 문구를
INFO로 축약해 밀도를 낮췄다. - 플래너 본문은 작은 화면에서 상단 정보 영역이 세로로 쌓이고,
TIME TABLE이 아래로 내려가도록 조정했다. - 모바일 구간에서는 TASKS / MEMO 행 높이와 좌우 패딩을 조금 줄여 입력 밀도를 낮췄고, 타임테이블은 필요할 때만 최소 가로 스크롤이 생기도록 바뀌었다.
- 미니 달력은 모바일 구간에서 패딩, 월 이동 버튼, 요일 헤더, 날짜 셀 크기를 한 단계 더 줄여서 카드 내부 밀도를 정리했다.
- 연도 선택 팝오버는 좁은 화면에서 카드 전체 폭을 활용하고, 넓은 화면에서는 기존 우측 드롭다운 폭을 유지한다.
- 플래너 본문 안의
TOTAL TIME라벨도총 시간으로 바꿔서 영어 라벨을 줄였다. - 사용자 노출 메뉴 문구는
보기 방식 / 날짜 이동 / 인쇄 / 1페이지 + 정보 / 2페이지 펼침 / 이전 날 / 다음 날 / 1장 인쇄 / 2장 인쇄처럼 한글 중심으로 정리하기 시작했다. - 2페이지 펼침 보기 배율 계산에서 데스크톱 여유 폭을 더 보수적으로 잡아,
1920px근처에서 우측 페이지가 잘려 가로 스크롤이 생기던 문제를 줄이는 방향으로 조정했다. - 달력 날짜 버튼은 셀 안쪽에 고정 크기 원형 버튼으로 다시 배치해서 모바일에서 서로 겹쳐 보이는 현상을 줄였다.
- 좌측 상단 소개 영역은 개발 설명 문장을 빼고, 서비스 소개용 짧은 카피와 배지 스타일로 다시 구성했다.
- 달력 날짜 버튼은 의도상 원형이며, 현재는
size고정 기준으로 다시 맞춰서 타원처럼 보이는 인상을 줄이는 방향으로 정리했다. - 플래너 본문, 2페이지 펼침, 인쇄 전용
PlannerPage모두총 시간값은00시간 00분한글 포맷으로 통일했다. - 모바일 대응 이후 인쇄에서
TIME TABLE이 사라지던 문제를 막기 위해, print 시에는PlannerPage내부 레이아웃을 다시 가로 배치로 고정하고 타임테이블 오버플로를 해제하도록 보정했다. - 인쇄 레이아웃은 추가로 미세 조정해
COMMENT영역이 잘리지 않도록 textarea 높이/행간을 print 전용으로 풀고,1-UP/2-UP배율도 프레임 실측 기준으로 다시 계산했다. TODO.md는 중복 체크 항목을 정리했고, 인증 확장을 위해이메일 인증 / 비밀번호 재설정 / rate limit / 메일 인프라작업을 별도 항목으로 추가했다.- Resend 무료 플랜은 도메인 1개 제약이 있어 현재 프로젝트 인증 메일에는 바로 쓰기 어렵다. 다음 단계에서는 AWS SES 또는 범용 SMTP 공급자 기준으로 메일 발송 추상화를 붙이는 쪽이 적합하다.
- 현재 인증 메일/재설정 메일은 실제 발송 대신 개발용
previewUrl을 응답으로 돌려주는 단계다. 프론트 UI 연결과 실제 메일러 연결은 다음 단계에서 마무리하면 된다. - 미니 달력 날짜 버튼은 원형 비율이 흔들리지 않도록 고정
width/height기준으로 다시 맞췄다. - 플래너 본문 D-DAY 텍스트는 3줄까지만 보이고, 넘치면 말줄임 처리되도록 정리했다.
- 목표가 없는 빈 날짜에서는
D-DAY 사용토글이 저장 상태와 무관하게OFF + 비활성처럼 보이도록 보정했다. - 관리자 전용
ADMIN메뉴와 기본 대시보드가 추가되었다. 현재는 사용자 수, 최근 접속, 문서 수, 목표 수, 계정별 최종 접속일을 읽기 전용으로 확인할 수 있다. users테이블에login_id,role,last_login_at컬럼이 추가되었다.- 관리자 계정은 이제 이메일이 아니라 별도 자동 생성 계정으로 관리한다.
- 관리자 계정은 서버 시작 시
ADMIN_ACCOUNT_ID,ADMIN_ACCOUNT_PASSWORD,ADMIN_ACCOUNT_EMAIL,ADMIN_ACCOUNT_NICKNAME환경변수 조합으로 자동 생성된다. - 관리자 아이디와 비밀번호는 저장소 문서에 실제 값을 남기지 않고, Docker 배포 시 루트
.env같은 비공개 환경변수 파일에서만 관리한다. - 관리자 대시보드는 현재 읽기 전용이며, 계정 정지/삭제/강제 로그아웃 같은 실제 운영 액션은 아직 없다.
- 배포용
docker-compose.yml은 현재 PostgreSQL 외부 포트45432, 프론트 외부 포트48081기준이며, DB 계정/비밀번호는 루트.env에서 주입한다. - 설정 화면의 보조 메모 카드는 주석 처리되어 현재는 보이지 않는다.
- 비로그인 랜딩 카드는 상단 고정이 아니라 화면 중앙에 오도록 정렬을 수정했다.
- 로그인/회원가입 문구와 플레이스홀더는 일반 사용자 기준으로 정리했고, 사이드바 계정 카드의
ADMIN/USER역할 텍스트는 숨겼다. - 오른쪽 정보 패널에
미완료 항목 이월버튼을 추가했다. 현재 날짜의 체크 안 된 할 일을 다음 날짜의 비어 있는 할 일 칸에 순서대로 복사한다. - TASK 체크 버튼은 키보드 탭 이동 시 focus ring이 보이도록 개선했다. TASK 행은 클릭만으로 선택되지 않고, 포인터를 누른 채 다른 행까지 드래그했을 때부터 전역 pointer move 기준으로 여러 행을 선택한다. input에서 드래그를 시작해도 두 번째 행으로 넘어가면 기존 input 포커스를 blur 처리해
Delete/Backspace는 선택한 할 일 제목과 체크 상태를 한 번에 비우고,Escape는 선택만 해제하도록 했다. - 인쇄 전용 CSS에서 COMMENT와 총 시간 영역의 폭을 고정하고 textarea overflow를 숨겨, PRINT 시 COMMENT가 우측 시간 영역과 겹치지 않도록 보정했다.
- 오른쪽 패널의
TASK LABELS와D-DAY 사용은 한 카드 안의 두 줄 토글로 압축했다. 설명 문구는 공통GuideTooltip컴포넌트로 옮겼고, 물음표 버튼 클릭으로 열고 다시 클릭하거나 외부 클릭으로 닫는다. 각 툴팁은더 이상 보지 않기로 숨길 수 있으며 SETTINGS의가이드 다시 보기에서 전체 복원할 수 있다. - 오른쪽 패널의
READ NEXT와PREV SNAPSHOT은 별도 가로 카드가 아니라NEXT DAY카드 아래쪽에 세로로 배치했다. - READ NEXT는 내일 첫 작업과 오늘 미처리 할 일 개수만 보여주도록 줄였고, 오늘 코멘트 반복 노출은 제거했다.
- 플래너 본문 시간 라벨은
총 시간에서FOCUSED TIME으로 바꿨다. 인쇄 CSS에서 COMMENT/FOCUSED TIME 라벨이 잘리지 않도록 부모 overflow를 열고, COMMENT는 남는 폭을 채우며 FOCUSED TIME은 오른쪽 210px 칸에 붙도록 조정했다. - Docker 배포용 루트
.env와 개발용.env.dev를 분리했다.docker-compose.yml은 운영.env,docker-compose.dev.yml은 기존 dev Postgres 볼륨과 맞는.env.dev를 읽는다. 5173포트가 직접npm run dev없이 열려 있으면 대부분ten-minute-frontend-dev컨테이너가 떠 있는 상태다. 개발용 Docker를 끄려면docker compose -f docker-compose.dev.yml down을 사용한다.- 현재 환경에서는 Docker 데몬이 꺼져 있어서
docker compose build실검증은 하지 못했고, 데몬 시작 후 다시 확인이 필요하다. - 이미지 저장 기능은 추후
print-only또는 별도 export 전용 레이아웃을 기준으로 구현하면 화면/인쇄/공유 결과를 맞추기 쉽다. - Docker Compose는 프론트엔드와 백엔드를 함께 올리는 기준으로 설계하되, NAS 환경에 맞는 볼륨과 재시작 정책도 함께 고려한다.
- 플래너 본문 라벨은 더 이상
bg-paper배경으로 선을 덮지 않는다.라벨 + 오른쪽 선구조로 바꿔 화면과 인쇄에서 노란 배경이 튀지 않도록 정리했다. - 날짜에 적용되는 목표가 새로 생기면 D-DAY는 기본 표시된다. 사용자가 해당 날짜에서 직접
D-DAY 사용을 끈 경우에만 로컬 숨김 목록에 저장해 다시 숨긴다. - 비로그인 랜딩은 모바일에서
카드 안 카드처럼 보이지 않도록 기능 설명 카드를 얇은 리스트로 단순화했고,LOGIN/SIGN UP버튼은 같은 너비와 높이로 맞췄다. 로그인/회원가입 모달도 하단 전환 영역을 별도 카드 대신 구분선 형태로 정리했다. - 로그인 모달에
로그인 유지체크박스를 추가했다. 기본값은 OFF이며, OFF 상태에서는 인증 토큰을sessionStorage에 저장해 브라우저 세션이 끝나면 사라지고, ON 상태에서만localStorage에 저장한다. - 현재 로그아웃은 프론트 저장 토큰을 지우는 수준이다. 개인 기록 서비스 성격을 고려하면 다음 단계에서 서버 세션 폐기 API와 미사용 자동 로그아웃 옵션을 추가하는 편이 좋다.
- 비로그인 랜딩에
DEMO VIEW를 추가했다. 데모는 실제 저장/로그인 상태와 분리된 읽기 전용 샘플이며, 어제/오늘/내일 3일치 플래너를 전환해서 제품 감각을 먼저 볼 수 있다. - 플래너 본문
MEMO와TIME TABLE하단 높이를 맞추기 위해 TASK/MEMO 리스트 간격과 행 높이를 조정했다. TASK 드래그 선택 피드백은 레이아웃 흔들림을 줄이도록 ring 대신 배경색만 사용한다. - 이월된 할 일은
carryoverFrom날짜를 가진다. TASK 본문에는이월배지를 표시하고, 클릭하면 오른쪽READ NEXT영역에 원래 시작 날짜를 안내한다. - 이월된 할 일을 완료할 때는 이전 날짜의 같은 이월 항목까지 모두 체크할지, 현재 날짜만 체크할지 선택한다. 기본값은
항상 물어보기이며, SETTINGS의CARRYOVER CHECK에서항상 이전까지 체크/항상 오늘만 체크로 바꿀 수 있다. - 오른쪽 플래너 사이드바의 중복
STATS카드는 제거했다. 미완료 항목 이월 버튼은READ NEXT카드 아래로 이동했다. - 통계 화면은 진입 시 END DATE를 오늘로 보정한다.
최근 1주,최근 1달빠른 선택을 추가했고, 기존WEEKLY FLOW는 선택 범위 안에서 기록이 있는 날짜별 집중 흐름을 보여주는RANGE FLOW로 이름과 라벨을 정리했다. BEST DAY는 선택 기간 안에서 집중 시간이 가장 긴 날짜를 고르고,RECENT RECORDS는 선택 기간 안의 기록을 날짜 내림차순으로 최대 5개 보여준다.
갱신 규칙
- 중요한 결정, 제약, 버그, 작업 방식 변경이 생기면 이 문서에 이어서 반영한다.
- 다음 작업자가 다시 탐색하지 않아도 되도록 짧고 실무적으로 유지한다.