저장 중에 내용을 더 고쳤는데, “저장됐어요”라고 떠도 될까?
저장 버튼을 누른 뒤 문장을 하나 더 고쳤어. 잠시 후 “저장됐어요”가 뜨길래 창을 닫았는데, 마지막 문장은 없어. 가상 행사 소개글 편집기로 이 문제를 풀어볼게. 나는 자동저장부터 붙이기보다 어떤 내용이 저장됐는지 구분하고, 그 상태가 문구·이탈·다른 탭의 변경까지 이어지게 설계할 거야.
버튼 반응을 빠르게 만드는 일이 아니야
요청이 “저장 표시가 늦으니 바로 보여줘”라면 먼저 무엇을 해결하려는지 다시 적어. 클릭했다는 반응을 빠르게 주는 것과 내용을 안전하게 보관했다는 안내는 다른 약속이야. 이번 목적은 사용자가 현재 입력을 잃지 않으려면 무엇을 해야 하는지 알게 하는 거야. 표시 속도만 줄이면 잘못된 안심을 더 빨리 줄 수 있어.
재현 조건은 시간을 붙여 고정해. 10:00에는 이전 내용이 서버에 있어. 10:01 첫 수정안을 저장하고, 10:01:01 응답을 기다리며 두 번째 수정안을 입력해. 10:01:02 도착한 응답은 첫 수정안에 대한 거야. 서버에 첫 수정안만 반영됐다면 화면에는 “저장하지 않은 변경이 있어요”가 남아야 해. 제목·본문만 다루고 첨부파일과 게시 승인은 이번 범위에서 뺄게.
화면 캡처 한 장으로는 어디서 어긋났는지 몰라
개발에게 성공 토스트 화면만 전달하지 않아. 저장을 누를 때의 입력, 실제 보낸 내용, 서버가 반영한 내용, 응답 뒤 화면에 남은 입력을 같은 순서로 확인해. 서버에 정상 반영됐는데도 응답이 끊겼을 수 있으니 화면 문구와 저장 기록을 따로 봐야 해. 재현에는 가상 문장 두 개면 충분해. 고객 본문을 그대로 로그에 모으는 방식으로 조사하지 않을 거야.
저장 경로도 같이 적어. 현재 화면 외에 다른 탭이나 관리 도구가 같은 문서를 바꿀 수 있는지 확인해. 누가 어떤 경로로 수정하느냐에 따라 이 화면에서 요청 순서만 맞추면 되는지, 서버의 다른 변경까지 보호해야 하는지가 달라져. 아직 모르는 API나 DB 필드를 내가 만들어 넣지 않고 개발 확인 항목으로 남겨.
같은 재현 순서에서 관찰한 사실과 아직 확인할 내용을 나눠 적어.
| 볼 자료 | 확인할 질문 | 설계에 남길 내용 |
|---|---|---|
| 클릭 전후 입력 | 요청에 어느 시점의 내용이 들어갔나 | 보낸 입력본과 현재 입력 구분 |
| 서버 저장 결과 | 응답을 못 받아도 반영됐을 수 있나 | 반영 확인 방법과 미확인 상태 |
| 다른 탭·관리 도구 | 같은 문서를 바꾸는 경로가 있는가 | 모든 쓰기 경로의 버전 확인 |
| 이탈·재접속 | 새로 열었을 때 무엇을 복원하나 | 서버 저장본과 현재 탭 입력의 범위 |
자동저장을 붙이기 전에 저장의 뜻부터 맞춰
처음 떠올리기 쉬운 안은 클릭하자마자 저장됐다고 보여주거나 자동저장을 붙이는 거야. 하지만 자동저장도 응답을 기다리는 동안 내용이 바뀌면 같은 판단이 필요해. 이 작은 편집기의 첫 범위에서는 명시적 임시저장과 상태 구분을 먼저 선택할 거야. 저장을 누르지 않은 내용을 기기가 종료된 뒤에도 복구한다는 요구가 생기면 자동저장·보관 범위를 별도 안건으로 확장해야 해.
MDN의 If-Match 설명을 보면, 읽었던 서버 버전과 지금 버전이 같은지 조건을 걸어 다른 변경을 덮는 일을 막을 수 있어. 이 자료를 보고 설계에 한 줄을 더 넣어. 화면끼리 순서만 맞추지 말고 서버에서도 버전 확인과 변경을 한 번의 일관된 처리로 묶는 거야. 특정 헤더 사용 여부는 개발이 정하되 모든 수정 경로가 같은 보호 규칙을 지켜야 해.
저장 빈도와 저장 확인의 정확성을 같은 문제로 묶지 않아.
| 안 | 얻는 것 | 이번 판단 |
|---|---|---|
| 클릭 즉시 저장됨 | 빠른 반응 | 반영 전 성공 표시라 제외 |
| 자동저장만 추가 | 저장 버튼 부담 감소 | 응답·충돌 문제는 남음. 후속 범위 |
| 명시적 저장 + 입력본 확인 + 조건부 변경 | 상태와 충돌 근거를 확인 가능 | 이번 선택. 저장하지 않은 입력의 종료 후 복구는 보장하지 않음 |
응답이 왔다는 사실과 지금 내용이 저장됐다는 사실은 달라
저장을 누르면 보낼 제목과 본문을 고정해. 같은 탭에서 그 요청을 기다리는 동안 다음 저장은 겹쳐 보내지 않되 입력은 계속할 수 있어. 진행 중에는 “저장 중이에요”를 보여주고, 추가 입력이 생기면 이번 요청에 포함되지 않았다는 사실도 알려줘. 문서 식별과 현재 편집 화면의 요청을 대조해서 다른 문서나 이전 화면의 응답이 끼어들지 않게 해.
현재 요청의 서버 반영을 확인한 뒤에는 지금 입력이 확인된 입력본과 같은지 비교해. 같을 때만 “저장됐어요”로 바꿔. 두 번째 수정안이 남아 있다면 첫 수정안의 저장 사실은 기록하되 화면은 미저장으로 둬. 첫 저장으로 바뀐 서버 버전은 다음 저장의 기준이 될 수 있어도, 그것만으로 두 번째 수정안까지 저장됐다는 뜻은 아니야. 사용자가 다시 저장한 내용의 확인까지 받아야 해.
저장 시각도 버튼을 누른 기기 시각을 그대로 쓰지 않아. 개발이 반환하는 확정 시각의 의미와 표시 시간대를 맞추고, 그 시각이 어떤 입력본에 대한 것인지 남겨. 여기서 저장됨은 확인 시점의 이 화면 입력이 반영됐다는 뜻이야. 다른 사용자가 그 뒤에 바꾸지 못한다는 약속은 아니야.
현재 문서·현재 편집 화면의 요청이 서버에 반영됐다고 확인한 다음에만 이 분기로 들어가.
흐름을 글로 보기
- 현재 입력과 확인된 입력본이 같나?
- 예: 저장됨으로 표시 → 확인한 입력본·서버 버전과 다음 행동을 기록
- 아니오: 저장하지 않은 변경 있음으로 표시 → 확인한 입력본·서버 버전과 다음 행동을 기록
실패와 미확인을 같은 재시도 버튼으로 묶지 마
서버가 입력 오류로 거절했다면 그 항목을 고치면 돼. 그런데 응답 시간초과는 저장이 안 됐다는 증거가 아니야. 이때는 “저장 결과를 확인하지 못했어요”라고 안내하고 현재 입력을 유지해. 해당 요청의 반영 근거와 최신 서버본을 확인할 수 있는지 개발에게 물어봐. 최신 본문을 한 번 읽었다고 이전 요청이 끝났다고 단정하지는 않아. 아직 처리 중일 수 있기 때문이야.
확인된 저장본과 현재 입력이 같으면 저장 상태를 회복할 수 있어. 기존 요청이 끝났고 반영되지 않았다는 근거가 있으면 현재 입력으로 다시 저장할 수 있어. 근거가 없으면 미확인으로 남겨. 최신 서버본이 달라졌을 때는 내 입력을 지우지 않은 채 비교하고, 적용할 내용을 사람이 확인한 뒤 새 버전 기준으로 저장해. 그 사이 다른 탭이 또 고쳤다면 다시 비교해야 해. 무조건 덮어쓰기로 막힌 상태를 풀지 않을 거야.
실제 서버를 호출하지 않는 고정 상황 예제야. 안내와 남겨야 할 입력을 같이 확인해.
자료 열어 보기
첫 수정안 성공 응답을 받아도 두 번째 수정안은 남겨. 앞 요청은 끝났으므로 현재 내용을 다시 저장할 수 있어.
현재 입력은 유지해. 반영 상태 확인을 제공하고, 완료/미반영의 근거 없이 자동으로 성공·실패를 정하지 않아.
서버 버전 조건이 맞지 않아 저장을 멈춰. 내 입력과 최신 서버본을 비교하고 적용할 내용을 확인한 뒤 다시 저장해.
거절된 항목과 고칠 조건을 연결해. 제목과 본문을 지우거나 처음 화면으로 보내지 않아.
창을 닫을 때 경고하면 끝나는 것도 아니야
앱 안에서 목록이나 다른 문서로 이동할 때는 미저장·저장 중·미확인·충돌 상태를 확인해. 머물기와 이동하기를 구분하고, 저장하고 이동하기를 제공한다면 결과가 확인되기 전에는 이동시키지 않아. 결과가 불명확하거나 충돌이면 입력 화면에 남겨야 해. 저장된 초안과 실제 게시물도 구분해서 임시저장이 공개 게시로 이어지지 않게 해.
저장하고 이동하기에도 같은 입력본 확인을 적용해. 이동 직전에 현재 입력이 서버에서 확인한 저장본과 같은지 다시 검사하고, 같을 때만 이동해. 저장을 누른 뒤 내용을 더 고쳤다면 첫 요청이 성공해도 “저장하지 않은 변경이 있어요”를 남기고 이동하지 않아. 추가 입력을 유지한 채 사용자가 다시 저장하고 이동을 선택하도록 해. 다시 저장하는 동안 또 고치면 같은 조건으로 다시 머물러. 내용 버리기를 명시적으로 선택한 경우는 별도 이탈 행동으로 구분해.
MDN은 beforeunload가 모바일 앱 전환 뒤 종료 같은 상황에서 실행되지 않을 수 있다고 설명해. 그래서 브라우저 이탈 경고는 보조 장치야. 이 예제에서는 입력을 기기에 영구 보관하지 않으므로 강제 종료 전 미저장 내용까지 복구한다고 안내하지 않아. 로컬 보관을 추가한다면 공동 기기, 민감 정보, 보관 기간과 삭제 조건부터 확인해야 해.
상태 문구는 잠깐 뜨는 색깔 점만으로 끝내지 않을 거야. W3C의 상태 메시지 안내처럼 초점을 빼앗지 않아도 보조 기술이 변경을 알 수 있게 개발에 요구해. 저장 때마다 커서를 버튼으로 옮기거나 글자를 입력할 때마다 전체 상태를 반복 낭독하게 만들지는 않아. 최종 지원 브라우저와 보조 기술 조합은 QA에서 확인해.
AI에는 빠진 시간 순서를 찾아달라고 해
내가 AI에 맡길 부분은 자동저장 기능 이름을 많이 뽑는 일이 아니야. 확정한 범위와 재현 순서를 주고, 어떤 사건이 끼면 현재 설계가 틀려지는지 찾아보게 할 거야. 아래는 그때 쓸 질문 예시야. 답을 받으면 상태 설계서에 없는 조건을 먼저 찾고 조사표의 실제 저장 경로와 대조해.
예를 들어 “성공 응답이면 미저장 표시를 모두 지우자”는 제안이 나온다면 추가 입력 조건이 빠졌어. “첫 응답을 기다리는 동안 바뀐 본문은 남기고 안내를 다시 써줘”라고 수정할 거야. “이탈 경고로 손실을 막는다”는 제안에는 모바일 종료 반례를 주고 보장 범위를 고치게 해. 둘 다 실제 받은 답변이 아니라 검토할 때 쓰는 가정형 예시야. 채택 기록에는 빠진 조건, 수정 문장, 확인할 담당자를 남겨.
회사 문서 대신 자기 서비스의 공개 가능한 가상 조건으로 바꿔 써.
가상 행사 소개글 편집기의 임시저장 설계를 검토해줘. 확정 조건: 제목과 본문만 다룸. 저장 중 입력은 가능하지만 같은 탭에서 다음 저장 요청을 겹쳐 보내지 않음. 모든 저장 경로는 읽었던 서버 버전과 현재 서버 버전을 비교해서 변경 여부를 결정함. 재현: 10:01 첫 수정안을 저장 요청 → 10:01:01 두 번째 수정안 입력 → 10:01:02 첫 수정안 성공 응답. 이때 현재 화면 전체를 저장됨으로 표시하면 안 됨. 맡길 범위: 추가 입력, 다른 탭 변경, 응답 유실, 다른 문서 이동, 로그인 만료에서 빠진 상태와 문구를 찾아줘. 실제 API 주소·DB 필드·미확인 저장 정책은 만들지 마. 구분: 확정된 거절 / 결과를 아직 모름 / 서버 버전 충돌. 이탈 경고는 보조 수단이고 모바일 앱 종료에서 항상 실행되지 않음. 출력: 빠진 조건 / 화면에 남길 입력과 안내 / 허용 행동 / 담당자가 확인할 자료 / 재현 순서와 기대 결과. 가정이 필요한 부분은 확정 조건과 나눠줘.
QA에는 클릭 횟수보다 사건의 순서를 넘겨
“저장 버튼 동작 확인” 한 줄로 넘기면 첫 번째 정상 응답만 보고 통과하기 쉬워. QA에는 요청을 멈추고, 입력을 바꾸고, 응답을 돌려주는 순서까지 줘. 두 탭은 같은 서버본을 읽은 상태에서 시작해 한쪽이 먼저 저장하도록 해. 네트워크가 끊긴 조건은 반영 전 차단과 반영 뒤 응답 유실을 나눠야 해.
기대 결과와 실제 결과는 따로 채워. 아래 표는 설계 기준이고 실제 편집 서버에서 통과한 결과가 아니야. 개발의 버전 비교가 모든 쓰기 경로에 적용되는지, 화면에서 최신 입력이 유지되는지, 다시 열었을 때 확인한 저장본이 보이는지 함께 봐. 화면 캡처만으로 서버 반영까지 증명했다고 끝내지 않아.
요청 내용·서버 결과·현재 입력·안내를 한 세트로 대조해.
| 재현 순서 | 기대 결과 | 확인 자료 |
|---|---|---|
| 첫 수정안 저장 → 입력 변화 없음 → 성공 | 현재 입력 저장됨 | 보낸 내용과 반영 확인 |
| 첫 수정안 저장 → 두 번째 수정안 입력 → 첫 성공 | 두 번째 수정안 유지, 미저장 | 요청·입력·응답 순서 |
| 다른 문서로 이동 → 이전 문서 성공 응답 | 현재 문서 상태 불변 | 문서·화면 요청 대조 |
| 서버 반영 뒤 응답 유실 | 미확인 후 근거 조회; 실패 단정 금지 | 반영 기록과 응답 유실 |
| 요청 처리 중 상태 조회 | 조회를 요청 종료 증거로 삼지 않음 | 처리 상태·확정 근거 |
| 두 탭 같은 본문 열기 → 다른 탭 먼저 저장 | 후속 구버전 저장 거절, 내 입력 보존 | 조건부 변경 결과 |
| 충돌 비교 중 다른 탭이 다시 저장 | 새 조건 불일치면 다시 비교 | 비교 시점·재저장 조건 |
| 제목 오류로 확정 거절 | 입력 유지, 해당 오류 수정 | 거절 조건과 입력값 |
| 미확인 상태에서 저장하고 이동 | 결과 확인 전 이동 안 함 | 이동 조건과 상태 |
| 저장하고 이동 → 추가 입력 → 첫 요청 성공 | 이동하지 않음. 추가 입력 유지·미저장 안내, 다시 저장하고 이동 선택 | 이동 직전 현재 입력·확인된 저장본 비교 |
| 모바일에서 앱 종료 | 경고·미저장 복구를 보장하지 않음 | 지원 환경별 관찰 기록 |
문구만 넘기지 말고 저장 조건을 같이 넘겨
기획서에는 왜 바꾸는지, 저장의 범위가 어디까지인지, 자동저장을 이번에 넣지 않은 이유를 적어. 설계서에는 각 상태의 문구·입력 보존·버튼·이동 조건을 붙여. 개발이 저장 반영 조회를 제공할 수 없는 구간은 미확인 복구가 남은 조건으로 표시하고, QA와 운영 문서도 같은 한계를 쓰게 해. 확인되지 않은 복구를 고객 안내에서 먼저 약속하면 안 돼.
출시 후에는 저장 성공 건수만 보지 않을 거야. 오래된 응답으로 잘못된 성공이 표시되는 재현, 충돌 뒤 입력을 잃는 문의, 미확인 상태가 해소되는지와 해소까지 걸린 시간을 나눠 보자. 자동저장 확대는 이 근거와 손실 허용 범위를 보고 다시 정해. 로그에는 필요한 요청 참조와 처리 결과를 남기되 본문 자체를 기본 수집값으로 넣지 않아.
자기 서비스의 저장 경로·확정 근거·지원 환경과 담당자를 채워 써.
안건: 행사 소개글 임시저장 확인 현상: 첫 수정안을 저장하는 동안 내용을 더 고쳤는데, 첫 응답으로 현재 화면 전체가 저장됐다고 표시된다. 목적: 저장된 입력본과 화면의 최신 입력을 구분해 이탈 판단을 돕고 다른 탭의 변경을 조용히 덮지 않는다. 범위: 가상 편집기의 제목·본문, 명시적 임시저장. 첨부파일·게시 승인·실시간 공동편집·기기 영구 임시보관은 제외한다. 선택: 저장 클릭 시 보낼 내용을 고정한다. 같은 탭에서는 한 번에 한 요청만 보내고 입력은 허용한다. 앞 요청의 결과 확인 전 다음 저장을 겹쳐 보내지 않는다. 성공 표시: 현재 문서와 현재 편집 화면에서 보낸 요청의 서버 반영 확인을 받고, 현재 입력이 확인된 입력본과 같을 때만 저장됨. 뒤에 추가한 내용이 있으면 저장하지 않은 변경 있음. 다른 문서·이전 화면의 응답은 무시한다. 버전: 개발은 읽은 서버 버전과의 일치 확인 및 저장을 원자적으로 처리한다. 다른 탭·관리 도구를 포함한 모든 쓰기 경로에 같은 조건을 적용한다. 이전 입력의 저장이 확인되면 그 새 서버 버전은 다음 요청의 기준이 되지만 최신 입력까지 저장됐다고 처리하지 않는다. 불명·실패: 시간초과만으로 저장 실패라고 단정하지 않는다. 현재 입력을 유지하고 해당 요청의 반영 여부와 최신 서버본을 조회한다. 조회만으로 기존 요청이 끝났다고 단정하지 않는다. 증거가 없으면 미확인 상태를 유지한다. 확인된 거절은 사유별로 안내하고 오류 입력을 고칠 수 있게 한다. 충돌: 내 입력을 덮어쓰지 않은 채 최신 서버본과 비교한다. 사용자가 적용할 내용을 확인한 뒤 새 버전 기준으로 저장한다. 그 사이 다시 변경되면 다시 비교한다. 무조건 덮어쓰기 버튼은 제공하지 않는다. 이탈·접근성: 미저장·저장 중·미확인·충돌 상태에서 앱 내부 이동은 확인한다. 브라우저 이탈 경고는 보조이며 강제 종료 보호를 약속하지 않는다. 저장 상태를 색만으로 알리지 않고 보조 기술이 읽을 수 있게 제공한다. 역할: 기획은 상태·문구·범위 결정, 개발은 저장 경로·버전 검사·반영 조회 근거 확인, QA는 지연/유실/경쟁 순서를 재현, 운영은 이용자 문의에 확정 저장본과 미확인을 구분해 안내한다. 출시 증거: 저장 경로 조사표, 상태 설계서, 결정 기록, 순서별 QA 결과, 지원 브라우저/보조 기술 확인, 운영 인계. 로그에는 필요한 요청 참조·시각·결과를 남기며 본문을 무조건 수집하지 않는다. 완료 한계: 이 예제는 설계와 검수 기준이다. 실제 저장 서버의 통합 검수 결과는 별도로 채운다. 저장됨은 확인 시점의 이 화면 입력 반영을 뜻하며 다른 사용자의 이후 변경을 막았다는 뜻은 아니다. 저장하고 이동: 이동 직전에 현재 문서·편집 화면의 최신 입력과 서버에서 확인한 저장본이 같은지 다시 검사한다. 저장 요청 뒤 추가 입력이 있으면 첫 성공에도 이동하지 않고 입력을 유지한다. 사용자가 다시 저장하고 이동을 선택해 최신 입력 확인까지 받아야 한다. 다시 저장 중 고치면 다시 머문다. 명시적 내용 버리기는 별도 행동이다.
출처와 예제 조건
2026-09-27 확인한 MDN과 W3C 공개 문서를 바탕으로 만든 가상 행사 소개글 편집기 설계야. 시각·입력본·저장 범위는 예제 조건이고 회사 데이터나 진명의 실제 경험·성과를 사용하지 않았어. AI 질문과 답변 가정은 실행 기록이 아닌 예시야. 문서 조건과 시각 자료의 검수는 실제 저장 서버·보조 기술 통합 검수와 구분해. 영어·중국어는 같은 한국어 안건의 현지화야.