동일 번호 카드가 많은 시리즈에서도 선택한 카드가 정확히 복원되도록 저장·검증·복원 흐름을 imgSrc 중심으로 정리하고, 이미지 누락 시 공통 뒷면 폴백을 적용한다. Co-authored-by: Cursor <cursoragent@cursor.com>
14 KiB
의사결정 이력
2026-06-25 v4.0.17 — 공유 덱 카드는 imgSrc를 기준으로 복원
💡 동일 Number의 일반·패러렐·프로모가 공존해 번호만으로는 원본 카드를 안정적으로 식별할 수 없기 때문.
🔧 덱 저장 payload에 imgSrc를 필수 포함하고 서버 복원은 imgSrc 우선, 레거시 데이터만 number로 보조 복원.
2026-06-25 v4.0.16 — 탈퇴 계정의 덱은 익명 콘텐츠로 보존
💡 공개 덱을 참고하거나 즐겨찾기한 다른 사용자의 이용 흐름을 탈퇴로 끊지 않기 위함. 🔧 계정·개인 인증정보·아바타만 삭제하고 덱은 익명 유지, 관리자는 필요 시 복수 선택해 별도 삭제.
2026-06-25 v4.0.15 — 미인증 복구 동선은 로그인 화면에서 제공
💡 인증 메일을 잃어버린 사용자가 별도 화면을 찾아가지 않고 로그인 실패 지점에서 바로 복구하게 하기 위함. 🔧 미인증 오류 코드를 프론트에 유지하고 재발송·월 3회 제한·관리자 문의를 표시, 관리자는 미인증 계정을 수동 승인.
2026-06-25 v4.0.14 — 계정별 자동 메일은 월 3회로 제한
💡 무료 메일 한도를 소수 계정의 반복 요청이 소진하지 않도록 보호하기 위함. 🔧 한국 시간 월 기준으로 인증·재설정 메일을 합산하고, 4회째부터 관리자 이메일 문의를 안내.
2026-06-25 v4.0.13 — 인증 요청은 화면 잠금과 서버 제약을 함께 적용
💡 메일 전송 지연 중 반복 클릭과 정적 API 클라이언트 캐시 불일치를 동시에 방지하기 위함. 🔧 인증 JS에 버전 쿼리·직접 호출 폴백을 적용하고 제출 중 잠금, 스피너, 메일 60초 재요청 대기를 표시.
2026-06-25 v4.0.12 — 신규 가입부터 이메일 소유 확인 적용
💡 기존 회원을 잠그지 않으면서 허위 이메일 가입과 관리자 의존 비밀번호 초기화를 막기 위함. 🔧 기존 회원은 인증 완료로 이관하고 신규 회원은 Resend 인증 후 로그인, 재설정 토큰은 해시·1회용·30분 만료로 저장.
2026-06-24 v4.0.11 — 로그인 유지와 실제 접속 시각을 분리 관리
💡 브라우저 종료 후 로그인 유지 여부는 사용자가 선택하고, 접속 기록은 재로그인 없이도 실제 이용을 반영해야 하기 때문.
🔧 체크 시 로컬 저장소, 미체크 시 세션 저장소를 사용하고 /auth/me 성공 시 last_login_at을 갱신.
2026-06-23 v4.0.10 — 위험한 관리자 변경은 명시적 동작으로 제한
💡 역할 변경은 빈도가 낮고 영향이 커서 상시 노출보다 의도적 진입이 안전하기 때문. 🔧 관리자 회원 수정 모달의 역할 선택을 기본 숨김으로 두고 버튼 클릭 시에만 표시.
2026-06-23 v4.0.10 — 사용자 마지막 접속 시각을 운영 지표로 기록
💡 관리자 화면에서 실제 이용 활성도를 빠르게 판단할 기준이 필요하기 때문.
🔧 로그인 성공 시 users.last_login_at을 저장하고 회원 목록에 상대시간으로 표시.
2026-06-19 v4.0.9 — 관리자 회원 목록에 덱 이용률 표시
💡 사이트 이용 현황을 관리자가 한눈에 파악할 수 있어야 하기 때문.
🔧 회원 API에 share_type='user' 저장 덱의 공개·전체 수를 집계하고, 회원 카드를 2열 그리드로 배치.
2026-06-23 v4.0.5 — 공통 UI는 Tailwind components 레이어로 통합
💡 화면마다 분리된 CSS 파일을 유지하면 Tailwind 빌드 누락·로드 순서 문제가 반복되기 때문.
🔧 app-shell·deck-history·profile·auth-header를 style/components.css로 옮기고 페이지는 output.css만 로드.
2026-06-23 v4.0.4 — 덱 저장과 공개는 회원 기능으로 제한
💡 이미지 다운로드는 자유롭게 제공하되 서버 저장·공개 기능은 계정 기반 관리와 연결하기 위함. 🔧 비회원 저장 API를 차단하고 결과 화면은 로그인 후 저장할 수 있음을 명확히 안내.
2026-06-23 v4.0.3 — 검색 설명은 정적 기본 콘텐츠를 제공
💡 JavaScript 번역 로딩 전 빈 문구나 네트워크 오류가 검색 결과 설명으로 수집되는 것을 막기 위함. 🔧 메인 제목·설명 기본값과 SEO 메타데이터를 HTML에 기록하고 내부 오류 메시지는 사용자 안내로 대체.
2026-06-23 v4.0.3 — Tailwind 전환은 화면 단위로 진행
💡 여러 화면의 CSS를 동시에 바꾸면 시각 회귀 범위와 검수 부담이 지나치게 커지기 때문. 🔧 관리자와 인증 화면부터 전환하고 전용 CSS는 제거하며 공용 덱 카드 CSS는 해당 화면 차례까지 유지.
2026-06-23 v4.0.3 — 로그인 즐겨찾기는 계정 DB에 저장
💡 브라우저를 바꾸거나 데이터를 지워도 사용자의 즐겨찾기가 유지되어야 하기 때문.
🔧 계정별 deck_favorites를 추가하고 기존 로컬 항목은 유효한 덱만 최초 로그인 시 이전.
2026-06-23 v4.0.3 — 접근할 수 없는 즐겨찾기는 자동 정리
💡 삭제·만료·비공개 전환된 덱이 즐겨찾기 목록에 남아 빈 항목을 만들지 않게 하기 위함. 🔧 덱 삭제는 외래키 연쇄 삭제, 만료·타인 비공개 덱은 즐겨찾기 조회 시 제거.
2026-06-23 v4.0.2 — 덱 삭제와 미리보기 파일 수명주기를 연결
💡 DB에서 덱만 삭제하면 더 이상 참조되지 않는 PNG가 운영 스토리지에 계속 누적되기 때문. 🔧 덱 삭제 시 연결 PNG를 함께 지우고, 관리자는 과거 고아 파일을 조회·일괄 정리할 수 있게 구성.
2026-06-23 v4.0.2 — 관리자 덱 목록도 사용자 덱 카드 구조를 사용
💡 같은 덱 정보를 화면마다 다르게 표시하면 관리자가 시리즈·공개 상태·수정일을 비교하기 어렵기 때문. 🔧 사용자 덱과 같은 카드·배지·날짜 구조를 적용하고 관리자 삭제는 더보기 메뉴로 이동.
2026-06-23 v4.0.0 — SQLite 백업은 온라인 백업 API를 사용
💡 WAL 모드에서 DB 본파일만 복사하면 아직 병합되지 않은 최신 트랜잭션이 누락될 수 있기 때문.
🔧 운영 중에는 better-sqlite3의 backup()으로 일관된 백업본을 만든 뒤 컨테이너 밖으로 복사.
2026-06-23 v4.0.0 — 헤더 로고 규격을 공통 스타일로 관리
💡 페이지마다 로고 크기를 따로 지정하면 화면 이동 시 높이가 달라지고 수정 지점도 늘어나기 때문.
🔧 style/brand.css의 .app-brand-logo와 --brand-logo-height를 모든 헤더의 단일 기준으로 채택.
2026-06-23 v4.0.0 — 표시 브랜드는 UNIARE, 내부 식별자는 호환 유지
💡 사용자에게 보이는 제품명은 통일하되 기존 API 클라이언트와 저장 데이터의 호환성은 깨지 않기 위함.
🔧 화면·문서·다운로드 파일명은 UNIARE로 변경하고 uadeck_token, uadeck.db, UaDeckApi, /api/v1은 유지.
2026-06-23 v4.0.0 — 주요 화면 너비를 1280px로 통일
💡 페이지 이동 때 헤더와 본문 폭이 달라지는 시각적 흔들림을 줄이고 광고 레일을 안정적으로 배치하기 위함.
🔧 홈·편집·결과·프로필·덱 목록의 공통 최대 너비를 80rem 기준으로 정렬.
2026-06-22 v4.0.0 — Docker 서비스 이름을 uniare-*로 통일
💡 NAS에서 구·신규 컨테이너가 혼재할 때 포트 충돌과 운영 명령 실수를 줄이기 위함.
🔧 Compose 서비스·컨테이너·볼륨과 Nginx 프록시 대상을 uniare-web, uniare-api, uniare-data로 정렬.
2026-06-22 v4.0.0 — 운영 웹 컨테이너는 허용 자산만 읽기 전용 공개
💡 프로젝트 루트 전체를 웹 루트로 노출하면 .env, .git, docs, API 소스가 외부에 노출될 수 있기 때문.
🔧 HTML과 script, style, i18n, datas, images만 Nginx에 read-only 볼륨으로 연결.
2026-06-22 v4.0.0 — 공개 덱은 사용자 공개 설정을 기준으로 구성
💡 관리자 전용 프리셋보다 사용자가 직접 공개한 덱을 탐색하는 방식이 서비스 흐름에 더 자연스럽기 때문.
🔧 /preset.html과 GET /api/v1/decks/presets는 만료되지 않은 공개 사용자 덱을 최신순으로 제공.
2026-06-22 v4.0.0 — 덱 미리보기는 1200px PNG로 정규화
💡 브라우저와 옵션에 따라 저장 썸네일 크기가 달라지고 큰 base64 요청이 413 오류를 일으켰기 때문. 🔧 저장 이미지는 1200px 기준 PNG로 만들고 Nginx 요청 한도 25MB, Express JSON 한도 20MB를 적용.
2026-06-22 v4.0.0 — 즐겨찾기는 브라우저 로컬 상태로 우선 제공
💡 서버 스키마를 늘리지 않고도 공개 덱과 내 덱 탐색 편의를 빠르게 제공하기 위함.
🔧 공유 코드를 키로 localStorage에 저장하며 계정 간 동기화는 후속 과제로 남김.
2026-06-22 v4.0.0 — 정적 프론트를 유지하며 회원·덱 API를 추가
💡 기존 카드 데이터와 화면을 전면 재작성하지 않고 로그인, 소유권, 공유 기능을 확장하기 위함. 🔧 정적 HTML/JavaScript는 유지하고 Express·SQLite API와 Docker Compose 운영 구성을 추가.
2026-06-22 v4.0.0 — 덱 공유는 공유 코드와 REST API를 사용
💡 ?cards=<JSON> 방식의 긴 URL과 중복 데이터를 없애고 공개 범위·작성자·수정 권한을 관리하기 위함.
🔧 DB에는 {number,count,key}만 저장하고 GET /api/v1/decks/:shareCode 응답에서 카드 메타를 합성.
2026-06-22 v4.0.0 — 회원 덱과 비회원 공유의 보존 기간을 분리
💡 계정 소유 덱은 영구 관리하고 익명 공유 데이터는 무기한 누적되지 않게 하기 위함. 🔧 회원 덱은 만료 없이 저장하고 비회원 덱은 공개 상태로 30일 뒤 만료되도록 구성.
2026-06-22 v4.0.0 — 프로필 이미지는 클라이언트에서 PNG로 정규화
💡 JPEG 등 원본 바이트를 .png 확장자로 저장해 브라우저 표시가 실패하는 문제를 막기 위함.
🔧 업로드 전에 Canvas로 PNG 변환·리사이즈하고 updatedAt 쿼리로 캐시를 갱신.
2026-06-17 v3.1.2 — 유니티켓은 기존 시리즈 데이터에 병합
💡 별도 시리즈를 만들기보다 동일 작품의 카드 번호 체계와 필터 흐름을 유지하는 편이 검색과 덱 구성이 일관되기 때문.
🔧 ua03, ua06, ua10 데이터와 이미지에 헌터×헌터·테일즈 오브 어라이즈·히로아카 유니티켓을 추가.
2026-06-15 v3.1.2 — 후속 부스터도 기존 시리즈 키를 재사용
💡 작품 단위 진입 구조를 유지하면서 신규 부스터와 기존 카드를 한 화면에서 다루기 위함.
🔧 마크로스 2nd는 ua36에 병합하고 무직전생 1st는 신규 ua54 데이터·이미지·번역 세트로 추가.
2026-05-26 v3.1.2 — 신규 시리즈 반영은 데이터·이미지·번역을 한 세트로 관리
💡 세 축 중 하나라도 빠지면 홈 노출, 카드 로딩, 이미지 표시 중 일부가 즉시 깨지기 때문.
🔧 ua50, ua53 추가와 ua52 병렬 이미지 보강을 같은 릴리즈 단위로 반영.
2026-05-16 v3.1.1 — 신규 시리즈와 기존 누락 자산을 함께 보강
💡 새 시리즈 배포 시 인접 시리즈의 확인된 누락 이미지도 함께 정리해 데이터 신뢰도를 유지하기 위함.
🔧 ua52 데이터·이미지·3개 언어명을 추가하고 ua51 병렬 이미지 누락분을 보강.
2026-04-19 v3.1.0 — 릴리즈 기준과 작업 인계 문서를 명시
💡 화면 버전과 실제 변경 이력이 어긋나 후속 작업자가 현재 배포 기준을 판단하기 어려웠기 때문.
🔧 ua51 릴리즈를 v3.1.0으로 정의하고 데이터·이미지·번역 검증 절차를 문서화.
2026-04-08 v3.0.1 — 카드 목록 상호작용은 기존 동작을 우선 보존
💡 구조 개선 과정에서 수량 조절과 카드 선택 UX가 달라져 기존 사용 흐름이 훼손되었기 때문. 🔧 변경된 목록 상호작용을 되돌리고 이후 UI 수정은 기존 동작 검증을 선행하도록 기준화.
2026-04-08 v3.0.1 — 카드 번호와 덱 집계는 동일 식별자를 기준으로 처리
💡 잘못된 카드 번호 하나가 패러렐 묶음과 덱 수량 계산까지 연쇄적으로 어긋나게 하기 때문.
🔧 ua27 카드 번호를 정정하고 동일 Number 그룹의 수량 표시를 다시 동기화.
2026-03-30 v3.0.1 — 데이터 경로는 실제 이미지 파일명을 기준으로 정합성 유지
💡 데이터의 imgSrc와 저장 파일명이 다르면 카드가 존재해도 화면에서는 누락으로 보이기 때문.
🔧 오기입 경로를 수정하고 누락 이미지 추가와 사용하지 않는 주석 데이터 제거를 함께 수행.
2026-03-30 v3.0.0 — 저장소를 현재 스냅샷 기준 새 루트로 재시작
💡 과거 대용량 이미지 객체로 비대해진 Git 이력을 가장 확실하게 줄이기 위함.
🔧 현재 작업본을 새 루트 커밋으로 삼고 버전은 v3.0.0부터 재시작하며 기존 이력은 로컬 백업 브랜치에 보존.
2026-03-30 v3.0.0 — 이미지 자산은 Git LFS로 관리
💡 수천 개 카드 이미지가 일반 Git 객체로 누적되는 비용을 줄이고 코드 이력과 대용량 자산 관리를 분리하기 위함.
🔧 .gitattributes에서 images/**를 LFS 대상으로 지정하고 신규 이미지도 같은 정책을 적용.
2026-03-30 v3.0.0 — 문서를 목적별 기준 파일로 분리
💡 구현 상태, 작업 로그, 결정 이유, 할 일을 한 문서에 섞지 않고 후속 작업자가 빠르게 맥락을 찾게 하기 위함.
🔧 spec, update, history, todo, deploy, map, convention을 역할별 기준 문서로 운영.