🐾 Pet-Pass Dev Blog

기획 & 디자인 · #2 📖 약 5분

지도와 스크롤이 충돌하다 —
모바일 바텀시트를 세 번 만든 이유

#기획 #UX #모바일 #바텀시트 #바이브코딩

목차

  1. 세 줄짜리 요청에서 시작됐다
  2. 첫 번째 바텀시트 — 결과는 그럴싸했다
  3. 지도가 내 손가락을 먹었다
  4. 두 번째, 세 번째
  5. 당연하지 않다

세 줄짜리 요청에서 시작됐다

Pet-Pass는 지도 위에 매장을 표시하는 서비스다. 모바일에서 지도를 꽉 채워 보여주면서도, 매장 목록을 같이 보여줘야 했다. 그래서 바텀시트가 필요했다. 화면 아래에서 올라오는, 드래그로 크기를 조절할 수 있는 그 패널.

AI에게 전달한 요청은 간단했다.

실제로 전달한 요청
"모바일에서 바텀시트 추가해줘. 지도 아래에 매장 목록이 나오게."
↓ 내가 머릿속에 그리고 있던 것
핸들(—)을 잡고 위아래로 드래그하면 시트 높이가 바뀌고, 시트 안에서는 손가락을 올려도 리스트가 스크롤된다. 지도는 지도대로 움직이고. 그게 당연한 거잖아.

내가 당연하다고 생각한 것들을 하나도 말하지 않았다. 그냥 "바텀시트"라는 단어만 던졌다.

첫 번째 바텀시트 — 결과는 그럴싸했다

AI(Antigravity)는 성실하게 바텀시트를 만들었다. 화면 아래에서 올라오고, 드래그로 높이가 조절됐다. 처음 봤을 때는 "됐다"고 생각했다.

데스크탑에서 테스트했으니까.

지도가 내 손가락을 먹었다

실제 핸드폰으로 열었을 때 바로 이상함을 느꼈다. 매장 목록을 위로 올리려고 손가락을 대면, 리스트가 스크롤되는 게 아니라 지도가 움직였다. 터치 이벤트가 바텀시트를 통과해서 뒤에 있는 지도까지 전달되고 있었다.

이건 모바일 지도 서비스에서 흔히 겪는 문제다. 지도 라이브러리는 터치 이벤트를 전부 자기 것으로 가져가려고 하고, 그 위에 뭔가를 올려두면 이벤트가 뒤섞인다.

1차 수정 · 실패

바텀시트 전체에 touch-action: none을 적용. 지도로의 이벤트 누출은 막혔지만, 이번엔 리스트 안에서 스크롤이 완전히 죽어버렸다.

2차 수정 · 실패

HTML 구조 문제도 있었다. 스티키 헤더가 리스트 전체를 감싸는 바람에 드래그 로직과 충돌. 구조를 분리하고 핸들 영역에만 touch-action을 걸었지만 여전히 최상단에서 아래로 내려오지 않는 문제가 남았다.

3차 수정 · 여전히

핸들(—)에만 드래그 이벤트를 묶고 나머지 리스트는 자유롭게 두는 방식으로 재설계. 접근 방향은 맞았지만 구현 세부 조건이 틀려서 최상단 고착 문제가 완전히 해결되지 않았다.

세 번의 시도가 이어지는 동안 나는 계속 같은 방식으로 요청했다. "아직도 최상단에서 내려오지 않아." AI는 매번 새로운 코드를 짰고, 매번 다른 지점에서 막혔다.

두 번째, 세 번째

나중에야 왜 반복됐는지 알게 됐다. 기술적인 문제가 아니었다. AI가 해결해야 할 문제의 기준이 없었다.

💭 내 머릿속
  • 핸들(—)을 잡으면 시트 높이 조절
  • 리스트를 터치하면 내부 스크롤
  • 지도는 지도대로 작동
  • 이 셋은 서로 간섭하지 않을 것
💬 실제로 한 말

"바텀시트 만들어줘.
드래그로 크기 조절이 되게."

— 이게 전부였다

사람 입장에서는 "핸들로만 조절하는 것"이 너무 당연해서 말할 생각을 못 했다. 스마트폰을 쓰는 사람이라면 누구나 저 긴 막대기를 잡고 위아래로 당기는 게 뭘 하는 건지 안다. 앱을 쓰다 보면 자연스럽게 체득한 UI 언어다.

하지만 AI에게 그 언어는 당연하지 않았다. 명시적으로 전달되지 않은 것은 존재하지 않는 것이나 마찬가지였다. 그래서 AI는 바텀시트 전체를 드래그 가능하게 만들었고, 그게 리스트 스크롤을 죽이는 원인이 됐다.

당연하지 않다

이 경험에서 배운 건 생각보다 범위가 넓었다.

"사람에게 당연한 것이 AI에게는 당연하지 않다. 그리고 어쩌면, 사람 사이에서도 당연한 건 없을지 모른다."

UI 인터랙션만의 이야기가 아니다. 기획에서 개발자에게 넘기는 기능 명세, 디자이너가 개발자에게 전달하는 시안, 팀원 간에 오가는 모든 커뮤니케이션이 마찬가지다. 내가 머릿속에 그리는 것과 상대방이 이해하는 것 사이의 간격은, 우리가 생각하는 것보다 훨씬 크다.

AI와 일하면서 이걸 특히 선명하게 느꼈다. 사람과 소통할 때는 맥락과 경험이 빈틈을 메워준다. AI에게는 그 메우는 장치가 없다. 내가 말하지 않은 것은 정말로 없는 것이 된다.

그래서 지금은 AI에게 기능을 요청할 때 "어떻게 동작해야 하는지"까지 함께 쓴다. 당연해 보이는 것도 전부. 그게 번거로워 보여도, 세 번 다시 만드는 것보다는 훨씬 빠르다.


이 경험에서 배운 것

UI를 AI에게 맡길 때는 "무엇을 만들어달라"는 것과 함께 "어떻게 동작해야 하는지"의 인터랙션 명세까지 주어야 한다.

사용자가 체득한 UI 언어 — 핸들로 조절, 리스트로 스크롤, 지도는 지도대로 — 는 AI가 기본값으로 알고 있지 않다.

당연한 것을 당연하다고 여기지 않는 것, 그게 바이브 코딩에서 사람이 해야 할 가장 중요한 일 중 하나다.

← 이전 글: PC로 시작한 지도 앱 다음 글: 엑셀의 ? 하나, 수십 번의 시도 →