프론트엔드 개발자는 좋은 거짓말을 해야한다

임동균 (DongE)·2026년 8월 19일
post-thumbnail

프론트엔드의 착한 거짓말: 실제 속도를 뛰어넘는 체감 속도(Perceived Performance) 이야기

이 글은 얼마 전 회사에서 동료분들과 함께 나누었던 사내 기술 발표 내용을 조금 더 편하게 읽으실 수 있도록 정리해 본 글입니다.

한동안 '좋은 거짓말'과 '나쁜 거짓말'이라는 생각에 푹 빠져 있던 적이 있었어요. 문득 "우리 개발자가 할 수 있는 좋은 거짓말에는 어떤 게 있을까?", "작업 거의 다 끝났다는 안도감일까?", 아니면 "AI가 도와줬지만 내가 다 짰다고 둘러대는 귀여운 거짓말일까?" 같은 이런저런 생각이 꼬리를 물더라고요.

그러다 문득 '프론트엔드 개발자가 유저의 사용성을 높이기 위해 할 수 있는 착한 거짓말은 무엇일까?'라는 고민으로 이어지게 되었습니다. 관련 자료와 웹 브라우저의 동작 원리를 찾아보면서 꽤 흥미롭고 유용한 내용들을 많이 발견하게 되었고, 이렇게 블로그에 정돈해서 공유해 드립니다.


"우리 앱은 왜 이렇게 느린가요?"

프론트엔드 개발을 하다 보면 누구나 한 번쯤 가슴이 철렁 내려앉았을 질문이에요.

이런 이야기를 들으면 우리는 보통 개발자 도구를 열어 네트워크 탭을 확인하고, 번들 크기를 줄이거나 백엔드 개발자분과 함께 API 응답 시간을 단 0.1초라도 줄여보려고 열심히 고민하곤 합니다.

하지만 많은 시간과 리소스를 들여서 실제 응답 속도를 줄여도, 사용자가 느끼는 만족도는 기대만큼 올라가지 않는 경우가 많아요.

이유는 생각보다 단순합니다. 화면을 바라보고 느끼는 최종 주체는 기계가 아니라 '사람'이기 때문입니다.


실제 속도(Actual Speed) vs 체감 속도(Perceived Speed)

서버 처리가 0.5초 만에 끝났다고 하더라도, 그 시간 동안 화면이 하얗게 멈춰 있으면 사용자는 "앱이 왜 이렇게 버벅이지?"라고 느끼게 됩니다.

결국 프론트엔드 개발자가 고민해야 할 진짜 목표는 단순히 숫자로 찍히는 로딩 시간을 줄이는 것을 넘어, 사용자가 느끼는 '심리적 대기 시간'을 어떻게 편안하게 만들어줄 것인가에 닿아 있습니다.

사용자의 불안감을 덜어주고 반응성을 즉각적으로 느끼게 만들어주는 두 가지 대표적인 기법을 소개합니다.


1. 불확실성을 낮춰주는 '스켈레톤 UI (Skeleton Screen)'

예전에는 데이터를 불러올 때 화면 가운데에 빙글빙글 도는 스피너(Spinner)를 주로 띄워두곤 했습니다.

하지만 스피너는 언제 끝날지 알 수 없는 막연한 기다림을 주기 때문에, 사용자를 지루하게 만들고 이탈하게 만드는 원인이 되기도 해요.

이런 아쉬움을 해결해 주는 방법이 바로 스켈레톤 스크린(Skeleton Screen)입니다. 유튜브나 인스타그램처럼 데이터가 도착하기 전에 회색 박스로 화면의 뼈대를 먼저 보여주는 방식이에요.

왜 스켈레톤 UI가 더 빠르게 느껴질까요?

  • 심리적 안정감: 화면이 이미 준비되고 있다는 느낌을 주어 답답함을 크게 덜어줍니다.
  • 화면 덜컹거림(CLS) 방지: 데이터가 들어갈 자리를 미리 잡아두기 때문에 화면이 갑자기 밀려나는 현상을 막아줍니다.
  • 체감 대기 시간 단축: 실제로 점진적으로 채워지는 뼈대를 볼 때, 사람들은 빈 화면에 스피너가 돌 때보다 대기 시간을 실제보다 훨씬 짧게 인지한다고 합니다.

2. 서버 응답을 기다리지 않는 '낙관적 UI (Optimistic UI)'

인스타그램이나 트위터에서 '좋아요' 버튼을 누를 때 로딩을 기다려보신 적이 있으신가요?

버튼을 누르자마자 0.1초 만에 하트가 예쁘게 채워지는 것을 보셨을 거예요. 사실 그 순간에는 서버가 요청을 받아서 데이터베이스에 저장하지도 못한 상태입니다.

프론트엔드에서 "특별한 문제가 없다면 이 요청은 당연히 성공할 거야!"라고 긍정적으로 가정하고, 화면의 색상이나 숫자부터 먼저 싹 바꿔주는 기분 좋은 눈속임 기법입니다.

낙관적 UI는 이렇게 흘러가요

  1. 사용자 터치: 유저가 '좋아요'나 '북마크' 버튼을 누릅니다.
  2. 화면 선반영: 서버 응답을 기다리지 않고 로컬 화면의 상태를 성공 상태로 즉시 변경합니다.
  3. 비동기 요청: 백그라운드에서 조용히 서버로 실제 저장 API를 전송합니다.

왜 100ms(0.1초) 안에 반응해야 할까요?

서버의 확인을 받기도 전에 화면부터 먼저 바꿔야 하는 이유는, 인간의 뇌가 컴퓨터의 반응을 인지하는 시간 기준 때문이에요.

반응 시간사용자가 느끼는 심리 상태
0 ~ 100ms (0.1초)시스템이 즉각적으로 척척 반응한다고 느끼며 만족감을 얻어요
100 ~ 300ms아주 살짝 뜸을 들이기 시작한다고 인지해요
1000ms (1초) 이상집중의 흐름이 끊기고 서비스가 느리다는 답답함을 느껴요

실제 서버 응답에 1초가 걸리더라도 프론트엔드가 0.1초 안에 기분 좋은 피드백을 먼저 주면, 사용자는 자신이 이 앱을 완벽하게 다루고 있다는 쾌적함을 느끼게 됩니다.


착한 거짓말의 철칙: 실패했을 때의 롤백(Rollback)과 안전 구역

사용자에게 기분 좋은 착시를 선물하는 만큼, 개발자는 뒤에서 철저한 안전장치를 마련해 두어야 합니다.

1. 실패했을 때 자연스럽게 되돌리기 (Rollback)

네트워크가 불안정하거나 서버 오류로 요청이 실패할 때를 반드시 대비해야 합니다.

  • 먼저 바꿔두었던 화면 상태를 이전 상태로 부드럽게 원상복구합니다.
  • "일시적인 네트워크 오류로 처리되지 않았습니다"처럼 친절한 토스트 메시지로 상황을 안내해 드려야 합니다.
  • TanStack Query(React Query) 같은 도구를 사용하면 onMutateonError 옵션을 통해 이전 상태를 안전하게 기억해 두고 복구할 수 있어요.

2. 적용하면 안 되는 조심스러운 기능들

모든 곳에 낙관적 UI를 적용하면 오히려 큰 사고가 날 수 있습니다.

  • 적용하기 좋은 곳: 좋아요, 북마크, 다크 모드 전환, 간단한 댓글 등록 등 실패해도 리스크가 작은 기능
  • 절대 쓰면 안 되는 곳: 결제 승인, 계좌 송금, 회원 탈퇴처럼 데이터의 정확성이 생명인 금융 및 보안 관련 작업

마치며: 유저의 시간을 배려하는 프론트엔드 개발자

"진정한 프론트엔드 개발자는 단순히 코드를 치는 사람을 넘어, 유저가 느끼는 시간을 세심하게 연출하는 사람입니다."

주어진 디자인 시안을 화면으로 옮기는 것에 그치지 않고, 어떻게 하면 사용자의 대기 시간을 덜 지루하게 만들고 기분 좋은 즉각적인 반응을 줄 수 있을지 함께 고민해 보면 좋겠습니다.

복잡하고 거대한 아키텍처 개선도 물론 멋지지만, 오늘 소개해 드린 스켈레톤 UI나 낙관적 UI처럼 사람의 심리를 배려한 작은 코드 몇 줄로도 유저에게는 훨씬 더 완성도 높은 경험을 선물할 수 있으니까요.

profile
끊임없이 기술적 한계에 도전하는 엔지니어

0개의 댓글