기다림과 다시 시도

상대가 답을 안 줄 때 얼마나 기다리고 몇 번 다시 물어볼지 정하는 일이에요. 이 두 숫자를 잘못 잡으면 손님은 끝나지 않는 로딩을 보고, 돈은 두 번 나가요.

쉽게 말하면

계산대에서 카드를 긁었는데 단말기가 "통신 중"만 띄우고 답이 없어요. 손님은 기다리고, 뒤에는 줄이 서 있어요. 여기서 사장님이 정하는 게 딱 두 가지예요. 몇 초까지 기다릴까, 그리고 다시 긁어 볼까. 그게 기다림 시간(타임아웃)과 다시 시도(재시도)예요. 무서운 건 두 번째예요. 아무 확인 없이 다시 긁으면 승인이 두 번 날 수 있어요. 앞의 요청이 실패한 게 아니라 답만 못 돌아온 것일 수도 있으니까요. 프로그램도 똑같은 자리에 서 있어요.

"답이 없다"와 "실패했다"는 다른 말이에요. 이 문서 전체가 그 한 줄에서 나와요. 답이 없다는 건 결과를 모른다는 뜻이고, 모를 때 그냥 다시 하면 두 번 될 위험이 생겨요.

위험한 처리
5초 기다림 답 없음 → 바로 같은 요청 다시 → 또 답 없음 → 또 다시 → 손님 화면: 계속 도는 원

승인이 세 번 났을 수도 있어요. 손님 카드 명세서에는 세 줄이 찍히고, 내 주문 목록에는 한 줄도 없을 수 있어요.

안전한 처리
5초 기다림 답 없음 → 요청번호 붙여 다시 → 총 3번까지, 간격 벌려서 → 손님 화면: "결제 확인 중"

요청번호가 같으면 상대가 "이미 처리한 건"이라고 알아봐요. 몇 번을 보내도 한 번만 처리돼요.

정해야 하는 숫자는 다섯 개예요

"타임아웃 얼마로 할까요" 하고 묻는 건 반쪽 질문이에요. 실제로는 다섯 개가 한 세트로 움직여요. 하나만 정하고 나머지를 비워 두면, 빈칸은 나중에 최악의 값으로 채워져요.

정할 것무슨 뜻인가안 정하면
기다림 시간한 번 물어보고 답을 몇 초까지 기다릴지무한정 기다려요. 손님 화면은 영원히 돌고, 서버 자리는 계속 잡혀 있어요
다시 시도 횟수답이 없을 때 몇 번까지 더 물어볼지안 하거나 끝없이 해요. 둘 다 나빠요. 끝없는 쪽은 요금과 신뢰를 같이 태워요
시도 간격다시 물어보기까지 얼마를 쉴지붙여서 몰아쳐요. 상대가 힘들어서 못 받는 상황이면 오히려 더 못 받게 만들어요
전체 예산재시도까지 다 합쳐 총 몇 초 안에 끝낼지3번 재시도가 합쳐서 1분이 돼요. 손님은 이미 나갔어요
요청번호같은 일인지 알아보게 붙이는 표. 중복을 막는 장치예요다시 시도한 만큼 두 번, 세 번 처리돼요. 돈이 걸린 일이면 사고예요

다섯 번째가 진짜 핵심이에요

앞의 네 개는 손님을 기다리게 하지 않기 위한 것이고, 요청번호는 돈이 두 번 나가지 않게 하는 것이에요. 재시도를 넣기로 했다면 요청번호는 선택이 아니라 세트로 같이 들어가요. 재시도만 넣고 요청번호를 빼면, 안 넣은 것보다 나쁜 상태가 돼요.

다시 시도해도 되는 일과 안 되는 일

여기가 초보와 중급이 갈리는 자리예요. 읽기만 하는 일은 마음 편히 다시 시도해도 돼요. 몇 번 물어봐도 세상이 안 바뀌니까요. 뭔가를 바꾸거나 만드는 일은 다시 시도할 때마다 하나가 더 생길 수 있어요.

하는 일다시 시도
가격표 불러오기마음껏몇 번 봐도 가격표는 그대로예요
예약 목록 조회마음껏보는 것만으로는 아무것도 안 바뀌어요
결제 승인 요청요청번호 있으면만번호 없이 다시 하면 두 번 승인될 수 있어요
주문 만들기요청번호 있으면만번호 없이 다시 하면 주문이 두 개 생겨요
문자·알림 발송권하지 않아요같은 손님이 같은 문자를 두 통, 세 통 받아요. 발송비도 그만큼이에요
재고 하나 빼기요청번호 있으면만재고가 두 개 빠져서 장부와 실물이 어긋나요

정리하면 이래요. 다시 시도를 켜기 전에 "이 일을 두 번 하면 무슨 일이 생기나"를 먼저 답해요. 아무 일도 안 생기면 바로 켜요. 뭔가 생기면 요청번호를 먼저 붙이고 켜요.

요청번호는 만들 때 붙여요

요청번호는 상대에게 보낼 때 새로 만드는 게 아니라, 손님이 버튼을 누른 그 순간 한 번 만들어서 재시도할 때마다 같은 번호를 보내는 거예요. 재시도마다 새 번호를 만들면 번호가 있어도 중복이 그대로 나요. 개발자와 이야기할 때 이 문장을 그대로 쓰면 오해가 없어요.

간격을 벌리는 이유

답이 없는 이유는 대개 상대가 바쁠 때예요. 바쁜 사람에게 같은 질문을 초당 세 번 하면 더 못 답해요. 그래서 다시 물어볼 때는 쉬는 시간을 점점 늘려요.

  1. 1첫 시도. 답을 정해진 시간까지 기다려요.
  2. 21초 쉬고 두 번째. 잠깐 삐끗한 것이면 여기서 대개 붙어요.
  3. 32초 쉬고 세 번째. 여기까지 안 되면 잠깐 삐끗한 게 아니라 상대가 정말 힘든 거예요.
  4. 4멈춰요. 더 두드리는 건 도움이 안 돼요. 손님에게 상황을 알리고, 나에게는 기록을 남겨요.
  5. 5쉬는 시간에 조금씩 흔들어요. 모두가 똑같이 1초·2초를 세면 같은 순간에 다시 몰려요. 1초가 아니라 1초 안팎으로 사람마다 다르게 쉬면 몰림이 풀려요.

몇 초가 정답인가

정답 숫자는 없어요. 붙이는 상대마다 달라요. 결제사·문자 발송사·AI 서비스마다 권장 기다림 시간과 재시도 규칙을 문서에 적어 둬요. 그 값을 읽어서 쓰는 게 정석이에요. 감으로 정하고 싶을 때는 "손님이 이 화면에서 버티는 시간"보다 짧게 잡는 것부터 시작해요.

안쪽이 짧아야 해요

중급에서 가장 많이 나는 사고가 이거예요. 기다림 시간은 한 군데만 있는 게 아니라 겹쳐 있어요. 손님 화면이 기다리는 시간, 내 서버가 기다리는 시간, 내 서버가 결제사를 기다리는 시간이 각각 있어요.

거꾸로 잡은 경우
손님 화면: 10초 기다림 내 서버: 30초 기다림 결제사: 25초쯤 답함

손님 화면은 10초에 포기하고 "실패"를 띄워요. 그런데 서버는 25초에 승인 답을 받아서 결제를 완료해요. 손님은 실패를 봤는데 돈은 나갔어요. 가장 나쁜 조합이에요.

제대로 잡은 경우
손님 화면: 35초 예산 내 서버: 30초 기다림 결제사: 25초쯤 답함

바깥이 안쪽보다 길어요. 서버가 결과를 확실히 알고 나서 손님에게 답해요. 손님이 보는 글자와 실제 결과가 어긋나지 않아요.

규칙은 한 줄이에요. 바깥쪽 기다림 시간은 안쪽 전부를 합친 것보다 길어야 해요. 재시도를 켜면 안쪽 합계에 재시도와 쉬는 시간까지 다 더해야 하니까, 재시도를 늘릴 때는 바깥 시간도 같이 봐요.

그리고 손님이 창을 닫거나 뒤로 갔을 때, 돌아가던 작업도 같이 멈추게 만들어 달라고 하세요. 안 그러면 아무도 안 보는 답을 만들려고 요금이 계속 나가요. AI를 쓰는 화면이면 이게 AI 요금에 바로 붙어요.

실제로 겪는 장면

장면 1 · 손님이 남긴 문의

결제하기를 눌렀는데 화면이 계속 돌다가 실패라고 나왔어요. 그래서 한 번 더 했는데, 카드 문자가 두 번 왔어요. 환불해 주세요.

손님을 탓할 수 없어요. 실패라고 써 준 쪽이 잘못이에요. 결과를 모르는 상황에서 "실패"를 띄웠고, 요청번호가 없어서 두 번째 시도가 그대로 새 결제가 됐어요. 수리는 두 곳이에요. 화면 글자를 "확인 중"으로 바꾸는 것, 그리고 결제 요청에 요청번호를 붙이는 것.

장면 2 · 외주 개발자가 말했다

재시도 로직 넣어 뒀어요. 실패하면 세 번까지 자동으로 다시 시도해요.

좋은 말인데 반쪽이에요. 되물어야 할 게 세 가지예요. 읽는 요청에만 넣었나요, 돈이 나가는 요청에도 넣었나요. 돈이 나가는 쪽이면 요청번호로 중복을 막았나요. 그리고 세 번 다 합쳐서 몇 초인가요. 이 셋을 물어보는 사장님과 안 물어보는 사장님의 다음 달 청구서는 달라요.

장면 3 · 이번 달 문자 발송비를 보고

예약 알림 문자가 평소의 네 배 나갔어요. 예약 수는 그대로인데요.

발송에 재시도가 걸려 있고 중복 방지가 없을 때 전형적으로 나는 일이에요. 발송사는 받았는데 답만 늦게 돌아왔고, 그동안 재시도가 계속 나간 거예요. 발송 같은 일은 재시도보다 기록을 먼저 넣어요. "이 예약 건은 이미 보냈다"를 남겨 두면 몇 번 시도해도 한 통이에요. 알림 보내기에 발송 상한을 정하는 이야기가 더 있어요.

이미 두 번 나갔다면

  1. 1손님에게 먼저 알려요. 손님이 발견해서 항의하는 것과 내가 먼저 알리는 것은 완전히 다른 사건이에요. 확인했다는 사실만이라도 바로 전하세요.
  2. 2결제사 관리자 화면에서 승인 내역을 봐요. 같은 카드·같은 금액·비슷한 시각으로 두 건이 있으면 중복이에요. 여기 있는 기록이 기준이에요. 내 주문 목록은 틀릴 수 있어요.
  3. 3중복 건을 취소해요. 같은 날 안이면 승인 취소로 처리되는 경우가 많고, 날이 지나면 환불로 처리돼요. 어느 쪽인지·손님 통장에 언제 돌아가는지는 결제사 안내에 따라 달라서, 결제사 화면의 안내를 보고 그대로 손님에게 전하세요.
  4. 4원인을 고치고 기록해요. 요청번호를 붙였는지, 기다림 시간이 겹쳐서 거꾸로였는지, 어느 쪽이었는지 남겨 두세요. 같은 사고가 두 번 나면 그건 다른 사고예요.

숫자와 규정은 원본에서 확인하세요

취소 가능한 기간, 손님 통장에 돌아가는 데 걸리는 날짜, 수수료 처리는 결제사와 카드사마다 다르고 바뀌어요. 이 문서의 숫자를 믿지 말고 계약한 결제사 관리자 화면과 약관에서 확인하세요. 손님과 다툼이 커지면 상담 창구는 한국소비자원이고, 결제사·카드사 처리 자체가 문제라면 금융감독원이에요. 환불 순서 자체는 환불 처리하는 순서에 정리돼 있어요.

손님 화면에는 뭐라고 쓰나

기술은 안 보이지만 글자는 보여요. 그리고 이 주제에서 글자를 잘못 쓰면 그게 그대로 환불 요청이 돼요.

상황쓰면 안 되는 말쓸 말
답을 기다리는 중잠시만 기다려 주세요(끝없이)결제 확인 중이에요. 창을 닫지 마세요
답이 안 와서 재시도 중실패했습니다확인 중이에요. 결과가 나오면 문자로 알려드려요
끝까지 결과를 모를 때결제 실패. 다시 시도해 주세요확인이 늦어지고 있어요. 중복 결제를 막기 위해 다시 누르지 마세요. 확인 후 연락드려요
확실히 실패했을 때오류가 발생했습니다결제가 되지 않았어요. 카드는 그대로예요. 다시 시도하실 수 있어요

핵심은 모를 때 단정하지 않는 것이에요. "실패"는 확실히 실패했을 때만 쓰는 말이에요. 화면 글자를 만드는 요령은 기다리는 중 표시에러 읽는 법에도 이어져요.

자주 묻는 것

Q. 기다림 시간을 아주 길게 잡으면 안전한 거 아닌가요?
아니에요. 길게 잡으면 답이 안 오는 요청들이 자리를 차지하고 안 비켜요. 그 자리가 다 차면 멀쩡한 손님도 못 들어와요. 하나가 늦는 문제가 전체가 멈추는 문제로 커지는 거예요. 빨리 포기하고 자리를 비우는 게 전체에는 더 안전해요.
Q. 재시도를 아예 안 넣으면요?
돈이 걸린 일에서는 그게 오히려 무난한 선택일 수 있어요. 대신 사람이 확인하는 절차를 넣어야 해요. 결과를 모르는 건이 생기면 목록에 쌓아 두고 사장님이 결제사 화면과 맞춰 보는 방식이요. 자동을 포기하는 대신 확실해져요.
Q. 손님이 결제 버튼을 두 번 누르는 것도 같은 문제인가요?
뿌리는 같고 해결도 같아요. 누른 즉시 버튼이 눌리지 않게 막는 게 첫 겹이고, 요청번호로 서버에서 한 번만 처리하는 게 두 번째 겹이에요. 버튼만 막는 건 부족해요. 손님이 새로고침을 하면 버튼 잠금은 풀리니까요.
Q. AI에게 뭔가 만들게 하는 화면도 이 이야기가 해당되나요?
네, 그리고 더 직접적으로 돈이 걸려요. AI에게 보낸 요청은 답을 못 받아도 상대는 이미 일을 했을 수 있어서, 요금은 그대로 붙어요. 답을 안 기다리고 재시도하면 요금이 두 번 나가요. AI 요청은 기다림 시간을 넉넉하게, 재시도는 인색하게 잡는 쪽이 맞아요.
Q. 실패한 건들만 모아서 나중에 한꺼번에 다시 돌리는 건 어때요?
좋은 방식이에요. 손님을 기다리게 하지 않고, 시간이 지난 뒤 상대가 회복됐을 때 처리할 수 있어요. 단 이때도 요청번호가 없으면 한꺼번에 중복이 대량으로 나요. 규모가 커진 만큼 사고도 커져요.
Q. 우리 규모에서 이걸 다 신경 쓸 필요가 있나요?
돈이나 문자가 걸린 곳만 보면 돼요. 가격표 불러오기 같은 곳은 대충 해도 손해가 없어요. 하지만 결제·발송·재고 세 곳은 하루 열 건짜리 가게에서도 사고가 나면 손님 한 명을 잃어요. 세 곳만 챙기면 대부분 막혀요.

확인해 보세요

결제 요청을 보냈는데 답이 안 와요. 자동으로 다시 시도하게 만들려고 해요. 반드시 같이 들어가야 하는 것은?

하나 더

손님 화면은 10초에 포기하고, 내 서버는 30초까지 기다려요. 무슨 일이 생길 수 있나요?

직접 해보기

만들 때 이 요구를 그대로 적어 보세요

스튜디오에서 결제나 알림이 들어가는 화면을 만들 때 이 문장을 붙여 보세요. "결제 요청에는 손님이 버튼을 누른 순간 만든 요청번호를 붙이고, 재시도할 때도 같은 번호를 보내 주세요. 결과를 모를 때는 실패라고 쓰지 말고 확인 중으로 표시해 주세요." 요구를 문장으로 적어 두면 나중에 무엇을 점검할지도 정해져요.

스튜디오 열기

더 깊이 (안 읽어도 괜찮아요)

요청번호를 만드는 세 가지 방법 · 손님이 누른 순간 무작위 번호를 만드는 방법, 주문번호처럼 이미 있는 값을 그대로 쓰는 방법, "이 손님·이 상품·이 시각"을 합쳐서 번호를 만드는 방법이 있어요. 가게 상황에서는 두 번째가 제일 튼튼해요. 주문번호는 이미 장부에 남는 값이라, 나중에 사장님이 눈으로 맞춰 볼 수 있어요. 무작위 번호는 편하지만 사람이 대조하기 어려워요.

재시도가 서로를 밀어붙이는 현상 · 상대가 잠깐 느려지면 모두가 동시에 재시도를 시작해요. 그러면 상대는 원래 부하에 재시도 부하까지 받아서 더 느려지고, 그래서 재시도가 더 늘어요. 잠깐이면 지나갈 일이 이렇게 큰 장애로 커져요. 쉬는 시간을 늘리는 것과 사람마다 조금씩 다르게 쉬는 것이 이걸 막는 장치예요. 여기에 하나 더 얹으면, 실패가 잇달아 나면 잠시 두드리기를 완전히 멈추는 스위치를 두는 방법도 있어요. 상대에게 회복할 틈을 주는 거예요.

취소가 아니라 반대로 되돌리기 · 결과를 모르는 결제를 취소로 정리하는 것과, 이미 확정된 결제를 환불로 되돌리는 것은 장부에서 다르게 남아요. 승인 취소는 원래 매출이 없던 것처럼 정리되는 경우가 많고, 환불은 매출과 환불이 각각 남아요. 어느 쪽으로 처리됐는지가 정산 금액과 장부에 그대로 나타나서, 월말에 정산 내역을 맞춰 볼 때 이 구분을 알고 있으면 헤매지 않아요.

이것만 기억하세요

  • ·답이 없다는 건 실패했다는 뜻이 아니라 결과를 모른다는 뜻이에요
  • ·다시 시도를 켜려면 요청번호를 같이 붙여요. 재시도만 켜면 안 켠 것보다 나빠요
  • ·읽는 일은 마음껏 다시 시도해도 되고, 결제·발송·재고는 요청번호가 있어야 해요
  • ·바깥쪽 기다림 시간은 안쪽 전부를 합친 것보다 길어야 해요
  • ·결과를 모를 때 화면에 실패라고 쓰지 않아요. 확인 중이라고 써요
VibeCampus新規ビルド