들어가며: UX 디자이너라면 누구나 고민하는 순간
"이 기능은 모달로 보여줄까, 아니면 새로운 페이지로 이동시킬까?"
프로덕트를 만들다 보면 이 결정 앞에서 멈칫하게 됩니다. 단순해 보이지만, 사용자 흐름과 맥락 유지, 작업 효율에 큰 영향을 미치죠. 특히 국내 서비스처럼 복잡한 정보 구조와 다양한 사용자 시나리오를 가진 환경에서는 더욱 신중해야 합니다.
이 글에서는 Smashing Magazine의 심층 분석을 바탕으로, **모달과 페이지 전환을 선택하는 UX 결정 트리(Decision Tree)**를 소개하고, 실무에서 바로 적용할 수 있는 기준을 정리해 드립니다.
참고 자료: 원문 보기

모달의 종류: 같은 듯 다른 UI 컴포넌트
흔히 '모달'이라고 부르지만, 실제로는 여러 유형이 있습니다. 각각의 특성을 이해하는 것이 첫걸음입니다.
| 용어 | 설명 | 특징 |
|---|---|---|
| Dialog | 사용자와 시스템 간 '대화'를 위한 일반 용어 | 가장 포괄적인 개념 |
| Overlay | 페이지 위에 떠 있는 작은 콘텐츠 패널 | 배경과 상호작용 가능 |
| Modal | 사용자가 반드시 상호작용해야 하는 오버레이 | 배경 비활성화, 강제 집중 |
| Nonmodal | 사용자가 반드시 상호작용할 필요 없는 오버레이 | 배경 활성화, 자유로운 이동 |
| Lightbox | 배경을 어둡게 처리해 모달에 집중 유도 | 이미지/미디어 감상에 주로 사용 |
💡 핵심 인사이트: Anna Kaley의 연구에 따르면, 대부분의 오버레이는 잘못된 타이밍에 나타나 사용자의 중요한 작업을 방해합니다. 기본값으로는 Nonmodal을 우선 고려하는 것이 좋습니다.
// 예: React에서 Nonmodal 구현 (배경 클릭 가능)
const Nonmodal = ({ isOpen, onClose, children }) => {
if (!isOpen) return null;
return (
<div style={{
position: 'fixed', top: 0, left: 0, right: 0, bottom: 0,
display: 'flex', justifyContent: 'center', alignItems: 'center',
pointerEvents: 'none' /* 배경 이벤트 허용 */
}}>
<div style={{
background: 'white', padding: '20px', borderRadius: '8px',
boxShadow: '0 4px 12px rgba(0,0,0,0.15)',
pointerEvents: 'auto' /* 모달 내부만 클릭 가능 */
}}>
{children}
<button onClick={onClose}>닫기</button>
</div>
</div>
);
};
모달을 선택해야 하는 경우: 단일·독립 작업에 최적
모달은 사용자에게 방해가 될 수 있지만, 다음과 같은 상황에서는 오히려 강력한 도구가 됩니다.
모달이 유리한 시나리오
- 단일 작업 완료: 빠른 확인, 선택, 간단한 입력 (예: 필터 적용, 삭제 확인)
- 맥락 유지: 현재 페이지의 스크롤 위치, 입력값, 상태를 유지해야 할 때
- 돌이킬 수 없는 오류 방지: 중요 작업 전 경고 (예: "정말 삭제하시겠습니까?")
- 새 페이지 이동이 오히려 방해가 될 때: 데이터 비교 없이 빠른 액션만 필요할 때
// 예: 모달로 구현한 삭제 확인 다이얼로그
const DeleteModal = ({ isOpen, onConfirm, onCancel }) => {
if (!isOpen) return null;
return (
<div style={{
position: 'fixed', top: 0, left: 0, right: 0, bottom: 0,
background: 'rgba(0,0,0,0.5)',
display: 'flex', justifyContent: 'center', alignItems: 'center'
}}>
<div style={{ background: 'white', padding: '24px', borderRadius: '8px' }}>
<h3>게시글을 삭제하시겠습니까?</h3>
<p>이 작업은 되돌릴 수 없습니다.</p>
<button onClick={onConfirm} style={{ background: 'red', color: 'white' }}>삭제</button>
<button onClick={onCancel}>취소</button>
</div>
</div>
);
};
⚠️ 주의사항: 모달은 사용자에게 '방해'라는 비용을 지불하게 합니다. 따라서 사용자가 그 방해를 가치 있게 여길 때만 사용해야 합니다. 기본값은 Nonmodal을 추천합니다.
페이지 전환이 필요한 경우: 복잡·다단계 작업에 최적
모달 안에 위저드(Wizard)나 탭을 넣는 것은 좋지 않은 UX입니다. 특히 엔터프라이즈 제품에서는 더욱 그렇습니다.
페이지가 유리한 시나리오
- 복잡한 다단계 프로세스: 회원가입, 결제, 설정 마법사
- 데이터 참조/비교 필요: 이전 데이터를 보면서 입력해야 하는 경우
- 전체 집중 요구: 사용자의 모든 주의가 필요한 작업
- 긴 양식: 스크롤이 필요한 긴 입력 폼
// 예: React Router를 이용한 페이지 전환 (다단계 설정)
import { BrowserRouter, Routes, Route, useNavigate } from 'react-router-dom';
function SetupWizard() {
const navigate = useNavigate();
return (
<div>
<h1>서비스 설정</h1>
<button onClick={() => navigate('/setup/step1')}>시작하기</button>
<Routes>
<Route path="step1" element={<Step1 />} />
<Route path="step2" element={<Step2 />} />
<Route path="step3" element={<Step3 />} />
</Routes>
</div>
);
}
💡 드로어(Drawer)의 활용: 모달보다는 복잡하지만 전체 페이지까지는 필요 없는 서브 태스크에는 드로어가 좋은 대안입니다. 예: 설정 패널, 상세 정보 보기
반복 작업에서는 둘 다 피하라
사용자가 같은 작업을 반복해야 하는 경우, 모달과 페이지 전환 모두 불편을 줍니다. 이때는 인라인 편집(Inline Editing) 또는 **확장 가능 섹션(Expandable Section)**이 더 나은 선택입니다.
// 예: 인라인 편집으로 반복 작업 최적화
const InlineEdit = ({ value, onSave }) => {
const [isEditing, setIsEditing] = React.useState(false);
const [editValue, setEditValue] = React.useState(value);
if (!isEditing) {
return (
<span onClick={() => setIsEditing(true)} style={{ cursor: 'pointer' }}>
{value} ✏️
</span>
);
}
return (
<span>
<input
type="text"
value={editValue}
onChange={(e) => setEditValue(e.target.value)}
onBlur={() => { onSave(editValue); setIsEditing(false); }}
autoFocus
/>
</span>
);
};
UX 결정 트리: 4단계로 끝내는 선택 가이드
Ryan Neufeld가 정리한 결정 트리를 기반으로, 실무에 바로 쓸 수 있도록 간소화했습니다.
1단계: 현재 화면의 맥락(Context) 유지가 필요한가?
- 예 → 모달/오버레이 고려
- 아니오 → 페이지 전환 고려
2단계: 작업의 복잡도와 소요 시간은?
- 단순/짧음 (예: 확인, 선택) → 모달
- 복잡/김 (예: 다단계 입력) → 페이지
3단계: 배경 데이터 참조가 필요한가?
- 예 (비교, 복사 필요) → Nonmodal 또는 드로어
- 아니오 (단순 확인) → Modal
4단계: 적절한 오버레이 유형 선택
- 기본값: Nonmodal (배경 활성화)
- 강제 집중 필요: Modal
- 이미지/미디어: Lightbox
📌 국내 SI 환경에서의 적용 맥락: 국내 서비스는 종종 복잡한 메뉴 구조와 많은 데이터를 한 화면에 보여줍니다. 이런 환경에서는 모달을 남발하면 사용자가 길을 잃기 쉽습니다. 특히 관리자 페이지나 대시보드에서는 Nonmodal이나 드로어를 우선 고려하고, 정말 중요한 액션(데이터 삭제, 상태 변경)에만 Modal을 사용하는 것이 좋습니다.

모달 사용 시 피해야 할 7가지 실수
- 에러 메시지에 모달 사용 → 인라인 에러로 충분
- 기능 알림(Feature Notification)에 모달 사용 → 토스트(Toast)로 대체
- 온보딩 경험에 모달 사용 → 점진적 공개(Progressive Disclosure) 활용
- 길고 복잡한 다단계 작업에 모달 사용 → 페이지 또는 드로어 사용
- 중첩 모달(Nested Modal) → 이전/다음 버튼으로 대체
- 자동 트리거 모달 → 꼭 필요할 때만, 사용자 액션 후에
- ESC 키나 외부 클릭으로 닫을 수 없는 모달 → 항상 닫을 방법 제공
기술의 한계와 주의사항
- 접근성(Accessibility): 모달은 스크린 리더 사용자에게 혼란을 줄 수 있습니다.
role="dialog",aria-modal="true"속성과 포커스 트랩(Focus Trap)을 반드시 구현하세요. - 모바일 환경: 작은 화면에서 모달은 콘텐츠를 가리기 쉽습니다. 모바일에서는 전체 화면을 덮는 시트(Bottom Sheet)가 더 나을 수 있습니다.
- 성능: 모달 내부에 무거운 컴포넌트를 렌더링하면 페이지 성능에 영향을 줄 수 있습니다. 지연 로딩(Lazy Loading)을 고려하세요.
함께 보면 좋은 글:

마무리: UX 결정의 핵심은 '방해'의 가치
모달과 페이지 전환 중 무엇을 선택할지는 '사용자가 지불하는 방해의 비용' 과 '그 방해가 주는 가치' 의 균형에 달려 있습니다.
- 모달은 사용자를 느리게 하고, 집중을 묶으며, 실수를 방지합니다.
- 페이지는 사용자에게 자유를 주고, 복잡한 작업을 가능하게 합니다.
Therese Fessenden이 말했듯, 아무도 방해받는 것을 좋아하지 않습니다. 하지만 꼭 방해해야 한다면, 그만한 가치가 있는지 스스로에게 질문하세요.
다음 단계 학습 방향
- 사용자 테스트: 결정 트리로 선택한 후, 실제 사용자 테스트로 검증하세요.
- 접근성 감사: 모달/페이지가 WCAG 2.1 기준을 충족하는지 확인하세요.
- 패턴 라이브러리 구축: 프로젝트에 맞는 모달/페이지 패턴을 표준화하고 문서화하세요.
참고: 이 글은 Smashing Magazine의 원문을 기반으로, 국내 개발 환경에 맞게 재구성하였습니다.