[Refactor] FocusTrap 추가, 모달 2개 이상 랜더링시 배경 어두워지는 버그 해결 #667
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
📌 Related Issues
✅ 체크 리스트
📄 Tasks
ModalLayout컴포넌트 추가로 모달 레이아웃 및 이벤트 처리 분리FocusTrap컴포넌트 추가로 접근성 개선 (키보드 포커스 관리)⭐ PR Point
FocusTrap컴포넌트로 접근성 개선 (키보드 포커스 관리)기존에는 모달을 열고
Tab으로 모달내 버튼에 접근하려고해도 background에 있는 요소들로 먼저 접근해 모달의 버튼을 누르기 쉽지 않았어요.시각장애를 가지고 계신 분들은 접근하기가 매우 불편한 구조였죠. 물론 시각장애가 없는 사용자의 사용성도 좋지 못해요.
2026-01-01.9.35.10.mov
이런 문제를 해결하고자
FocusTrap컴포넌트를 개발했어요.FocusTrap은자식요소 내부로 포커스를 가두기가 관심사에요.원리는 아래와 같아요.
이제 모달을 FocusTrap으로 감싸서 랜더링해주면 다음과 같이 모달 내부로 포커스가 갇혀서 키보드 접근성을 개선할 수 있어요.
모달 뿐만 아니라 드로어, 드롭다운 등 포커스가 내부에 머물러야하는 요소들에 다 사용할 수 있으니 필요할때 적절히 사용해봐요
2026-01-01.9.24.12.mov
ModalLayout컴포넌트 추가로 모달 레이아웃 및 이벤트 처리 분리ModalLayout 컴포넌트의 책임은 다음과 같아요.
기존에는
Modal컴포넌트와ModalLayout을 같이 랜더링해주는 구조였어요.이때 3번 책임 때문에 1
모달1ModalLayout이라 모달이 2개이상 랜더링 되면 배경색이 더 어두워지는 버그가 있었어요. (ModalLayout이 여러개 랜더링되어)2026-01-01.9.34.08.mov
이를 해결하고자
Modal내부에서ModalLayout을 분리해 ModalLayout은 여러개의 모달을 띄워도 한개만 유지되게 구조를 변경했어요.사실 관심사와 확장성을 생각하면 애초에 분리하는게 맞는 구조라 생각해요.
이때 문제가 되는 지점이 2 번 책임이었어요.
현재 모달은 id값을 통해서
close로직을 관리하고 있어요.즉, 모달 랜더링 함수를 store에 저장할때 지정되는 id값을
ModalLayout이 알아야 모달을 닫을 수 있는거죠.기존에는 모달에서
ModalLayout을 랜더링하기 때문에ModalLayout에 id를 알려줄수 있지만 분리하게 되면 각 모달에서 id를 알려주지 못해요.이를
modalStore에서 최상단 모달을 지우는closeLastModal액션을 추가해서 문제를 해결했어요.어차피 여러개의 모달을 띄우고
esc, 모달 외부 클릭시최상단 모달만 닫으면 되기 때문이에요.2026-01-01.9.23.49.mov
url 변경시 모달 store reset
ModalProvier내부에서 useLocation 훅을 활용해 url 변경시 모달 store를 reset해주는 로직을 추가했어요.건휘가 고생하던게 어쩌면 이걸로 해결되지 않을까? 하는 희망을 품어봐요.
📷 Screenshot
🔔 ETC