15줄에서 2줄로: useSyncExternalStore 기반 React Toast 시스템 설계법

ant·2025년 6월 29일

react-component

목록 보기
1/3
post-thumbnail

[React Component] 15줄의 코드를 2줄로: useSyncExternalStore로 설계하는 Toast 시스템

프론트엔드 개발자라면 누구나 한 번쯤 만들어보는 Toast UI.
하지만 막상 구현하다 보면 "이걸 앱 어디서든 어떻게 띄우지?", "Context Provider로 꼭 감싸야 하나?" 같은 고민에 빠지게 됩니다.

📉 Before: 15줄의 상태 관리 지옥
기존에는 컴포넌트마다 useState, useEffect를 선언하고, 타이머를 관리하고, Props로 상태를 내려주는 복잡한 과정을 거쳐야
했습니다.

🚀 After: 단 2줄로 끝나는 혁신
Mantine의 내부 구현을 분석하여 얻은 인사이트를 바탕으로, useSyncExternalStore를 활용한 새로운 아키텍처를 소개합니다.

  • Zero State: 컴포넌트 내부에서 상태 관리 코드를 완전히 제거했습니다.

  • Global Access: 앱 어디서든, 어떤 깊이에서든 toasts.show() 한 줄이면 충분합니다.

  • Type Safe: 타입스크립트로 설계되어 컴파일 타임에 오류를 방지합니다.

    🏗️ 3-Layer 아키텍처의 힘
    단순히 Toast를 만드는 것을 넘어, Store - Business - UI 계층을 분리하여 유지보수성과 확장성을 극대화한 설계 패턴을
    공유합니다. 이 패턴은 모달, 알림 센터 등 전역 상태가 필요한 모든 곳에 적용 가능합니다.


    React 18의 기능을 100% 활용한 우아한 설계를 경험하고 싶다면?
    👉 [전체 읽기: 15줄에서 2줄로: useSyncExternalStore 기반 React Toast 시스템 설계법]
    🔗 https://blog.sangwook.dev/posts/react-component-toast (https://blog.sangwook.dev/posts/react-component-toast)

10개의 댓글

comment-user-thumbnail
2025년 6월 29일

좋은 글 감사합니다~

1개의 답글
comment-user-thumbnail
2025년 6월 30일

단순히 상태를 전역에서 관리하는 게 아니라, 실제 UI 상황을 고려해 큐잉과 TTL 관리까지 포함된 점 잘 보았습니다!
사내에서 전역 모달 시스템을 설계해보았던 경험이 있는데, useSyncExternalStore 기반의 useStore 브릿지 추상화로 React 의존도를 최소한 부분은 낯설지만 좋은 방식이라 고려해볼 것 같아요~

1개의 답글
comment-user-thumbnail
2025년 6월 30일

최근에 zustand 라이브러리를 분석했는데, 거기서도 useSyncExternalStore를 사용하더라구요! 덕분에 재밌게 읽었습니다 :)

1개의 답글
comment-user-thumbnail
2025년 6월 30일

useSyncExternalStore라는 내용을 처음 알게되었는데 토스트 말고도 다른 곳에도 적절하게 사용할 수 있을 것 같다는 생각이 듭니다! 좋은 글 잘 읽었습니다~b

1개의 답글
comment-user-thumbnail
2025년 7월 1일

useSyncExternalStore 훅을 오늘 처음알게되어서 고전(?) 훅외에도 react 기능을 좀 더 공부해야겠다는 생각이 드네요 좋은 글 감사합니다~

1개의 답글