앱이 오류를 일으켰을 때, 무슨 말을 해야 할까: 사람들이 진짜로 이해하는 오류 메시지 쓰는 법

좋은 오류 메시지는 무슨 일이 일어났는지, 누구의 잘못인지, 다음에 뭘 해야 하는지를 말해주고, 사용자가 입력한 내용을 지우지 않습니다. 이 한 줄이 오류를 재시도로 바꾸기도 하고, 사용자를 영영 떠나보내기도 합니다.

모든 앱은 언젠가 오류를 일으킵니다. 인터넷이 끊기고, 서버가 잠깐 버벅이고, 누군가 전화번호에 글자를 섞어 넣기도 하죠. 이런 일들을 완전히 막을 수는 없습니다. 하지만 여러분이 통제할 수 있는 건 오류 메시지, 즉 무언가 잘못됐을 때 앱이 보여주는 그 문구입니다. 그리고 이 한 줄의 메시지가, 어깨를 으쓱하고 다시 시도하는 사용자와 조용히 “이 앱은 고장 났다”고 결론짓고 다시는 돌아오지 않는 사용자를 가르는 경우가 많습니다.

AI로 만든 앱 대부분이 바로 이 순간을 놓칩니다. 빌더가 부주의해서가 아니라, 오류 메시지는 실제 사용자 앞에서 뭔가 잘못되기 전까지는 아무도 신경 쓰지 않는 부분이기 때문입니다. 기본값으로는 최악의 두 가지 중 하나를 보여주는 경향이 있습니다. 아무것도 안 보여주거나, 무서운 기술 텍스트 덩어리를 보여주거나. 이 둘을 다 고쳐봅시다.

앱은 왜 조용히 실패하거나 무서운 오류 메시지를 보여줄까요?

앱이 잘못 실패하는 방식은 두 가지입니다. 뭔가 실패했을 때 아무 말도 하지 않거나, 일반 사용자는 읽을 수 없는 기술적인 오류를 보여주거나. 둘 다 사용자를 추측하게 만들고, 그 추측이 결국 사람들을 포기하게 만듭니다.

조용한 실패. 마야(가명)라는 프리랜서가 자신의 사진 사업을 위한 예약 폼을 만들었습니다. 고객이 “예약 확정”을 눌렀고, 버튼이 잠깐 깜빡이더니… 아무 일도 없었습니다. 확인 메시지도, 오류도, 로딩 표시도 없었죠. 성공한 걸까요? 고객은 확신이 없어서 다시 예약했습니다. 결국 마야는 같은 시간대에 예약이 두 건 잡혔고, 고객은 혼란에 빠졌습니다. 앱이 다운된 게 아니었습니다. 저장이 실패했을 뿐인데, 앱이 아무 말도 하지 않아서 화면 앞의 사람은 실제로 무슨 일이 일어났는지 전혀 알 수 없었던 겁니다.

무서운 기술 오류. 다른 실패 방식은 더 시끄럽고, 어떤 면에서는 더 나쁩니다. 지역 모금 행사를 진행하던 한 자원봉사자가 스프레드시트를 업로드하려다 Error 500: Internal Server Error라는 빨간 상자를 만났습니다. 그는 이걸 “내가 뭔가 망가뜨렸다”는 뜻으로 받아들였습니다. 다시 시도하지도, 도움을 요청하는 메일을 보내지도 않고 그냥 탭을 닫아버렸습니다. 메시지가 마치 자기 잘못인 것처럼, 그리고 다시 건드리면 위험할 것처럼 들렸기 때문입니다.

두 사용자 모두 흔하고 충분히 회복 가능한 문제를 만났을 뿐입니다. 하지만 둘 다 떠나버렸습니다. 앱의 오류 메시지가 아무 말도 하지 않았거나, 뭔가 무서운 말을 했기 때문입니다.

좋은 오류 메시지란 무엇일까요?

좋은 오류 메시지는 평범한 말로 네 가지 작은 일을 합니다. 무슨 일이 일어났는지 말하고, 누구의 문제인지 말하고, 다음에 뭘 해야 하는지 말하고, 사용자가 입력한 내용을 잃어버리지 않습니다.

  1. 무슨 일이 일어났는지 말한다 — 침묵도, 500도 아니라 “예약을 저장하지 못했습니다” 같은 말.
  2. 누구의 문제인지 말한다 — 대개 정직한 답은 “우리 쪽”이고, 그렇게 말하는 것만으로도 사람들은 안심합니다.
  3. 다음에 뭘 해야 하는지 말한다 — “잠시 후 다시 시도해 주세요” 또는 “인터넷 연결을 확인하고 다시 시도해 주세요.”
  4. 입력한 내용을 잃어버리지 않는다 — 메시지가 뜰 때, 사용자가 입력했던 내용은 여전히 폼에 그대로 남아 있어야 합니다.

이게 전부입니다. 장황한 사과문도, 헤드라인으로 내세운 오류 코드도, 비난도 필요 없습니다. 앞서 본 세 가지 실패를 다시 써보면 이렇습니다.

  • ❌ (아무 일도 일어나지 않음) → ✅ “방금 저장하지 못했습니다. 입력하신 내용은 그대로 남아 있으니, 확인을 다시 눌러 시도해 주세요.”
  • ❌ Error 500: Internal Server Error → ✅ “파일을 업로드하는 중 저희 쪽에서 문제가 생겼습니다. 사용자님 잘못이 아닙니다. 잠시 후 다시 시도해 주세요.”
  • ❌ Invalid input → ✅ “전화번호가 올바르지 않은 것 같아요. 555-123-4567처럼 10자리 숫자여야 합니다.”

마지막 예시가 특정 필드를 정확히 짚어주고 어떤 형태가 맞는지 보여준다는 점에 주목하세요. “Invalid input”은 사용자가 스스로 원인을 찾게 만들지만, “전화번호는 10자리여야 합니다”는 무엇을 고쳐야 하는지 정확히 알려줍니다.

어떤 앱 오류부터 먼저 고쳐야 할까요?

가능한 모든 실패마다 맞춤 메시지를 만들 필요는 없습니다. 일반적인 앱에서 벌어지는 문제의 거의 전부는 세 가지가 커버합니다. 저장이나 제출 실패, 앱이 처리할 수 없는 입력값, 그리고 여러분 쪽에서 뭔가 망가진 경우입니다.

저장이나 제출이 실패하는 경우. 신뢰를 가장 크게 무너뜨리는 유형입니다. 사용자는 모든 걸 제대로 했는데, 그게 실제로 반영됐는지 확신할 수 없기 때문이죠. 항상 성공을 확인시켜 주고 동시에 실패도 설명해 주세요. 절대 사용자를 추측하게 두지 말고, 입력한 내용을 절대 버리지 마세요.

“입력하신 내용을 사용할 수 없어요” (유효성 검사). 이건 사실 오류라기보다 오해에 가깝습니다. 사용자가 해당 필드를 벗어나는 순간 바로 잡아내고, 정확한 필드를 짚어주고, 올바른 형식의 예시를 보여주세요. 제출 버튼을 누를 때까지 기다렸다가 빨간 경고 벽을 한꺼번에 보여주지 마세요.

“저희 쪽에서 뭔가 망가졌어요.” 진짜 서버나 네트워크 문제입니다. 여러분 쪽 문제라고 밝히고, 침착한 톤을 유지하고, 재시도할 방법을 알려주세요. 사용자는 여러분의 서버를 고칠 수 없으니, 마치 그래야 할 것처럼 느끼게 만들지 마세요.

조용히 도움이 되는 세 가지 습관

실패를 우아하게 다루는 앱과 그렇지 못한 앱을 가르는 몇 가지가 있습니다.

  • 원시 오류 코드를 메시지 전체로 보여주지 마세요. 코드는 지원팀을 위해 작은 글씨로 하단에 남겨둘 수 있지만, 사람이 읽는 헤드라인은 ERR_CONN_RESET 같은 게 아니라 완결된 문장이어야 합니다.
  • 절대 사용자를 탓하지 마세요. “잘못 입력하셨습니다”는 아프게 들리지만, “날짜가 과거로 되어 있는 것 같아요. 혹시 다음 달을 말씀하신 건가요?”는 도움이 됩니다. 같은 정보라도 느낌이 완전히 다릅니다.
  • 항상 입력한 내용을 보존하세요. 앱이 새로고침되거나 저장이 실패하면서 폼이 비어버리면, 작은 오류 하나가 10분간의 재입력으로 바뀝니다. 사람들은 저장 실패는 용서합니다. 같은 작업을 두 번 하게 만드는 건 용서하지 않습니다.

AI 빌더가 더 나은 오류 메시지를 쓰게 하려면 어떻게 해야 할까요?

이 대부분은 한 번의 요청으로 해결할 수 있습니다. 아래와 비슷한 프롬프트를 붙여넣으면 AI 빌더가 위의 평범한 언어 규칙들을 앱 전체에 적용해 줄 것입니다.

“저장이나 업로드가 실패했을 때, 조용히 실패하지 말고 기술적인 오류 코드도 보여주지 마세요. 무슨 일이 일어났는지 말해주고, 다시 시도해도 괜찮다고 말해주고, 사용자가 이미 입력한 내용을 그대로 유지하는 짧고 친절한 메시지를 평범한 말로 보여주세요. 폼 필드의 경우, 사용자가 각 필드를 벗어날 때 유효성을 검사하고, 올바른 형식의 예시와 함께 구체적인 메시지를 보여주세요.”

그런 다음 세 가지 경우에 무슨 일이 일어나는지 직접 물어보세요. 인터넷이 꺼졌을 때, 필수 필드가 비어 있을 때, 서버가 느릴 때. 이 중 하나라도 “아무것도 안 보여줍니다”거나 “원시 오류를 그대로 보여줍니다”라는 답이 나온다면, 그게 바로 다음에 고쳐야 할 부분입니다.

앱의 오류 메시지는 어떻게 테스트해야 할까요?

와이파이를 끄고, 앱을 열고, 가장 핵심적인 동작을 해보세요. 그게 테스트의 전부이고, 2분이면 충분합니다.

예약을 하고, 메모를 저장하고, 파일을 업로드해 보세요. 무슨 메시지가 뜨는지 지켜보세요. 평범한 사람이 이해할 수 있는 말이었나요? 입력했던 내용을 잃어버리진 않았나요? 이제 와이파이를 다시 켜고, 일부러 필드에 엉터리 값을 입력해 보세요. 같은 질문을 다시 던져보세요.

대부분의 앱은 첫 시도에서 이 테스트를 통과하지 못합니다. 괜찮습니다. 그게 바로 어디서부터 시작해야 할지 정확히 보여주는 것이니까요. 모든 오류 메시지를 완벽하게 만들 필요는 없습니다. 앱에서 가장 자주 발생하는 문제 하나를 찾아서, 그 메시지부터 친절하고 명확하고 정직하게 만드세요. 다음에 실제 사용자가 그 상황을 마주쳤을 때, 떠나는 대신 다시 시도할 겁니다. 그리고 다시 시도하게 만드는 것, 그게 전부입니다.