현재 문제
관리자 CMS 작업 내용을 다시 확인하면서 아래 문제들을 찾음.
기본 검증은 통과하지만 실제 사용 중에는 발행 상태가 바뀌거나 작성 내용이 유실될 수 있고, 로그아웃 및 비공개 공유 해제가 제대로 적용되지 않을 수 있음.
이번 이슈는 확인한 내용만 정리하고 수정은 따로 진행할 예정.
확인한 내용
우선순위 높음
추가 수정 필요
[P2] 편집 중 목록이나 공개 글 링크로 이동하면 미저장 내용이 유실되는 문제
src/app/admin/posts/[id]/admin-post-editor.tsx:247-259,573-579
현재 보호 장치는 beforeunload뿐이라 Next.js Link를 통한 화면 이동은 경고가 나오지 않음.
[P2] 발행취소가 편집 중인 내용을 저장 완료 상태로 처리하는 문제
src/app/admin/posts/[id]/admin-post-editor.tsx:304-317
src/lib/blog-admin.ts:179-189
발행취소 API는 게시 상태만 변경하지만 클라이언트는 편집 내용까지 saved로 처리해 제목, 본문, 메타데이터 변경이 유실될 수 있음.
[P2] 저장 실패 상태가 미저장 변경사항으로 보호되지 않는 문제
src/app/admin/posts/[id]/admin-post-editor.tsx:162-165,247-250
저장 실패 후 상태가 error가 되지만 이탈 경고는 dirty, saving만 확인함.
[P2] 선택 URL을 비워도 기존 값이 DB에서 제거되지 않는 문제
src/app/admin/posts/[id]/admin-post-editor.tsx:919-921
src/lib/admin-post-payload.ts:19-21
src/lib/blog-admin.ts:341-355
원문, 커버 이미지, 임베디드 PDF URL을 비우면 undefined가 전달되어 Prisma가 필드 변경을 생략함.
[P2] 발행일과 수정일이 서울 시간 기준보다 하루 빠르게 저장될 수 있는 문제
src/lib/blog-admin.ts:150,350,500-502
toISOString()의 UTC 날짜를 사용해서 Asia/Seoul 기준 00:00~08:59에 저장하면 전날 날짜가 기록됨.
[P2] 카테고리 이름을 입력할 때 자동 slug가 첫 글자에서 멈추는 문제
src/app/admin/posts/[id]/admin-post-editor.tsx:663-668
첫 입력에서 slug가 채워진 뒤에는 다시 생성하지 않아 Backend를 입력해도 b로 남을 수 있음.
[P2] 발행 상태가 아닌 글에도 공개 글 링크가 표시되는 문제
src/app/admin/posts/[id]/admin-post-editor.tsx:120,573-579
보관된 글도 publishedNumber를 유지하기 때문에 번호만 확인하면 404로 연결되는 공개 글 링크가 표시됨.
[P2] Playwright가 로컬 테스트 DB 대신 개발/운영 DB를 사용할 수 있는 문제
playwright.config.ts:21-25
src/lib/prisma.ts:8-12
src/lib/posts-db.ts:5,35-37
기본 E2E 서버가 next dev로 실행되어 NODE_ENV=development가 되고 DATABASE_URL_TEST가 아닌 POSTGRES_PRISMA_URL을 선택함.
[P2] E2E가 기존 게시물이 있다고 가정하는 문제
tests/e2e/admin-editor.spec.ts:109-123
새 테스트 DB에는 카테고리만 있고 게시물이 없어서 첫 관리자 게시물 링크를 찾는 단계에서 바로 실패함.
테스트 안에서 새 글을 만들거나 항상 동일한 테스트 데이터를 준비해야 함.
[P2] Storage PDF 검증이 실제 브라우저 CORS를 확인하지 못하는 문제
scripts/verify-storage-pdf.mjs:9-30
tests/e2e/smoke.spec.ts:36-41
Node의 HEAD/Range 요청은 브라우저 CORS를 적용하지 않고, 현재 E2E도 react-pdf의 실제 로드 성공까지 확인하지 않음.
기대 동작
편집, 자동 저장, 미리보기만으로 게시 상태가 바뀌지 않아야 함.
최신 편집 내용은 저장 요청 중에도 미저장 상태로 추적되고 모든 화면 이동에서 보호되어야 함.
로그아웃과 비공개 공유 비활성화가 실제 접근 차단으로 이어져야 함.
선택 URL을 비우면 DB에 null로 저장되고 날짜는 사이트 시간대를 따라야 함.
E2E는 새 로컬 테스트 DB에서도 독립적으로 실행되어야 함.
Storage PDF는 실제 브라우저에서 로드와 CORS까지 확인해야 함.
검증 방법
현재 문제
관리자 CMS 작업 내용을 다시 확인하면서 아래 문제들을 찾음.
기본 검증은 통과하지만 실제 사용 중에는 발행 상태가 바뀌거나 작성 내용이 유실될 수 있고, 로그아웃 및 비공개 공유 해제가 제대로 적용되지 않을 수 있음.
이번 이슈는 확인한 내용만 정리하고 수정은 따로 진행할 예정.
확인한 내용
우선순위 높음
[P1] 발행된 글의 자동 저장이 글을 초안으로 바꾸는 문제
src/app/admin/posts/[id]/admin-post-editor.tsx:146-159,235-245,346-355/draft를 사용함.status: draft로 바뀌어 공개 글이 내려가지만 편집기에는 계속 발행 상태로 표시될 수 있음.[P1] 저장 요청 중 추가로 입력한 내용이 저장된 것으로 처리되는 문제
src/app/admin/posts/[id]/admin-post-editor.tsx:123-165,277-295saved로 바꾸기 때문에 최신 입력이 저장되지 않은 채 자동 저장과 이탈 경고가 해제될 수 있음.[P1] 로그아웃 후에도 관리자 인증 쿠키가 남는 문제
src/lib/admin-auth.ts:30-42Path=/admin으로 생성하지만 삭제할 때는Path=/로 만료됨./admin쿠키가 남아 로그아웃 후 다시 관리자 화면으로 들어갈 수 있음.[P1] 비활성화한 인터뷰 공유 URL이 fallback으로 다시 열리는 문제
src/lib/interviews.ts:55-67,159-173is_active = false로 바꾸면 DB 조회 결과는 없지만, 같은 ID가 환경 변수나 private 파일에 남아 있으면 fallback 내용이 다시 노출됨.추가 수정 필요
[P2] 편집 중 목록이나 공개 글 링크로 이동하면 미저장 내용이 유실되는 문제
src/app/admin/posts/[id]/admin-post-editor.tsx:247-259,573-579beforeunload뿐이라 Next.jsLink를 통한 화면 이동은 경고가 나오지 않음.[P2] 발행취소가 편집 중인 내용을 저장 완료 상태로 처리하는 문제
src/app/admin/posts/[id]/admin-post-editor.tsx:304-317src/lib/blog-admin.ts:179-189saved로 처리해 제목, 본문, 메타데이터 변경이 유실될 수 있음.[P2] 저장 실패 상태가 미저장 변경사항으로 보호되지 않는 문제
src/app/admin/posts/[id]/admin-post-editor.tsx:162-165,247-250error가 되지만 이탈 경고는dirty,saving만 확인함.[P2] 선택 URL을 비워도 기존 값이 DB에서 제거되지 않는 문제
src/app/admin/posts/[id]/admin-post-editor.tsx:919-921src/lib/admin-post-payload.ts:19-21src/lib/blog-admin.ts:341-355undefined가 전달되어 Prisma가 필드 변경을 생략함.[P2] 발행일과 수정일이 서울 시간 기준보다 하루 빠르게 저장될 수 있는 문제
src/lib/blog-admin.ts:150,350,500-502toISOString()의 UTC 날짜를 사용해서 Asia/Seoul 기준 00:00~08:59에 저장하면 전날 날짜가 기록됨.[P2] 카테고리 이름을 입력할 때 자동 slug가 첫 글자에서 멈추는 문제
src/app/admin/posts/[id]/admin-post-editor.tsx:663-668Backend를 입력해도b로 남을 수 있음.[P2] 발행 상태가 아닌 글에도 공개 글 링크가 표시되는 문제
src/app/admin/posts/[id]/admin-post-editor.tsx:120,573-579publishedNumber를 유지하기 때문에 번호만 확인하면 404로 연결되는 공개 글 링크가 표시됨.[P2] Playwright가 로컬 테스트 DB 대신 개발/운영 DB를 사용할 수 있는 문제
playwright.config.ts:21-25src/lib/prisma.ts:8-12src/lib/posts-db.ts:5,35-37next dev로 실행되어NODE_ENV=development가 되고DATABASE_URL_TEST가 아닌POSTGRES_PRISMA_URL을 선택함.[P2] E2E가 기존 게시물이 있다고 가정하는 문제
tests/e2e/admin-editor.spec.ts:109-123[P2] Storage PDF 검증이 실제 브라우저 CORS를 확인하지 못하는 문제
scripts/verify-storage-pdf.mjs:9-30tests/e2e/smoke.spec.ts:36-41react-pdf의 실제 로드 성공까지 확인하지 않음.기대 동작
null로 저장되고 날짜는 사이트 시간대를 따라야 함.검증 방법
npm run typechecknpm run lintnpm testnpm run test:e2e