일상이 개발
React 토스트/스낵바 UX 가이드: 실시간 피드백 제대로 설계하는 방법
디어노미
2025. 4. 6. 18:51
반응형
🔔 React 토스트/알림/스낵바 시스템 제대로 설계하기
사용자가 어떤 행동을 했을 때,
앱이 아무런 반응도 주지 않는다면 어떻게 느껴질까요?
"클릭했는데 저장이 된 거야?"
"오류가 났다는데 왜 알려주지 않지?"
"작업이 성공했는지 실패했는지 모르겠어"
이런 상황은 대부분 알림(feedback)이 부족해서 생깁니다.
그중에서도 실시간 피드백 UI로 많이 쓰이는 게 바로 토스트(Toast), 알림(Alert), 스낵바(Snackbar)입니다.
이번 글에서는 React 앱에서 토스트/알림 시스템을 어떻게 UX 좋게 설계할 수 있는지
그리고 어떤 라이브러리를 쓰면 유지보수와 사용성이 좋은지 자세히 살펴볼게요.
1. 토스트(Toast)란?
토스트는 보통 화면 한쪽에서 짧게 떠올랐다 사라지는
작고 가벼운 메시지 박스를 말합니다.
✅ 특징
- 페이지 전환 없이 사용자에게 피드백 제공
- 몇 초 후 자동으로 사라짐
- 여러 개가 쌓일 수 있음
- 보통 우측 하단/상단, 모바일은 중앙 or 하단에 표시
예시 상황
- 저장이 완료되었습니다 ✅
- 오류가 발생했습니다 ❌
- 복사되었습니다 📋
2. Alert, Snackbar와 뭐가 다를까?
용어 | 설명 |
---|---|
Toast | 자동 사라지는 짧은 메시지, 주로 상태 피드백 |
Snackbar | 머터리얼 디자인에서 사용되는 Toast의 일종 (하단 위치 + undo 버튼 포함) |
Alert/Dialog | 사용자 확인이 필요한 메시지 (닫기, 확인 버튼 필요) |
요약하자면:
✅ 단순 피드백 → Toast/Snackbar
❗ 확인이 필요한 경고 → Alert/Dialog
3. 언제 토스트를 쓰는 게 좋을까?
- 저장, 수정, 삭제 등의 성공/실패 결과
- 비동기 요청 완료 시 결과 전달
- 클립보드 복사, 다운로드 시작 등 사용자 액션 피드백
- Form 제출 실패 (전역 알림)
- 에러/성공 메시지 팝업 없이 자연스럽게 전달
📌 한 번에 1~2개 정도만 표시하는 것이 가장 좋습니다.
4. React에서 토스트 시스템 만들기
① 직접 구현하기
const [toasts, setToasts] = useState([]);
const addToast = (message) => {
const id = Date.now();
setToasts((prev) => [...prev, { id, message }]);
setTimeout(() => {
setToasts((prev) => prev.filter((t) => t.id !== id));
}, 3000);
};
<div className="toast-container">
{toasts.map((toast) => (
<div key={toast.id} className="toast">
{toast.message}
</div>
))}
</div>
✅ 장점: 커스터마이징 자유로움
❌ 단점: 위치 제어, 중복 방지 등 직접 구현 필요
② 추천 라이브러리
✅ react-toastify
npm install react-toastify
import { toast, ToastContainer } from 'react-toastify';
import 'react-toastify/dist/ReactToastify.css';
toast.success("저장되었습니다!");
toast.error("저장 실패 😢");
<ToastContainer position="top-right" autoClose={3000} />
✅ notistack (MUI 기반)
npm install notistack
import { useSnackbar } from 'notistack';
const { enqueueSnackbar } = useSnackbar();
enqueueSnackbar("저장 완료!", { variant: "success" });
enqueueSnackbar("오류 발생", { variant: "error" });
<SnackbarProvider maxSnack={3} anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }} />
✅ react-hot-toast
npm install react-hot-toast
import toast from 'react-hot-toast';
toast.success("성공!");
toast.error("에러가 발생했습니다");
<Toaster position="bottom-center" reverseOrder={false} />
5. 좋은 토스트 UX를 위한 설계 팁
✅ 메시지는 짧고 직관적으로
- 저장되었습니다.
- 로그인이 완료되었습니다.
- 복사 완료
❌ 너무 길면 읽기도 전에 사라집니다.
✅ 아이콘/색상으로 유형 구분
유형 | 색상 | 예시 |
---|---|---|
성공 | 초록색 | ✅ 저장 성공 |
실패 | 빨간색 | ❌ 서버 오류 발생 |
경고 | 주황색 | ⚠️ 필수 항목 누락 |
정보 | 파란색 | ℹ️ 업로드 시작 |
✅ 중복 방지 / 큐 관리
if (!toast.isActive("save-success")) {
toast("저장 완료!", { toastId: "save-success" });
}
✅ 위치는 사용자 입력을 가리지 않게
- 데스크탑: 우측 상단 / 하단
- 모바일: 화면 하단 or 중앙
- Form 위와 겹치지 않게 조정
✅ UX 플로우와 함께 구성
- 버튼 클릭 → 토스트로 성공 피드백
- API 요청 실패 → 스낵바로 에러 메시지
- 페이지 진입 시 welcome 알림
✅ 마무리 정리
토스트/알림은 단순한 메시지 출력이 아닙니다.
사용자의 행동에 대한 즉각적인 피드백을 통해
앱의 신뢰도와 몰입도를 높이는 중요한 도구입니다.
✔ 오늘의 요약
- 토스트는 가벼운 피드백 메시지 → 자동 사라짐
- Alert/Dialog는 사용자 응답이 필요한 경우에 사용
- 라이브러리: react-toastify, notistack, hot-toast 등 적극 활용
- UX는 짧고 명확한 메시지 + 위치 + 중복 방지
- 핵심 인터랙션에 자연스럽게 녹여낼 것
“유저가 뭔가를 했을 때,
앱이 즉각적으로 대답해주는 것.”
그게 진짜 UX입니다 😌
반응형