지도와 스크롤이 충돌하다 —
모바일 바텀시트를 세 번 만든 이유
세 줄짜리 요청에서 시작됐다
Pet-Pass는 지도 위에 매장을 표시하는 서비스다. 모바일에서 지도를 꽉 채워 보여주면서도, 매장 목록을 같이 보여줘야 했다. 그래서 바텀시트가 필요했다. 화면 아래에서 올라오는, 드래그로 크기를 조절할 수 있는 그 패널.
AI에게 전달한 요청은 간단했다.
내가 당연하다고 생각한 것들을 하나도 말하지 않았다. 그냥 "바텀시트"라는 단어만 던졌다.
첫 번째 바텀시트 — 결과는 그럴싸했다
AI(Antigravity)는 성실하게 바텀시트를 만들었다. 화면 아래에서 올라오고, 드래그로 높이가 조절됐다. 처음 봤을 때는 "됐다"고 생각했다.
데스크탑에서 테스트했으니까.
지도가 내 손가락을 먹었다
실제 핸드폰으로 열었을 때 바로 이상함을 느꼈다. 매장 목록을 위로 올리려고 손가락을 대면, 리스트가 스크롤되는 게 아니라 지도가 움직였다. 터치 이벤트가 바텀시트를 통과해서 뒤에 있는 지도까지 전달되고 있었다.
이건 모바일 지도 서비스에서 흔히 겪는 문제다. 지도 라이브러리는 터치 이벤트를 전부 자기 것으로 가져가려고 하고, 그 위에 뭔가를 올려두면 이벤트가 뒤섞인다.
바텀시트 전체에 touch-action: none을 적용. 지도로의 이벤트 누출은 막혔지만, 이번엔 리스트 안에서 스크롤이 완전히 죽어버렸다.
HTML 구조 문제도 있었다. 스티키 헤더가 리스트 전체를 감싸는 바람에 드래그 로직과 충돌. 구조를 분리하고 핸들 영역에만 touch-action을 걸었지만 여전히 최상단에서 아래로 내려오지 않는 문제가 남았다.
핸들(—)에만 드래그 이벤트를 묶고 나머지 리스트는 자유롭게 두는 방식으로 재설계. 접근 방향은 맞았지만 구현 세부 조건이 틀려서 최상단 고착 문제가 완전히 해결되지 않았다.
세 번의 시도가 이어지는 동안 나는 계속 같은 방식으로 요청했다. "아직도 최상단에서 내려오지 않아." AI는 매번 새로운 코드를 짰고, 매번 다른 지점에서 막혔다.
두 번째, 세 번째
나중에야 왜 반복됐는지 알게 됐다. 기술적인 문제가 아니었다. AI가 해결해야 할 문제의 기준이 없었다.
- 핸들(—)을 잡으면 시트 높이 조절
- 리스트를 터치하면 내부 스크롤
- 지도는 지도대로 작동
- 이 셋은 서로 간섭하지 않을 것
"바텀시트 만들어줘.
드래그로 크기 조절이 되게."
— 이게 전부였다
사람 입장에서는 "핸들로만 조절하는 것"이 너무 당연해서 말할 생각을 못 했다. 스마트폰을 쓰는 사람이라면 누구나 저 긴 막대기를 잡고 위아래로 당기는 게 뭘 하는 건지 안다. 앱을 쓰다 보면 자연스럽게 체득한 UI 언어다.
하지만 AI에게 그 언어는 당연하지 않았다. 명시적으로 전달되지 않은 것은 존재하지 않는 것이나 마찬가지였다. 그래서 AI는 바텀시트 전체를 드래그 가능하게 만들었고, 그게 리스트 스크롤을 죽이는 원인이 됐다.
당연하지 않다
이 경험에서 배운 건 생각보다 범위가 넓었다.
"사람에게 당연한 것이 AI에게는 당연하지 않다. 그리고 어쩌면, 사람 사이에서도 당연한 건 없을지 모른다."
UI 인터랙션만의 이야기가 아니다. 기획에서 개발자에게 넘기는 기능 명세, 디자이너가 개발자에게 전달하는 시안, 팀원 간에 오가는 모든 커뮤니케이션이 마찬가지다. 내가 머릿속에 그리는 것과 상대방이 이해하는 것 사이의 간격은, 우리가 생각하는 것보다 훨씬 크다.
AI와 일하면서 이걸 특히 선명하게 느꼈다. 사람과 소통할 때는 맥락과 경험이 빈틈을 메워준다. AI에게는 그 메우는 장치가 없다. 내가 말하지 않은 것은 정말로 없는 것이 된다.
그래서 지금은 AI에게 기능을 요청할 때 "어떻게 동작해야 하는지"까지 함께 쓴다. 당연해 보이는 것도 전부. 그게 번거로워 보여도, 세 번 다시 만드는 것보다는 훨씬 빠르다.
이 경험에서 배운 것
UI를 AI에게 맡길 때는 "무엇을 만들어달라"는 것과 함께 "어떻게 동작해야 하는지"의 인터랙션 명세까지 주어야 한다.
사용자가 체득한 UI 언어 — 핸들로 조절, 리스트로 스크롤, 지도는 지도대로 — 는 AI가 기본값으로 알고 있지 않다.
당연한 것을 당연하다고 여기지 않는 것, 그게 바이브 코딩에서 사람이 해야 할 가장 중요한 일 중 하나다.