# 완료 보고서 — todo-app (간단한 To-Do 앱) > PDCA Phase: **Report (completed)** · Feature: `todo-app` · 작성일: 2026-06-15 > Match Rate: **99%** · 상위: [Plan](../01-plan/features/todo-app.plan.md) · [Design](../02-design/features/todo-app.design.md) · [Analysis](../03-analysis/todo-app.analysis.md) ## Executive Summary | 관점 | 요약 | |------|------| | **Problem** | 할 일을 기록·관리할 화면/저장소 부재. 앱은 연결 확인 엔드포인트만 있었음. | | **Solution** | Postgres에 todo CRUD, 항목별 첨부는 MinIO/S3에 저장하는 단일 공용 To-Do 웹 앱 구현. | | **Function UX Effect** | 브라우저 추가/완료/삭제 + 첨부 업/다운로드, REST API 동시 제공. | | **Core Value** | DB(구조화)+S3(바이너리) 결합의 가장 단순한 표준 패턴을 ~450줄로 완성. | ### 1.3 Value Delivered (실측) | 관점 | 지표 | 결과 | |------|------|------| | 품질 | Match Rate | **99%** (목표 90%↑) | | 검증 | L1 런타임 테스트 | **16/16 통과**, 서버 에러 0 | | 연결 | db:check / minio:check | 둘 다 통과 | | 범위 | Success Criteria | **5/6 Met**, 1 Partial(podman 미실행) | ## 2. PDCA 여정 요약 | 단계 | 산출물 | 핵심 | |------|--------|------| | Plan | todo-app.plan.md | FR-01~08, 데이터 모델·API 초안, SC-01~06 | | Design | todo-app.design.md | Option C(실용 균형) + 서버 프록시 스트리밍 선택 | | Do | 코드 5신규/3수정 | schema/attachments/repo/routes/UI + s3·server·package | | Check | todo-app.analysis.md | 99%, Critical 0, Minor 3 | ## 3. 구현 내역 **신규**: `src/schema.js`, `src/attachments.js`, `src/todos.repo.js`, `src/routes.todos.js`, `public/index.html` **수정**: `src/s3.js`(put/get/delete 추가), `src/server.js`(미들웨어·라우터·부트스트랩), `package.json`(multer 2.1.1) **API**: `GET /` · `GET/POST /api/todos` · `PATCH/DELETE /api/todos/:id` · `GET /api/todos/:id/attachment` ## 4. Key Decisions & Outcomes | 결정 | 따랐는가 | 결과 | |------|:-------:|------| | Option C 아키텍처 | ✅ | repo/attachments/routes 분리, service 생략 — 적정 경계 | | 서버 프록시 스트리밍(presigned 대신) | ✅ | 내부 MinIO 호스트 노출 없이 다운로드 동작, presigner 의존성 제거 | | pgcrypto + randomUUID fallback | ✅ | **실환경에서 `permission denied` 발생 → fallback 자동 작동** (설계가 리스크 적중) | | multer 1.x → 2.1.1 (구현 중 변경) | ✅ | npm 취약점 0, API 동일 | ## 5. Success Criteria 최종 상태 | SC | 상태 | 근거 | |----|:----:|------| | SC-01 CRUD UI | ✅ Met | L1 + public/index.html | | SC-02 업로드→S3+DB key | ✅ Met | L1-7 hasAttachment, S3 객체 생성 | | SC-03 다운로드 | ✅ Met | L1-9/10 내용 일치 | | SC-04 삭제 시 S3도 삭제 | ✅ Met | L1-16 cascade 404 | | SC-05 db/minio check | ✅ Met | 둘 다 통과 | | SC-06 podman | ⚠️ Not verified | Dockerfile 무변경, 이 세션 빌드 미실행 | **Success Rate: 5/6 Met (83%) + 1 미검증** ## 6. 잔여 항목 (후속 권장) - **G2**: `podman build -t todo . && podman run --rm -p 3000:3000 --env-file .project-env todo`로 SC-06 확정. - **G1**: Design §5 서술을 실제 INSERT→UPDATE 2단계로 문서 동기화(선택). - **G3**: 첨부 content-type 화이트리스트(NFR-03 강화, 향후). - 멀티유저/검색/마감일 등은 의도적 범위 외 — 차기 PDCA 사이클 후보. ## 7. 배포 메모 코드/Dockerfile 변경만으로 배포 준비 완료(CLAUDE.md 규약). Coolify Environment에 `DATABASE_URL`, `S3_*` 설정 + git push → 자동 빌드. 비밀값은 전부 env 경유, 커밋 안 함. ## 8. 결론 목표("DB와 S3를 이용한 간단한 To-Do 앱")를 99% 일치로 완성. 런타임 16/16 검증, 연결 점검 통과. Critical 이슈 없음. SC-06(podman)만 선택적 후속 검증 권장.