실무에 바로 적용할 수 있는 웹 제작 꿀팁 및 유용한 자료실 공간입니다.
나눔웹이 제공하는 핵심 노하우와 마케팅 인사이트를 자유롭게 활용해 보십시오.

나눔웹 UI/UX 꿀팁

문의 폼 중복 접수 막는 법, 전송 버튼 연타와 새로고침 재전송 정리

문의 폼 중복 접수는 대부분 두 가지에서 생깁니다. 전송이 늦을 때 버튼을 여러 번 누르는 경우와, 전송 직후 새로고침을 눌러 같은 내용이 다시 넘어가는 경우입니다.
버튼 잠금은 화면에서, 재전송 방지는 서버에서 처리해야 깔끔하게 끝납니다. 실제 고객사 사이트에 적용하는 순서대로 정리했습니다.

💡 중복 접수가 그렇게 큰 문제인가요?

상담 신청이 같은 내용으로 두세 건씩 들어오면 담당자가 일일이 확인해야 하고, 알림 문자나 메일도 그만큼 나갑니다. 결제나 예약 폼이라면 실제 금액과 일정이 꼬일 수 있습니다. 리뉴얼 상담 때 "같은 문의가 자꾸 두 번씩 온다"는 이야기를 꽤 자주 듣는데, 원인은 거의 이 두 가지였습니다.

1. 전송 버튼은 submit 이벤트에서 잠그기

버튼의 click 이벤트가 아니라 form의 submit 이벤트에서 잠그는 것이 핵심입니다. submit 이벤트는 required 같은 브라우저 기본 검사를 통과한 뒤에만 발생하기 때문에, 필수 항목을 빠뜨렸을 때 버튼만 잠겨 버리는 사고를 피할 수 있습니다.

<form id="qaForm" method="post" action="/inquiry">
  ...
  <button type="submit">문의 보내기</button>
</form>

<script>
document.getElementById('qaForm')
  .addEventListener('submit', function (e) {
    var btn = this.querySelector('[type=submit]');
    if (btn.disabled) { e.preventDefault(); return; }
    btn.disabled = true;
    btn.innerText = '보내는 중...';
  });
</script>

주의할 점이 하나 있습니다. disabled가 된 버튼의 name과 value는 전송 데이터에 포함되지 않습니다. 버튼 값으로 어떤 폼인지 구분하고 있었다면 그 값은 input type="hidden"으로 옮겨 두세요. fetch로 비동기 전송을 한다면 실패했을 때 버튼을 다시 풀어 주는 코드도 꼭 넣어야 합니다.

2. 새로고침 재전송은 서버에서 리다이렉트로

전송 결과를 같은 주소에서 바로 보여 주면, 방문자가 새로고침할 때 브라우저가 "양식 다시 제출" 확인 창을 띄우고 확인을 누르면 같은 데이터가 다시 넘어갑니다. 저장이 끝나면 완료 페이지로 리다이렉트하는 방식(Post/Redirect/Get)으로 바꾸면 새로고침해도 완료 페이지만 다시 열립니다.

<?php
// 저장 처리 후
save_inquiry($_POST);
header('Location: /inquiry/done', true, 303);
exit;

3. 그래도 남는 경우를 위한 마지막 확인

버튼 잠금은 자바스크립트가 꺼져 있거나 네트워크가 끊겼다 이어지면 뚫릴 수 있습니다. 그래서 서버 쪽에도 한 번 더 막아 두는 것이 안전합니다.

  • 폼을 열 때 일회용 토큰을 숨은 값으로 넣고, 저장할 때 이미 쓴 토큰이면 저장하지 않습니다.
  • 같은 연락처와 같은 내용이 짧은 시간 안에 다시 들어오면 새로 저장하지 않고 기존 건으로 처리합니다.
  • 완료 페이지에는 "접수되었습니다"와 함께 답변 예정 시간을 적어 두면, 확인이 안 돼서 다시 보내는 일 자체가 줄어듭니다.

"한 번 누르면 한 건만, 새로고침해도 한 건만."

나눔웹은 문의 폼을 만들 때 화면과 서버 양쪽에서 중복 접수를 막아
담당자가 같은 문의를 두 번 확인하는 일이 없도록 세팅합니다.


List of Articles
번호 분류 제목 글쓴이
88 웹 성능 뒤로 가기 하면 페이지가 처음부터 다시 뜰 때, bfcache 막는 원인 찾는 법 나눔웹
87 마케팅 LocalBusiness 구조화 데이터 작성법, 구글에 상호·주소·영업시간 정확히 알리기 나눔웹
86 UI/UX 링크 밑줄이 글자에 붙어 답답할 때, text-underline-offset으로 다듬는 법 나눔웹
85 모바일 모바일 키보드가 입력창을 가릴 때, visualViewport로 화면 맞추는 법 나눔웹
84 웹 성능 사용하지 않는 CSS 줄이기, 크롬 Coverage 탭으로 안 쓰는 코드 찾는 법 나눔웹
83 마케팅 GA4 문의 전환 설정법, 감사 페이지 도달로 실제 문의 수 세는 순서 나눔웹
82 UI/UX 고정 헤더에 제목이 가려질 때, scroll-margin-top으로 앵커 맞추는 법 나눔웹
81 퍼블리싱 CSS 컨테이너 쿼리 쓰는 법, 화면이 아니라 카드 폭에 맞춰 반응하기 나눔웹
80 UI/UX 폼 에러가 입력 전에 뜨는 문제, :user-invalid로 고치는 법 나눔웹
79 모바일 모바일 브라우저 상단바 색 맞추기, theme-color 메타 태그 쓰는 법 나눔웹
78 마케팅 문의 완료 페이지 noindex 설정법, 검색에 잡히지 않게 막는 순서 나눔웹
77 UI/UX 문의란이 내용만큼 늘어나게, CSS field-sizing으로 맞추는 법 나눔웹
76 웹 성능 긴 페이지 스크롤이 무거울 때, content-visibility로 렌더링 줄이는 법 나눔웹
75 모바일 모바일 100vh 잘림, dvh·svh로 주소창 높이까지 맞추는 법 나눔웹
74 마케팅 구글 서치 콘솔 등록 방법, 새 홈페이지 소유권 확인부터 색인 요청까지 나눔웹
73 퍼블리싱 CSS :has() 선택자 활용법, 자식 상태에 따라 부모 박스 스타일 바꾸기 나눔웹
72 웹 성능 반응형 이미지 srcset 쓰는 법, 모바일에 PC용 큰 사진을 보내지 않으려면 나눔웹
71 퍼블리싱 제목 줄바꿈이 어색할 때, text-wrap: balance로 한 단어만 남는 문제 정리 나눔웹
70 마케팅 robots.txt 작성법, 검색에 안 보여야 할 페이지와 사이트맵 위치 알려주는 순서 나눔웹
69 UI/UX 스켈레톤 로딩 화면 만들기, 빈 화면 대신 회색 자리 표시로 기다림 줄이는 법 나눔웹
Board Pagination Prev 1 2 3 4 5 Next
/ 5
rhwlsghkcocndgus XE2.1.39 STAGE1.5.4