Skip to content

fix: 라우트 변경 시 모달, 알림 패널 등 오버레이 닫힘 처리 공통화 - #78

Merged
yooseohyeon merged 3 commits into
devfrom
fix/close-modal-on-route-change
Aug 7, 2026
Merged

fix: 라우트 변경 시 모달, 알림 패널 등 오버레이 닫힘 처리 공통화#78
yooseohyeon merged 3 commits into
devfrom
fix/close-modal-on-route-change

Conversation

@yooseohyeon

@yooseohyeon yooseohyeon commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

📋 작업 내용

페이지 이동·뒤로가기·앞으로가기 시 이전 화면의 모달과 헤더 오버레이가 남지 않도록 닫힘 처리를 공통화했습니다.


🔥 변경 사항

  • useCloseOnPathnameChange 공통 hook: 최초 마운트는 유지하고 pathname 변경 시 최신 닫기 콜백을 실행
  • 공통 Modal에 훅을 적용해 로그인 모달을 포함한 공통 모달이 라우트 이동 시 닫히도록 수정
  • 헤더 사이드바와 알림 패널에도 훅 적용

✅ 체크리스트

  • 로컬에서 정상 동작을 확인했습니다.
  • 기존 기능에 영향을 주지 않는지 확인했습니다.
  • 불필요한 console.log를 제거했습니다.
  • lint를 통과했습니다.
  • [] README 또는 문서를 수정했습니다. (필요 시)
  • [] API 명세와 일치하는지 확인했습니다.

📷 스크린샷 (선택)

UI 변경 없음


🔗 관련 이슈

관련 이슈 없음


💬 To Reviewer

  • pathname 변경 시에만 닫히며, 같은 페이지 내 쿼리·상태 변경에는 유지됩니다.
  • 공통 훅이 최신 onClose 콜백을 ref로 관리하는 방식이 적절한지 중점적으로 확인 부탁드립니다.

Summary by CodeRabbit

  • 개선 사항
    • 페이지 이동 시 사이드 내비게이션이 자동으로 닫힙니다.
    • 페이지 이동 시 알림 패널과 모달이 자동으로 닫혀 화면 전환이 더 원활해졌습니다.

@vercel

vercel Bot commented Aug 7, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
moving-frontend Ready Ready Preview Aug 7, 2026 12:12am
moving-frontend-p2ol Ready Ready Preview Aug 7, 2026 12:12am

@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 073f1b56-bfc9-4ec7-9810-13791beeb0fd

📥 Commits

Reviewing files that changed from the base of the PR and between d54cfd4 and 50b8883.

📒 Files selected for processing (4)
  • src/components/common/Header/Header.tsx
  • src/components/common/Header/notification/NotificationTrigger.tsx
  • src/components/common/Modal/ModalMain.tsx
  • src/hooks/useCloseOnPathnameChange.ts

📝 Walkthrough

Walkthrough

공통 useCloseOnPathnameChange 훅을 추가했습니다. Header, NotificationTrigger, ModalMain은 pathname 변경 시 각 닫기 콜백을 실행합니다. 최초 마운트에서는 콜백을 실행하지 않습니다.

Changes

경로 변경 시 패널 자동 닫기

Layer / File(s) Summary
경로 변경 감지 훅
src/hooks/useCloseOnPathnameChange.ts
초기 pathname을 저장합니다. pathname이 변경되면 최신 onClose 콜백을 실행합니다.
사이드 내비게이션 연결
src/components/common/Header/Header.tsx
기존 pathname 비교 및 상태 갱신 로직을 제거했습니다. closeSideNav를 공통 훅에 연결했습니다.
알림 패널 및 모달 연결
src/components/common/Header/notification/NotificationTrigger.tsx, src/components/common/Modal/ModalMain.tsx
경로 변경 시 알림 패널은 closeQuiet를 호출합니다. 모달은 onClose를 호출합니다.

Estimated code review effort: 2 (Simple) | ~10 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Router as Next.js pathname
  participant Hook as useCloseOnPathnameChange
  participant Header
  participant NotificationTrigger
  participant ModalMain

  Router->>Hook: pathname 변경 전달
  Hook->>Header: closeSideNav 실행
  Hook->>NotificationTrigger: closeQuiet 실행
  Hook->>ModalMain: onClose 실행
Loading

Possibly related PRs

Suggested labels: ♻️ refactor, 🏢코드리뷰

Suggested reviewers: 9g-g9, juengseulki

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 라우트 변경 시 모달과 헤더 오버레이를 닫는 공통 훅 적용이라는 주요 변경 사항을 정확하고 간결하게 설명합니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/close-modal-on-route-change

Comment @coderabbitai help to get the list of available commands.

@juengseulki juengseulki left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

전체 변경사항 확인했습니다!

👍 좋았던 점

  • 페이지 이동, 뒤로가기, 앞으로가기 시 이전 화면의 Overlay가 남는 문제를 공통 Hook으로 정리했습니다.
  • 최초 마운트에서는 닫기 callback을 실행하지 않고, pathname이 실제로 변경된 경우에만 실행하도록 구성했습니다.
  • 최신 onClose callback을 Ref로 관리해 stale closure를 방지했습니다.
  • callback 참조 변경 때문에 pathname 감지 Effect가 불필요하게 다시 실행되지 않도록 했습니다.
  • 같은 pathname에서 Query String이나 화면 상태만 변경되는 경우에는 Overlay를 유지하는 정책을 명확히 적용했습니다.
  • 공통 Modal에 Hook을 적용해 로그인 안내 등 모든 공통 Modal 사용처가 자동으로 같은 정책을 따르도록 했습니다.
  • Header 사이드바와 알림 패널에도 동일 Hook을 적용해 Overlay별 개별 구현을 제거했습니다.
  • Header에서 렌더 도중 pathname을 비교하며 상태를 변경하던 기존 로직을 Effect 기반 처리로 교체했습니다.
  • 사이드바와 알림 패널의 기존 닫기 callback을 그대로 재사용해 닫기 책임이 중복되지 않았습니다.
  • pathname Ref를 갱신한 뒤 callback을 실행해 callback 과정의 상태 변경에도 비교적 안정적으로 동작하도록 구성했습니다.
  • 변경 파일이 4개로 제한되어 있고, 공통 Hook 추가와 적용 범위가 명확합니다.
  • 현재 PR은 열려 있고 병합 가능한 상태입니다.

🔍 확인 및 제안

최신 onClose를 Ref로 관리하는 방식은 적절합니다.

onClose를 pathname 감지 Effect의 의존성에 직접 포함하면
부모 렌더링으로 callback 참조가 바뀔 때마다 Effect가 다시 평가되고,
구현 방식에 따라 실제 경로 변경이 아닌데도 닫기 로직과 결합될 가능성이 있습니다.

현재 구현은 다음처럼 역할이 잘 분리되어 있습니다.

  • 첫 번째 Effect: 최신 onClose 저장
  • 두 번째 Effect: pathname 변경만 감지
  • pathname 변경 시: 최신 callback 실행

따라서 경로 감지와 callback 최신화가 서로 독립적으로 동작합니다.

현재 기준은 pathname이므로 Query String이나 같은 페이지 내부 상태 변경에는 Overlay가 유지됩니다.
PR 설명의 정책과 일치합니다.

다만 Hash 변경도 화면 이동으로 간주해야 하는 요구가 생기면
현재 Hook만으로는 감지되지 않으므로 후속으로 별도 기준을 검토하면 좋겠습니다.

전체적으로 반복되던 닫기 처리를 공통화하면서
기존 Overlay별 닫기 로직은 재사용한 깔끔한 변경으로 보입니다.

수고하셨습니다! 😊


To Reviewer 내용 기준으로 pathname 변경 시점과
최신 onClose callback을 Ref로 관리하는 방식을 중점적으로 확인했습니다!

현재 Hook은 usePathname()의 결과만 감지하기 때문에
실제 pathname이 변경될 때만 닫기 callback이 실행됩니다.

따라서 다음 동작에서는 Overlay가 닫힙니다.

  • 다른 페이지 링크로 이동
  • router.push() 또는 router.replace()로 pathname 변경
  • 브라우저 뒤로가기
  • 브라우저 앞으로가기

반대로 다음과 같은 동일 페이지 내부 변경에서는 유지됩니다.

  • Query String 변경
  • 필터·정렬 상태 변경
  • 컴포넌트 로컬 상태 변경
  • React Query 데이터 갱신

PR에 작성된 동작 정책과 일치하는 것으로 확인했습니다.

최신 onClose callback을 Ref로 관리한 방식도 적절합니다.

현재 구현은 callback 최신화와 pathname 감지를 서로 다른 Effect로 분리합니다.

  • onClose가 바뀌면 onCloseRef.current만 갱신
  • pathname이 바뀌면 onCloseRef.current에 저장된 최신 함수 실행

이 구조 덕분에 pathname 감지 Effect가
onClose 함수 참조 변화에 영향을 받지 않으면서도
실제 닫기 시점에는 최신 callback을 사용할 수 있습니다.

최초 마운트에서는 초기 pathname과 현재 pathname이 같으므로
닫기 callback이 호출되지 않고,
첫 번째 실제 경로 변경부터 실행되는 흐름도 적절합니다.

공통 Modal에 적용한 범위도 자연스럽습니다.
로그인 Modal을 포함한 공통 Modal 사용처가 모두 같은 동작을 따르고,
onClose가 없는 Modal은 Optional Chaining으로 아무 동작도 하지 않아 기존 계약을 유지합니다.

Header 사이드바의 기존 렌더 중 상태 변경 로직을 제거하고
동일 Hook을 사용하도록 변경한 부분도 더 안전한 React 패턴으로 보입니다.

알림 패널 역시 기존의 closeQuiet callback을 재사용해
바깥 클릭과 라우트 변경이 동일한 닫기 처리를 공유합니다.

@yooseohyeon

Copy link
Copy Markdown
Contributor Author

@juengseulki
리뷰 감사합니다! To Reviewer에 적은 내용까지 확인해주셔서 감사합니다.
#section처럼 hash만 바뀌는 경우을 짚어주셔서 감사합니다. hash가 바뀔 때에도 오버레이를 닫아야 한다는 요구가 현재 상황에서는 없지만, 추후에 확장을 검토해보겠습니다!

전체 변경사항 확인했습니다!

👍 좋았던 점

  • 페이지 이동, 뒤로가기, 앞으로가기 시 이전 화면의 Overlay가 남는 문제를 공통 Hook으로 정리했습니다.
  • 최초 마운트에서는 닫기 callback을 실행하지 않고, pathname이 실제로 변경된 경우에만 실행하도록 구성했습니다.
  • 최신 onClose callback을 Ref로 관리해 stale closure를 방지했습니다.
  • callback 참조 변경 때문에 pathname 감지 Effect가 불필요하게 다시 실행되지 않도록 했습니다.
  • 같은 pathname에서 Query String이나 화면 상태만 변경되는 경우에는 Overlay를 유지하는 정책을 명확히 적용했습니다.
  • 공통 Modal에 Hook을 적용해 로그인 안내 등 모든 공통 Modal 사용처가 자동으로 같은 정책을 따르도록 했습니다.
  • Header 사이드바와 알림 패널에도 동일 Hook을 적용해 Overlay별 개별 구현을 제거했습니다.
  • Header에서 렌더 도중 pathname을 비교하며 상태를 변경하던 기존 로직을 Effect 기반 처리로 교체했습니다.
  • 사이드바와 알림 패널의 기존 닫기 callback을 그대로 재사용해 닫기 책임이 중복되지 않았습니다.
  • pathname Ref를 갱신한 뒤 callback을 실행해 callback 과정의 상태 변경에도 비교적 안정적으로 동작하도록 구성했습니다.
  • 변경 파일이 4개로 제한되어 있고, 공통 Hook 추가와 적용 범위가 명확합니다.
  • 현재 PR은 열려 있고 병합 가능한 상태입니다.

🔍 확인 및 제안

최신 onClose를 Ref로 관리하는 방식은 적절합니다.

onClose를 pathname 감지 Effect의 의존성에 직접 포함하면 부모 렌더링으로 callback 참조가 바뀔 때마다 Effect가 다시 평가되고, 구현 방식에 따라 실제 경로 변경이 아닌데도 닫기 로직과 결합될 가능성이 있습니다.

현재 구현은 다음처럼 역할이 잘 분리되어 있습니다.

  • 첫 번째 Effect: 최신 onClose 저장
  • 두 번째 Effect: pathname 변경만 감지
  • pathname 변경 시: 최신 callback 실행

따라서 경로 감지와 callback 최신화가 서로 독립적으로 동작합니다.

현재 기준은 pathname이므로 Query String이나 같은 페이지 내부 상태 변경에는 Overlay가 유지됩니다. PR 설명의 정책과 일치합니다.

다만 Hash 변경도 화면 이동으로 간주해야 하는 요구가 생기면 현재 Hook만으로는 감지되지 않으므로 후속으로 별도 기준을 검토하면 좋겠습니다.

전체적으로 반복되던 닫기 처리를 공통화하면서 기존 Overlay별 닫기 로직은 재사용한 깔끔한 변경으로 보입니다.

수고하셨습니다! 😊

To Reviewer 내용 기준으로 pathname 변경 시점과 최신 onClose callback을 Ref로 관리하는 방식을 중점적으로 확인했습니다!

현재 Hook은 usePathname()의 결과만 감지하기 때문에 실제 pathname이 변경될 때만 닫기 callback이 실행됩니다.

따라서 다음 동작에서는 Overlay가 닫힙니다.

  • 다른 페이지 링크로 이동
  • router.push() 또는 router.replace()로 pathname 변경
  • 브라우저 뒤로가기
  • 브라우저 앞으로가기

반대로 다음과 같은 동일 페이지 내부 변경에서는 유지됩니다.

  • Query String 변경
  • 필터·정렬 상태 변경
  • 컴포넌트 로컬 상태 변경
  • React Query 데이터 갱신

PR에 작성된 동작 정책과 일치하는 것으로 확인했습니다.

최신 onClose callback을 Ref로 관리한 방식도 적절합니다.

현재 구현은 callback 최신화와 pathname 감지를 서로 다른 Effect로 분리합니다.

  • onClose가 바뀌면 onCloseRef.current만 갱신
  • pathname이 바뀌면 onCloseRef.current에 저장된 최신 함수 실행

이 구조 덕분에 pathname 감지 Effect가 onClose 함수 참조 변화에 영향을 받지 않으면서도 실제 닫기 시점에는 최신 callback을 사용할 수 있습니다.

최초 마운트에서는 초기 pathname과 현재 pathname이 같으므로 닫기 callback이 호출되지 않고, 첫 번째 실제 경로 변경부터 실행되는 흐름도 적절합니다.

공통 Modal에 적용한 범위도 자연스럽습니다. 로그인 Modal을 포함한 공통 Modal 사용처가 모두 같은 동작을 따르고, onClose가 없는 Modal은 Optional Chaining으로 아무 동작도 하지 않아 기존 계약을 유지합니다.

Header 사이드바의 기존 렌더 중 상태 변경 로직을 제거하고 동일 Hook을 사용하도록 변경한 부분도 더 안전한 React 패턴으로 보입니다.

알림 패널 역시 기존의 closeQuiet callback을 재사용해 바깥 클릭과 라우트 변경이 동일한 닫기 처리를 공유합니다.

@yooseohyeon
yooseohyeon merged commit 8ea67c5 into dev Aug 7, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants