파괴적 행동
삭제와 손실 위험을 대상, 영향, 대안과 복구 가능성으로 설명합니다.
목표
삭제, 연결 해제, 공개 중단처럼 손실이나 운영 영향이 있는 행동을 사용자가 결과를 이해한 상태에서 실행하게 한다. 마찰을 무조건 늘리지 않고 위험도, 되돌릴 수 있는지, 영향 범위에 비례해 보호한다.
위험 분류
낮은 위험
- 즉시 되돌릴 수 있음
- 개인 보기나 임시 상태만 변경
- 영향 범위가 작고 명확함
직접 실행하고 toast에서 실행 취소를 제공할 수 있다.
중간 위험
- 복구할 수 있지만 별도 절차가 필요함
- 다른 사용자에게 보이는 상태가 변경됨
- 진행 중 작업이나 설정을 잃을 수 있음
ConfirmActionDialog로 대상과 결과를 확인한다.
높은 위험
- 영구 삭제 또는 법적·운영 기록 영향
- 대량 대상, 권한, 결제, 외부 발송에 영향
- 복구 불가능하거나 비용이 큼
별도 검토 화면, 영향 요약, 명시적 확인과 필요한 경우 재인증을 사용한다. 긴 식별자 재입력은 다른 안전장치가 충분하지 않을 때만 검토한다.
행동 진입점
- 일상적인 주 행동과 destructive 행동을 시각적으로 분리한다.
- row menu 안에서도
삭제가 기본 선택이나 첫 항목처럼 보이지 않게 한다. - 아이콘만 사용하지 말고 menu나 dialog에서 대상이 드러나는 레이블을 제공한다.
- 권한이 없으면 행동을 숨길지 disabled로 설명할지 사용자의 기대를 기준으로 결정한다.
- destructive 행동이 유일한 문제 해결 경로가 되지 않게 archive, disable, disconnect 같은 안전한 대안을 검토한다.
확인 내용
확인 화면은 다음을 답한다.
- 어떤 대상인가?
- 무엇이 즉시 바뀌는가?
- 다른 사람이나 자동화에 어떤 영향이 있는가?
- 되돌릴 수 있는가?
- 유지되는 데이터는 무엇인가?
- 실행 후 어디에서 결과를 확인하는가?
title과 confirm label 모두 실제 행동을 말한다. 정말 진행할까요?, 확인만으로 끝내지 않는다.
실행과 상태
- pending 동안 중복 실행과 dialog 닫기를 막는다.
- 요청 성공과 실제 비동기 삭제 완료를 구분한다.
- 실패하면 dialog 또는 현재 맥락을 유지하고 재시도 방법을 제공한다.
- 일부 대상만 실패한 bulk action은 성공·실패 수와 실패 대상을 분리한다.
- audit이 필요한 행동은 누가, 언제, 무엇을 실행했는지 제품 기록으로 남긴다.
- 실행 취소가 있으면 실제 복구 가능 시간과 범위를 정확히 반영한다.
좁은 화면
- 대상명, 영향과 행동이 한 화면에 들어오지 않으면 내부 scroll이 가능한 dialog 또는 별도 검토 route를 사용한다.
- button label을 잘라내지 않는다.
- 대량 대상 목록을 작은 dialog에 모두 넣지 말고 요약과 상세 확인 경로를 제공한다.
- 취소와 destructive 행동의 DOM·시각 순서를 일관되게 유지한다.
접근성
ConfirmActionDialog의 title과 description 관계를 사용한다.- destructive tone만으로 위험을 전달하지 않는다.
- dialog가 닫힌 뒤 삭제된 trigger가 없으면 안전한 heading 또는 다음 row로 focus를 보낸다.
- pending과 결과를 status/live region으로 알린다.
- keyboard 사용자가 Enter를 반복해 중복 실행하지 않게 한다.
- type-to-confirm을 사용한다면 paste를 막지 않고 label, 설명, 오류를 field와 연결한다.
예제
<ConfirmActionDialog
open={open}
title="선택한 커리큘럼 3개를 삭제할까요?"
description="운영과 예약 발송이 중단되고 목록에서 사라져요. 삭제한 항목은 복구할 수 없어요."
confirmLabel="커리큘럼 3개 삭제"
pendingLabel="삭제 중…"
tone="destructive"
isPending={pending}
returnFocusRef={listHeadingRef}
onOpenChange={setOpen}
onConfirm={removeSelected}
/>낮은 위험의 되돌릴 수 있는 예:
목록에서 항목 제거 → “목록에서 제거했어요” toast → “실행 취소”피해야 할 사용
- 모든 삭제를 같은 위험도로 처리
- 파괴 행동이 아닌 상태 변경에 destructive tone 사용
- dialog에 대상이나 복구 가능 여부 생략
확인처럼 결과를 알 수 없는 confirm label- pending 중 dialog를 닫거나 중복 실행 허용
- 실패했는데 성공 toast를 먼저 표시
- 사용자를 겁주거나 죄책감을 주는 문구
- 안전장치 없이 bulk destructive 행동 즉시 실행
검토 체크
- 위험도와 되돌릴 수 있는지를 분류했다.
- 제거·보관·비활성화 같은 더 안전한 대안을 검토했다.
- 대상, 영향 범위, 유지되는 것, 복구 가능성을 설명한다.
- confirm label이 대상과 결과를 말한다.
- pending 중 중복 실행과 닫기를 막는다.
- 부분 실패와 비동기 완료 상태가 정의돼 있다.
- 실행 후 focus 목적지가 안전하다.
- 색상 없이도 위험을 이해할 수 있다.
- 대량·고위험 행동에는 추가 검토 단계가 있다.