본문 바로가기
일상이 개발

React 토스트/스낵바 UX 가이드: 실시간 피드백 제대로 설계하는 방법

by 디어노미 2025. 4. 6.
반응형

🔔 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입니다 😌
반응형