Loader

페이지 데이터 로딩 인디케이터 — #1 회전 arc (확정). 전체 화면 딤 오버레이(rgba(0,0,0,.5) + backdrop-filter: blur(2px)) 위에 중앙 정렬. 색 #4F3FEC(--color-point).

확정 모션 (#1 회전 arc) 크기 64px 기준 · 오버레이에선 80px
.loader (64px · 브랜드컬러)
개발 파트 사용법 (HTML 수정 불필요) 전역 함수 두 개 — showLoader() / hideLoader(). 첫 호출 시 오버레이가 <body>에 자동 마운트되므로 페이지 HTML/템플릿 수정 없음.
// 로딩 시작
showLoader();

// 요청 종료(성공/실패 모두)에서 짝 맞춰 hide
fetch('/api/items')
  .then(...)
  .finally(hideLoader);

// 강제 리셋(예외 상황 · 페이지 이탈)
hideLoader(true);
동작 세부 · 계수 기반
  • 계수 기반 — showLoader() 호출마다 카운트 +1, hideLoader()는 -1. 카운트가 0 이 될 때만 실제로 닫힘 → 동시에 여러 요청이 로딩을 요구해도 마지막 요청 완료 시점에만 사라짐.
  • 짝 맞추기 실수 방지 — 요청이 실패해도 반드시 hide 되도록 .finally(hideLoader) 또는 try/finally 사용 권장.
  • 강제 리셋 — hideLoader(true)는 카운트를 0 으로 초기화하고 즉시 닫음(라우팅 이탈·에러 바운더리에서 사용).
  • 사용자 상호작용 차단 — 오버레이가 position: fixed; inset: 0으로 전체를 덮어 로딩 중 클릭을 막음(닫기 UI 없음 = 의도적).
  • 접근성 — 오버레이에 role="status" + aria-live="polite" + aria-label="로딩 중" 자동 부여.
적용 범위 가이드 (개발 파트 참고) 아래 상황에 showLoader() 호출 → 응답 후 hideLoader().

✅ 사용 O

  • 페이지 최초 진입 시 데이터 fetch (라우팅 · 초기 조회)
  • 목록 검색/필터 변경 → 재조회
  • 페이지네이션 이동
  • 저장 · 삭제 · 상태변경 후 재조회
  • 모달 안 데이터 로드(대용량이거나 눈에 띄게 지연되는 경우)
  • 엑셀 다운로드 · 파일 요청 등 서버 처리 대기 액션

❌ 사용 X

  • 버튼 클릭 후 즉시 응답이 오는 짧은 액션(체감 200ms 미만) — 오히려 깜빡거려서 UX 저하
  • 단순 UI 상태 토글(모달 열기/닫기, 탭 전환 등 데이터 요청 아님)
  • 버튼 내부의 마이크로 로딩(예: 저장 버튼 안 스피너) — 별도 컴포넌트가 필요하면 요청 요망