메뉴 이동 시 메뉴·배경까지 사라지고 전체 화면이 흰색으로 바뀐 뒤 다시 나타나는 문제 개선 #9

Closed
opened 2026-10-04 08:56:35 +00:00 by genichin · 1 comment
Owner

요약

인증된 Dashboard에서 메뉴를 이동할 때 메뉴·배경까지 사라지고 전체 화면이 흰색으로 바뀌는 현상을 개선한다. 메뉴와 공통 배경은 유지하고 대상 페이지의 본문만 전환한다. 느린 조회 중에는 이전 본문 대신 대상 페이지의 로딩 안내를 표시한다.

원래 요청의 해결에 집중한다. 메뉴 클릭별 browser history 생성과 뒤로/앞으로 페이지 복원은 이번 작업의 필수 요구가 아니며, 이를 위해 URL 체계를 변경하거나 frontend history bridge를 도입하지 않는다. 기존 ?page= 직접 접속, 메뉴 구성, 관리자 인증과 금융 기능은 유지한다.

문제

  • 원본 요청은 메뉴 이동 중 메뉴·배경까지 소실되는 전체 흰 화면 현상의 개선이다. 별도의 history 기능 추가를 요청한 것이 아니다.
  • 현재 dashboard/common.py::render_sidebar_nav()는 ?page=...를 가진 일반 HTML <a target="_self">를 생성한다. dashboard/app.py::main()은 인증 후 CSS·메뉴·선택한 페이지를 구성한다. 메뉴 이동 방식과 공통 화면 재구성을 함께 조사해야 한다.
  • 전체 document 재로드와 Streamlit 스크립트 rerun은 구별한다. 모든 rerun을 없애는 것이 목표가 아니라, 메뉴 전환에서 document 전체 이동을 피하고 공통 화면이 소실되지 않도록 하는 것이 목표다.
  • 소스만으로 실제 Dashboard의 흰 화면 발생 원인을 확정하지 않는다. 구현에서는 기존 동작의 재현 조건과 개선 후 전환 중 화면을 비교해야 한다. 최종 페이지 screenshot이나 AppTest의 최종 렌더링 성공만으로 해결을 판정하지 않는다.

포함 범위

  • 기존 10개 메뉴인 월정산, 요약, 자산/마감, 거래내역, 확인필요 큐, 미분류, 분류 규칙, 카테고리, 계좌, Import 사이의 정상 메뉴 전환.
  • 현재 dependency 범위 안에서 document 전체 이동을 피하는 메뉴 입력 방식과 공통 스타일 적용을 최소한으로 수정한다. 메뉴·공통 배경은 유지하고 본문 영역만 전환한다. 새 화면 디자인이나 페이지 금융 로직의 재설계는 포함하지 않는다.
  • 메뉴 표시명·순서·선택 강조를 유지하며, 전환 완료 시 선택한 메뉴와 표시된 본문이 일치해야 한다.
  • 느린 조회 중 이전 본문을 대상 페이지 내용처럼 남겨 두지 않고 본문 영역에 대상 페이지의 로딩 안내를 표시한다. 조회 또는 렌더링 실패 시 같은 영역에 비민감 오류와 재시도 안내를 표시한다. 연속 메뉴 클릭 후에는 최종 선택과 본문이 일치해야 한다.
  • 기존 ?page= 직접 접속을 유지한다. page가 없거나 알 수 없는 값이면 기존처럼 요약을 표시한다. 직접 접속 시 기존 페이지별 부가 query 해석도 유지한다. 메뉴 클릭 후 선택 페이지를 URL에 반영하더라도 클릭별 history 생성이나 뒤로/앞으로 복원을 새 계약으로 추가하지 않는다.
  • 관리자 인증 성공 전 DB path 조회·gateway·page dispatch를 차단하는 순서와 기존 cookie 만료·rotation·logout/cleanup 계약을 유지한다. 인증 실패 시 보호 화면을 유지하는 방식으로 화면 연속성을 달성하지 않는다.
  • synthetic DB를 사용해 정상 전환·느린 조회·실패·연속 클릭 및 기존 핵심 페이지의 회귀를 검증한다. 새로고침 버튼의 cache clear 기능과 기존 금융 동작은 유지한다.

제외 범위

  • 메뉴 클릭별 browser history 생성, 뒤로/앞으로를 통한 페이지 복원의 신규 보장, frontend history bridge 추가.
  • history 요구를 만족시키기 위한 canonical URL의 경로 기반 전환 또는 별도 legacy URL adapter 도입. 기존 ?page= 직접 접속 형식을 유지한다.
  • 금융 계산·gateway 업무 계약·Import 처리·SQLite schema/data migration·MCP API 변경, 금융 mutation의 새로운 멱등성 보장.
  • 인증 방식·cookie TTL·보안 속성·login/logout/cleanup route 변경.
  • login 직후, logout, 인증 실패 cleanup, 사용자의 명시적 브라우저 새로고침까지 무중단 화면을 보장하는 작업.
  • dependency 업그레이드, 전면 SPA/framework 교체, 새 메뉴 추가, 디자인 재설계, 별도의 금융 조회 성능 개선 프로젝트.
  • 이 본문 재작성 작업에서 구현 코드·후속 문서 작성, Issue 승인, label/assignee 변경 또는 구현 handoff.

제약 조건

  • 저장소 근거 revision은 default branch main의 ffd943fe65875e67148c28ba44bae32918e338c9다. 저장소에 대한 모든 파일·문서 판정은 이 SHA를 기준으로 한다.
  • Dashboard의 Streamlit dependency 범위 >=1.58.0,<1.59.0를 유지한다. uv.lock의 적용 버전은 1.58.0이다.
  • 기본 해결 방향은 메뉴 입력을 widget/callback 기반 전환으로 바꾸고 공통 화면과 본문 렌더링 책임을 분리하는 최소 수정이다. 본문은 placeholder 갱신 등으로 이전 내용을 제거하고 로딩/대상 내용으로 교체할 수 있다. 구체적인 내부 API와 배치는 범위·보안·호환성 불변조건을 만족하는 방식으로 구현하며, 단순히 로딩 spinner를 추가한 것만으로 본문 교체 계약을 충족했다고 판단하지 않는다.
  • 기존 인증 gate를 통과하지 않은 금융 접근을 허용하지 않는다. 화면 연속성보다 인증 거부와 보호 데이터 비노출을 우선하며, token·credential을 UI state·URL·evidence에 기록하지 않는다.
  • 운영 ledger DB를 실험·회귀 테스트에 사용하지 않는다. synthetic DB와 테스트용 인증 설정을 사용하고 실제 금융 데이터·cookie/token을 evidence에 남기지 않는다.
  • 구현 후 실제 Dashboard를 브라우저로 시험해 클릭 전·전환 중·완료 후의 공통 화면, 본문, document 재로드 여부를 확인한다. 영상/연속 frame과 DOM/스타일 관찰을 사용하고 runtime·viewport·fixture·관찰 간격·제약을 기록한다. 표본 관찰을 모든 순간의 pixel 연속성 증명으로 과장하지 않는다.
  • 별도 synthetic 앱에서 핵심 전환 경로의 실현 가능성은 확인했지만 실제 Dashboard의 개선 구현·인증 통합·최종 acceptance 테스트는 아직 수행하지 않았다. 이는 구현 후 검증할 사항이며 추가 사용자 선택을 기다리는 질문으로 취급하지 않는다.

확정된 결정

  • 이번 작업의 핵심 목표는 메뉴 이동 중 메뉴·배경이 함께 사라지는 전체 흰 화면 현상을 제거하는 것이다. 최종 페이지가 표시되기만 하는 것으로 완료를 판정하지 않는다.
  • 공통 메뉴·배경을 유지하고 본문만 전환하며, 느린 조회는 본문 로딩 안내로 표시한다. 본문 오류/재시도 안내와 연속 클릭 후 최종 선택·표시 일치도 검증 범위로 유지한다.
  • 현재 Streamlit dependency 범위 안에서 최소 수정한다. 기존 메뉴 구성, ?page= 직접 접속, 인증과 금융 기능을 유지한다.
  • 사용자의 범위 재정렬과 본문 재작성 요청에 따라 history·뒤로/앞으로 복원을 필수 범위에서 제외한다. 이전 history 관련 선택과 그 해결을 위한 URL 변경/bridge 질문은 이번 범위의 구현 조건으로 사용하지 않는다. 별도 경로 기반 URL 정책을 채택한 것이 아니다.
  • 독립적인 메뉴 전환 UX 요구사항은 REQ-002로 신규 작성한다. REQ-001 관리자 인증의 ID·경로·정체성은 유지하고 인증 계약을 회귀 제약으로 연결한다.
  • 사용자 결정이 필요한 질문은 남아 있지 않다. 실제 앱 통합과 최종 품질 검증은 구현의 책임이며, 이 Discovery 재작성은 구현 완료나 승인 보고가 아니다.

저장소 근거

다음 파일은 모두 ffd943fe65875e67148c28ba44bae32918e338c9에서 읽었다.

  • dashboard/app.py::main — 인증 → DB path → CSS → page query/fallback → sidebar → dispatch 순서, 기존 10개 메뉴와 새로고침/cache clear 동작.
  • dashboard/common.py::render_sidebar_nav — ?page={quote(name)}와 target="_self" 일반 HTML 링크 및 active class. inject_app_css — st.markdown으로 앱·사이드바 배경과 메뉴 스타일 주입.
  • dashboard/authentication.py::require_dashboard_authentication 및 verify_persistent_token — 설정/cookie 검증 후 접근 허용, 인증 거부 시 login/cleanup, absolute expiry와 signing binding 검증. dashboard/server.py — 기존 인증 route를 장착하는 Streamlit App 진입점.
  • pyproject.toml, uv.lock — Dashboard dependency 범위와 적용 Streamlit 1.58.0.
  • tests/test_dashboard_app.py — synthetic DB 기반 핵심 페이지 최종 렌더링 검사. tests/test_dashboard_authentication_app.py — 인증 거부 시 DB 접근 차단, 정상 cookie 접근 및 rotation 회귀 검사.
  • scripts/streamlit_browser_evidence.py — 페이지별 직접 navigation 후 최종 screenshot/DOM 수집. 전환 중 흰 화면이나 본문 교체를 검증하려면 클릭 구간을 별도로 관찰해야 한다.
  • docs/requirements/req-001_dashboard-administrator-authentication.md — 유일한 요구사항 파일, REQ-001/revision 2.0, 관리자 인증과 기존 page/query 호환성. REQ-002와 신규 요구사항 경로는 pinned tree에 없다.
  • docs/interface-contract.md, docs/project-structure.md, docs/runtime-flow.md는 존재하며 docs/data-model.md는 없다.

별도 실행 근거는 저장소 구현과 구별한다. Streamlit 1.58.0 synthetic 앱의 실제 브라우저 실험에서 callback·단일 query 갱신·즉시 본문 placeholder 교체로 document 재로드 회피, 관찰 표본의 공통 화면 유지, 이전 본문 대신 로딩 안내 표시를 확인했다. 이는 기존 ?page= 형태를 사용하는 실험에서도 확인한 핵심 실현 가능성 근거다. 해당 실험은 실제 Dashboard를 실행한 것이 아니며 인증 통합이나 최종 구현 성공을 증명하지 않는다. 그 실험의 history 복원 실패는 이번 제외 범위이며 원래 흰 화면 개선의 blocker로 사용하지 않는다.

문서 영향 및 산출물

요구사항명세서

  • 조치: 신규 작성
  • 경로: docs/requirements/req-002_dashboard-menu-transition.md
  • 변경 내용: 메뉴 전환의 공통 화면 연속성과 본문 교체 요구사항·acceptance criteria를 작성한다. Issue #9와 REQ-001의 인증/호환성 제약을 추적하고 구현 PR은 생성 전까지 미정으로 기록한다. History나 URL 체계 변경을 필수 요구로 포함하지 않는다.
  • 근거: 기존 REQ-001은 관리자 인증이라는 별도의 정체성을 갖는다. pinned tree의 요구사항 ID는 REQ-001 하나로, 신규 REQ-002와 exact 경로에 충돌이 없다.
  • 문서 ID: REQ-002
  • 제목: Dashboard 메뉴 전환 시 공통 화면 연속성
  • 포함할 내용: 10개 메뉴의 정상 전환과 선택 표시, document 전체 이동 회피·메뉴/배경 유지·본문 교체, 느린 조회의 로딩 안내, 본문 오류/재시도 안내, 연속 클릭 후 최종 선택/표시 일치, 기존 ?page= 직접 접속과 요약 fallback 및 직접 접속 부가 query 호환성, 인증 실패 시 DB/page 차단과 보호 데이터 비노출, cookie 만료/rotation/logout 회귀, 기존 금융 기능·cache clear 유지, synthetic DB 기반 실제 Dashboard 브라우저 전환 관찰과 핵심 AppTest 회귀, Issue/구현 PR/실행 증거의 추적성.
  • 제외할 내용: 메뉴별 history와 뒤로/앞으로 복원의 신규 보장, 경로 기반 URL 전환·history bridge, 금융/DB/MCP 계약 변경, 인증 체계 개편, 명시적 reload·login/logout의 무중단 보장, 근거 없는 밀리초 SLA.

데이터 모델

  • 조치: 영향 없음
  • 경로: docs/data-model.md
  • 변경 내용: 금융 엔터티·필드·관계·영속 불변조건·migration을 변경하지 않으므로 신규 문서를 생성하지 않는다. 일시적인 페이지 선택·로딩 상태는 UI/runtime 책임이며 새 영속 금융 모델을 추가하지 않는다.
  • 근거: 범위는 메뉴 전환 UX이며 pinned tree에 이 정본 문서가 없다. 문서 부재 자체는 데이터 모델 신규 작성의 근거가 아니다.

인터페이스 계약

  • 조치: 갱신
  • 경로: docs/interface-contract.md
  • 변경 내용: 기존 문서를 제자리 갱신하여 메뉴 입력, 선택/본문 출력, 로딩·오류/재시도 안내, 기존 ?page= 직접 접속·invalid fallback·페이지별 query 호환성을 명시한다. History 복원과 경로 기반 URL을 새 계약으로 추가하지 않는다. 기존 인증 gate와 signed cookie·login/cleanup/logout의 입력/출력/보안/오류 계약 및 MCP 동작은 유지한다.
  • 근거: 현재 app의 query/dispatch와 common의 메뉴 링크가 UI 입력 경계이며 기존 interface 문서는 인증 후 page/query 호환성을 명시한다.

프로젝트 구조

  • 조치: 갱신
  • 경로: docs/project-structure.md
  • 변경 내용: 기존 문서를 제자리 갱신하여 dashboard/app.py의 인증 후 선택/dispatch와 공통 화면·본문 렌더링 경계, dashboard/common.py의 메뉴 입력/스타일 책임, dashboard/page_views/의 기존 금융 UI 책임과 의존 방향을 명시한다. REQ-002 경로와 기존 AppTest 및 실제 구현에서 확정한 브라우저 전환 검증 경로의 책임/배치 규칙을 기록한다. auth module의 금융 page/gateway 의존 금지 경계는 유지하며 history bridge·URL adapter·새 framework 디렉터리를 추가하지 않는다.
  • 근거: pinned tree에서 메뉴/CSS는 common, 인증 후 dispatch는 app, 금융 UI는 page_views에 있다. 새로운 내부 파일 배치가 필요한 경우에도 이 책임 경계와 최소 수정 범위를 지킨다.

런타임 흐름

  • 조치: 갱신
  • 경로: docs/runtime-flow.md
  • 변경 내용: 기존 문서를 제자리 갱신하여 메뉴 입력 → 인증 검증 → 선택 처리 → 공통 메뉴/배경 유지 → 이전 본문 교체·로딩 안내 → 대상 본문 표시 또는 오류/재시도 흐름을 기술한다. 실제 구현의 UI-local 선택/로딩 상태, 연속 클릭의 최종 선택 일치, 인증 거부 시 보호 화면 제거·DB 차단, 기존 금융 쓰기/외부 호출의 의도치 않은 재실행 방지 제약을 설명한다. History 복원 흐름을 추가하지 않고 기존 startup·cookie 발급/삭제·absolute TTL·logout/cleanup 계약을 유지한다. 비민감 page/전환 결과와 frame/DOM evidence로 관찰 가능성을 기록하며 운영 데이터·credential을 수집하지 않는다.
  • 근거: 기존 runtime 문서의 인증 gate와 dashboard dispatch에 메뉴 전환/본문 교체 구간을 구체화한다. 새로운 영속 상태나 금융 동시성 계약은 추가하지 않는다.

미해결 질문

없음

<!-- gitea-agent:discovery-draft/v2 --> ## 요약 인증된 Dashboard에서 메뉴를 이동할 때 메뉴·배경까지 사라지고 전체 화면이 흰색으로 바뀌는 현상을 개선한다. 메뉴와 공통 배경은 유지하고 대상 페이지의 본문만 전환한다. 느린 조회 중에는 이전 본문 대신 대상 페이지의 로딩 안내를 표시한다. 원래 요청의 해결에 집중한다. 메뉴 클릭별 browser history 생성과 뒤로/앞으로 페이지 복원은 이번 작업의 필수 요구가 아니며, 이를 위해 URL 체계를 변경하거나 frontend history bridge를 도입하지 않는다. 기존 `?page=` 직접 접속, 메뉴 구성, 관리자 인증과 금융 기능은 유지한다. ## 문제 - 원본 요청은 메뉴 이동 중 메뉴·배경까지 소실되는 전체 흰 화면 현상의 개선이다. 별도의 history 기능 추가를 요청한 것이 아니다. - 현재 `dashboard/common.py::render_sidebar_nav()`는 `?page=...`를 가진 일반 HTML `<a target="_self">`를 생성한다. `dashboard/app.py::main()`은 인증 후 CSS·메뉴·선택한 페이지를 구성한다. 메뉴 이동 방식과 공통 화면 재구성을 함께 조사해야 한다. - 전체 document 재로드와 Streamlit 스크립트 rerun은 구별한다. 모든 rerun을 없애는 것이 목표가 아니라, 메뉴 전환에서 document 전체 이동을 피하고 공통 화면이 소실되지 않도록 하는 것이 목표다. - 소스만으로 실제 Dashboard의 흰 화면 발생 원인을 확정하지 않는다. 구현에서는 기존 동작의 재현 조건과 개선 후 전환 중 화면을 비교해야 한다. 최종 페이지 screenshot이나 AppTest의 최종 렌더링 성공만으로 해결을 판정하지 않는다. ## 포함 범위 - 기존 10개 메뉴인 월정산, 요약, 자산/마감, 거래내역, 확인필요 큐, 미분류, 분류 규칙, 카테고리, 계좌, Import 사이의 정상 메뉴 전환. - 현재 dependency 범위 안에서 document 전체 이동을 피하는 메뉴 입력 방식과 공통 스타일 적용을 최소한으로 수정한다. 메뉴·공통 배경은 유지하고 본문 영역만 전환한다. 새 화면 디자인이나 페이지 금융 로직의 재설계는 포함하지 않는다. - 메뉴 표시명·순서·선택 강조를 유지하며, 전환 완료 시 선택한 메뉴와 표시된 본문이 일치해야 한다. - 느린 조회 중 이전 본문을 대상 페이지 내용처럼 남겨 두지 않고 본문 영역에 대상 페이지의 로딩 안내를 표시한다. 조회 또는 렌더링 실패 시 같은 영역에 비민감 오류와 재시도 안내를 표시한다. 연속 메뉴 클릭 후에는 최종 선택과 본문이 일치해야 한다. - 기존 `?page=` 직접 접속을 유지한다. `page`가 없거나 알 수 없는 값이면 기존처럼 요약을 표시한다. 직접 접속 시 기존 페이지별 부가 query 해석도 유지한다. 메뉴 클릭 후 선택 페이지를 URL에 반영하더라도 클릭별 history 생성이나 뒤로/앞으로 복원을 새 계약으로 추가하지 않는다. - 관리자 인증 성공 전 DB path 조회·gateway·page dispatch를 차단하는 순서와 기존 cookie 만료·rotation·logout/cleanup 계약을 유지한다. 인증 실패 시 보호 화면을 유지하는 방식으로 화면 연속성을 달성하지 않는다. - synthetic DB를 사용해 정상 전환·느린 조회·실패·연속 클릭 및 기존 핵심 페이지의 회귀를 검증한다. 새로고침 버튼의 cache clear 기능과 기존 금융 동작은 유지한다. ## 제외 범위 - 메뉴 클릭별 browser history 생성, 뒤로/앞으로를 통한 페이지 복원의 신규 보장, frontend history bridge 추가. - history 요구를 만족시키기 위한 canonical URL의 경로 기반 전환 또는 별도 legacy URL adapter 도입. 기존 `?page=` 직접 접속 형식을 유지한다. - 금융 계산·gateway 업무 계약·Import 처리·SQLite schema/data migration·MCP API 변경, 금융 mutation의 새로운 멱등성 보장. - 인증 방식·cookie TTL·보안 속성·login/logout/cleanup route 변경. - login 직후, logout, 인증 실패 cleanup, 사용자의 명시적 브라우저 새로고침까지 무중단 화면을 보장하는 작업. - dependency 업그레이드, 전면 SPA/framework 교체, 새 메뉴 추가, 디자인 재설계, 별도의 금융 조회 성능 개선 프로젝트. - 이 본문 재작성 작업에서 구현 코드·후속 문서 작성, Issue 승인, label/assignee 변경 또는 구현 handoff. ## 제약 조건 - 저장소 근거 revision은 default branch `main`의 `ffd943fe65875e67148c28ba44bae32918e338c9`다. 저장소에 대한 모든 파일·문서 판정은 이 SHA를 기준으로 한다. - Dashboard의 Streamlit dependency 범위 `>=1.58.0,<1.59.0`를 유지한다. `uv.lock`의 적용 버전은 1.58.0이다. - 기본 해결 방향은 메뉴 입력을 widget/callback 기반 전환으로 바꾸고 공통 화면과 본문 렌더링 책임을 분리하는 최소 수정이다. 본문은 placeholder 갱신 등으로 이전 내용을 제거하고 로딩/대상 내용으로 교체할 수 있다. 구체적인 내부 API와 배치는 범위·보안·호환성 불변조건을 만족하는 방식으로 구현하며, 단순히 로딩 spinner를 추가한 것만으로 본문 교체 계약을 충족했다고 판단하지 않는다. - 기존 인증 gate를 통과하지 않은 금융 접근을 허용하지 않는다. 화면 연속성보다 인증 거부와 보호 데이터 비노출을 우선하며, token·credential을 UI state·URL·evidence에 기록하지 않는다. - 운영 ledger DB를 실험·회귀 테스트에 사용하지 않는다. synthetic DB와 테스트용 인증 설정을 사용하고 실제 금융 데이터·cookie/token을 evidence에 남기지 않는다. - 구현 후 실제 Dashboard를 브라우저로 시험해 클릭 전·전환 중·완료 후의 공통 화면, 본문, document 재로드 여부를 확인한다. 영상/연속 frame과 DOM/스타일 관찰을 사용하고 runtime·viewport·fixture·관찰 간격·제약을 기록한다. 표본 관찰을 모든 순간의 pixel 연속성 증명으로 과장하지 않는다. - 별도 synthetic 앱에서 핵심 전환 경로의 실현 가능성은 확인했지만 실제 Dashboard의 개선 구현·인증 통합·최종 acceptance 테스트는 아직 수행하지 않았다. 이는 구현 후 검증할 사항이며 추가 사용자 선택을 기다리는 질문으로 취급하지 않는다. ## 확정된 결정 - 이번 작업의 핵심 목표는 메뉴 이동 중 메뉴·배경이 함께 사라지는 전체 흰 화면 현상을 제거하는 것이다. 최종 페이지가 표시되기만 하는 것으로 완료를 판정하지 않는다. - 공통 메뉴·배경을 유지하고 본문만 전환하며, 느린 조회는 본문 로딩 안내로 표시한다. 본문 오류/재시도 안내와 연속 클릭 후 최종 선택·표시 일치도 검증 범위로 유지한다. - 현재 Streamlit dependency 범위 안에서 최소 수정한다. 기존 메뉴 구성, `?page=` 직접 접속, 인증과 금융 기능을 유지한다. - 사용자의 범위 재정렬과 본문 재작성 요청에 따라 history·뒤로/앞으로 복원을 필수 범위에서 제외한다. 이전 history 관련 선택과 그 해결을 위한 URL 변경/bridge 질문은 이번 범위의 구현 조건으로 사용하지 않는다. 별도 경로 기반 URL 정책을 채택한 것이 아니다. - 독립적인 메뉴 전환 UX 요구사항은 REQ-002로 신규 작성한다. REQ-001 관리자 인증의 ID·경로·정체성은 유지하고 인증 계약을 회귀 제약으로 연결한다. - 사용자 결정이 필요한 질문은 남아 있지 않다. 실제 앱 통합과 최종 품질 검증은 구현의 책임이며, 이 Discovery 재작성은 구현 완료나 승인 보고가 아니다. ## 저장소 근거 다음 파일은 모두 `ffd943fe65875e67148c28ba44bae32918e338c9`에서 읽었다. - `dashboard/app.py::main` — 인증 → DB path → CSS → `page` query/fallback → sidebar → dispatch 순서, 기존 10개 메뉴와 새로고침/cache clear 동작. - `dashboard/common.py::render_sidebar_nav` — `?page={quote(name)}`와 `target="_self"` 일반 HTML 링크 및 active class. `inject_app_css` — `st.markdown`으로 앱·사이드바 배경과 메뉴 스타일 주입. - `dashboard/authentication.py::require_dashboard_authentication` 및 `verify_persistent_token` — 설정/cookie 검증 후 접근 허용, 인증 거부 시 login/cleanup, absolute expiry와 signing binding 검증. `dashboard/server.py` — 기존 인증 route를 장착하는 Streamlit `App` 진입점. - `pyproject.toml`, `uv.lock` — Dashboard dependency 범위와 적용 Streamlit 1.58.0. - `tests/test_dashboard_app.py` — synthetic DB 기반 핵심 페이지 최종 렌더링 검사. `tests/test_dashboard_authentication_app.py` — 인증 거부 시 DB 접근 차단, 정상 cookie 접근 및 rotation 회귀 검사. - `scripts/streamlit_browser_evidence.py` — 페이지별 직접 navigation 후 최종 screenshot/DOM 수집. 전환 중 흰 화면이나 본문 교체를 검증하려면 클릭 구간을 별도로 관찰해야 한다. - `docs/requirements/req-001_dashboard-administrator-authentication.md` — 유일한 요구사항 파일, REQ-001/revision 2.0, 관리자 인증과 기존 page/query 호환성. REQ-002와 신규 요구사항 경로는 pinned tree에 없다. - `docs/interface-contract.md`, `docs/project-structure.md`, `docs/runtime-flow.md`는 존재하며 `docs/data-model.md`는 없다. 별도 실행 근거는 저장소 구현과 구별한다. Streamlit 1.58.0 synthetic 앱의 실제 브라우저 실험에서 callback·단일 query 갱신·즉시 본문 placeholder 교체로 document 재로드 회피, 관찰 표본의 공통 화면 유지, 이전 본문 대신 로딩 안내 표시를 확인했다. 이는 기존 `?page=` 형태를 사용하는 실험에서도 확인한 핵심 실현 가능성 근거다. 해당 실험은 실제 Dashboard를 실행한 것이 아니며 인증 통합이나 최종 구현 성공을 증명하지 않는다. 그 실험의 history 복원 실패는 이번 제외 범위이며 원래 흰 화면 개선의 blocker로 사용하지 않는다. ## 문서 영향 및 산출물 ### 요구사항명세서 - 조치: 신규 작성 - 경로: `docs/requirements/req-002_dashboard-menu-transition.md` - 변경 내용: 메뉴 전환의 공통 화면 연속성과 본문 교체 요구사항·acceptance criteria를 작성한다. Issue #9와 REQ-001의 인증/호환성 제약을 추적하고 구현 PR은 생성 전까지 `미정`으로 기록한다. History나 URL 체계 변경을 필수 요구로 포함하지 않는다. - 근거: 기존 REQ-001은 관리자 인증이라는 별도의 정체성을 갖는다. pinned tree의 요구사항 ID는 REQ-001 하나로, 신규 REQ-002와 exact 경로에 충돌이 없다. - 문서 ID: REQ-002 - 제목: Dashboard 메뉴 전환 시 공통 화면 연속성 - 포함할 내용: 10개 메뉴의 정상 전환과 선택 표시, document 전체 이동 회피·메뉴/배경 유지·본문 교체, 느린 조회의 로딩 안내, 본문 오류/재시도 안내, 연속 클릭 후 최종 선택/표시 일치, 기존 `?page=` 직접 접속과 요약 fallback 및 직접 접속 부가 query 호환성, 인증 실패 시 DB/page 차단과 보호 데이터 비노출, cookie 만료/rotation/logout 회귀, 기존 금융 기능·cache clear 유지, synthetic DB 기반 실제 Dashboard 브라우저 전환 관찰과 핵심 AppTest 회귀, Issue/구현 PR/실행 증거의 추적성. - 제외할 내용: 메뉴별 history와 뒤로/앞으로 복원의 신규 보장, 경로 기반 URL 전환·history bridge, 금융/DB/MCP 계약 변경, 인증 체계 개편, 명시적 reload·login/logout의 무중단 보장, 근거 없는 밀리초 SLA. ### 데이터 모델 - 조치: 영향 없음 - 경로: `docs/data-model.md` - 변경 내용: 금융 엔터티·필드·관계·영속 불변조건·migration을 변경하지 않으므로 신규 문서를 생성하지 않는다. 일시적인 페이지 선택·로딩 상태는 UI/runtime 책임이며 새 영속 금융 모델을 추가하지 않는다. - 근거: 범위는 메뉴 전환 UX이며 pinned tree에 이 정본 문서가 없다. 문서 부재 자체는 데이터 모델 신규 작성의 근거가 아니다. ### 인터페이스 계약 - 조치: 갱신 - 경로: `docs/interface-contract.md` - 변경 내용: 기존 문서를 제자리 갱신하여 메뉴 입력, 선택/본문 출력, 로딩·오류/재시도 안내, 기존 `?page=` 직접 접속·invalid fallback·페이지별 query 호환성을 명시한다. History 복원과 경로 기반 URL을 새 계약으로 추가하지 않는다. 기존 인증 gate와 signed cookie·login/cleanup/logout의 입력/출력/보안/오류 계약 및 MCP 동작은 유지한다. - 근거: 현재 app의 query/dispatch와 common의 메뉴 링크가 UI 입력 경계이며 기존 interface 문서는 인증 후 page/query 호환성을 명시한다. ### 프로젝트 구조 - 조치: 갱신 - 경로: `docs/project-structure.md` - 변경 내용: 기존 문서를 제자리 갱신하여 `dashboard/app.py`의 인증 후 선택/dispatch와 공통 화면·본문 렌더링 경계, `dashboard/common.py`의 메뉴 입력/스타일 책임, `dashboard/page_views/`의 기존 금융 UI 책임과 의존 방향을 명시한다. REQ-002 경로와 기존 AppTest 및 실제 구현에서 확정한 브라우저 전환 검증 경로의 책임/배치 규칙을 기록한다. auth module의 금융 page/gateway 의존 금지 경계는 유지하며 history bridge·URL adapter·새 framework 디렉터리를 추가하지 않는다. - 근거: pinned tree에서 메뉴/CSS는 common, 인증 후 dispatch는 app, 금융 UI는 page_views에 있다. 새로운 내부 파일 배치가 필요한 경우에도 이 책임 경계와 최소 수정 범위를 지킨다. ### 런타임 흐름 - 조치: 갱신 - 경로: `docs/runtime-flow.md` - 변경 내용: 기존 문서를 제자리 갱신하여 메뉴 입력 → 인증 검증 → 선택 처리 → 공통 메뉴/배경 유지 → 이전 본문 교체·로딩 안내 → 대상 본문 표시 또는 오류/재시도 흐름을 기술한다. 실제 구현의 UI-local 선택/로딩 상태, 연속 클릭의 최종 선택 일치, 인증 거부 시 보호 화면 제거·DB 차단, 기존 금융 쓰기/외부 호출의 의도치 않은 재실행 방지 제약을 설명한다. History 복원 흐름을 추가하지 않고 기존 startup·cookie 발급/삭제·absolute TTL·logout/cleanup 계약을 유지한다. 비민감 page/전환 결과와 frame/DOM evidence로 관찰 가능성을 기록하며 운영 데이터·credential을 수집하지 않는다. - 근거: 기존 runtime 문서의 인증 gate와 dashboard dispatch에 메뉴 전환/본문 교체 구간을 구체화한다. 새로운 영속 상태나 금융 동시성 계약은 추가하지 않는다. ## 미해결 질문 없음
Owner

Discovery 작성 전 이슈 원본

메뉴 이동 시 메뉴·배경까지 사라지고 전체 화면이 흰색으로 바뀐 뒤 다시 나타나는 문제 개선

<!-- gitea-agent:discovery-origin/v1 owner=jsfamily repository=jarca-ledger-mcp issue=9 body-sha256=5422814c2e4da61a7969a9199c6c0cdc2c229602fdf9f26544b1c030caa293c4 --> ## Discovery 작성 전 이슈 원본 메뉴 이동 시 메뉴·배경까지 사라지고 전체 화면이 흰색으로 바뀐 뒤 다시 나타나는 문제 개선
Sign in to join this conversation.