일을 실제로 어디서 하는지 한번 떠올려 보세요.

창문 하나 없는 콘크리트 기초 지하실. 스틸 스터드와 외장재만 서 있고 아직 인입 설비도 안 들어온 신축 현장. 마지막 통신탑에서 20분을 더 들어간 외곽 부지. 상업용 건물 한복판의 기계실. 지하 주차장.

이번에는 소프트웨어 시연이 벌어지는 자리를 떠올려 보세요. 와이파이가 잡히는 사무실입니다.

현장 소프트웨어가 말로 설명하기 어려울 만큼 답답한 이유가 바로 이 간극입니다. 앱이 느린 것도, 설계가 나쁜 것도 아닙니다. 진입로에서는 멀쩡히 돌아가다가 지하실에서, 그러니까 정작 필요한 그 자리에서 멈춰 버립니다. 게다가 그 실패는 좀처럼 정직하게 드러나지 않습니다. 대개는 하염없이 도는 로딩 표시, 저장됐다고 해 놓고 실제로는 저장되지 않은 화면, 뒤로 나가면 입력한 내용이 사라지는 양식으로 나타납니다.

실패의 구체적인 유형들

"연결 없음"은 한 가지 문제가 아닙니다. 여러 가지이고, 소프트웨어를 각기 다른 방식으로 망가뜨립니다.

신호가 아예 없는 경우. 가장 깔끔한 경우입니다. 잘 만든 앱은 자신이 오프라인이라는 걸 알고 그에 맞게 움직입니다. 감지가 쉬워서 대부분의 앱이 이 경우는 그럭저럭 처리합니다.

한 칸, 기술적으로는 연결된 상태. 진짜로 사람 잡는 경우입니다. 기기가 연결됐다고 하니 앱은 서버에 접속을 시도하고, 요청은 그대로 매달린 채 멈춥니다. 40초 동안 로딩 표시가 돌다가 시간 초과가 나거나, 더 나쁘게는 절반만 처리된 요청이 남습니다. "네트워크가 잡히나"만 확인하고 "이 요청이 실제로 성공했나"는 확인하지 않는 소프트웨어가 여기서 가장 크게 무너집니다.

신호가 오락가락하는 경우. 진입로와 지하실을 하루에도 네 번씩 오갑니다. 오갈 때마다 동기화가 중간에 끊길 여지가 생깁니다.

연결은 됐지만 느린 경우. 오후 4시, 트래픽이 몰린 외곽 통신탑. 기술적으로는 다 돌아가지만, 속도가 앱을 그만 쓰게 만드는 수준입니다.

정직하게 오프라인을 지원하는 앱이라면 이 네 가지를 모두 감당해야 합니다. 첫 번째만 감당하는 앱은 결국 작업 내용을 잃어버립니다.

콘크리트 계단실에서 일하는 현장 기술자 옆으로 대기 중인 업로드 항목이 보이는 휴대폰 화면

"오프라인에서 작동한다"는 말은 실제로 무엇을 뜻해야 할까요?

이 문구는 아주 느슨하게 쓰입니다. 제대로 따져 볼 기준이 있고, 조건은 네 가지입니다.

읽기가 됩니다. 연결이 전혀 없어도 작업을 열어 주소, 작업 범위, 고객 전화번호, 어제 찍은 사진까지 볼 수 있어야 합니다. 그때그때 임시로 받아 둔 캐시가 아니라 데이터가 실제로 기기에 저장돼 있다는 뜻입니다.

쓰기가 되고, 그 기록이 살아남습니다. 메모를 추가하고, 근무 시간을 기록하고, 지출을 남기고, 사진을 찍을 수 있어야 합니다. 그리고 휴대폰가 꺼지든, 앱이 강제 종료되든, 추운 데서 배터리가 나가든, 다시 켰을 때 그 내용이 그대로 남아 있어야 합니다. 메모리에만 담긴 것은 저장된 것이 아닙니다.

동기화가 자동으로, 눈에 띄지 않게 이뤄집니다. 신호가 돌아오면 대기 중이던 것들이 알아서 올라갑니다. 동기화 버튼을 눌러야 한다는 걸 기억하고 있을 필요가 없어야 합니다. 딱 한 번 깜빡하는 그날이 하필 그게 중요해지는 날이니까요.

충돌을 정직하게 알려 줍니다. 두 사람이 각자 오프라인 상태에서 같은 작업을 고쳤습니다. 좋은 소프트웨어는 이를 감지해 알려 줍니다. 나쁜 소프트웨어는 조용히 한쪽만 남기고, 몇 주 뒤에야 메모 하나가 사라진 걸 알게 됩니다.

이 마지막 조건이 가장 쉽게 건너뛰는 부분이고, 오프라인을 그럭저럭 견디는 앱과 오프라인을 기본으로 놓고 만든 앱을 가르는 차이입니다. 충돌을 감지하려면 앱이 모든 레코드의 버전을 따라가다가 다시 연결됐을 때 서로 비교해야 합니다. 눈에 보이는 기능은 하나도 나오지 않는 진짜 개발 작업이고, 그래서 흔히 생략됩니다.

사진을 따로 떼어 이야기하는 이유

사진은 현장 소프트웨어에서 오프라인 지원이 가장 어려운 부분이면서, 동시에 현장 기술자가 현장에서 가장 남겨야 하는 것이기도 합니다. 착수 전 기존 손상, 벽 뒤 상태, 완료된 작업, 계량기 수치, 자재 입고 같은 것들 말입니다.

사진이 어려운 이유는 용량이 크기 때문입니다. 작업 한 건 분량의 원본 해상도 사진이면 수십 메가바이트입니다. 신호가 한 칸이면 그 업로드는 실패합니다. 그것도 계속해서요. 사진을 다른 레코드와 똑같이 다루는 앱은 업로드를 기다리며 멈춰 서거나 아예 사진을 버립니다.

그러지 않으려면 이렇게 돌아가야 합니다. 사진은 찍는 즉시 기기에 저장돼 작업에 붙고, 업로드는 별도의 백그라운드 작업으로 넘어가 앱을 다시 켜도, 필요하면 며칠에 걸쳐서도 계속 재시도합니다. 사진은 서버에 올라갔든 아니든 찍은 그 순간부터 앱 안에서 바로 쓸 수 있어야 합니다.

조심해야 할 유형은 기기에서는 사진이 잘 보이는데 조용히 한 번도 올라가지 않는 앱입니다. 노트북에서 그 작업을 열어 보거나 휴대폰를 잃어버리기 전까지는 다 정상으로 보이는데, 알고 보면 그 사진들은 처음부터 기기에만 있었던 겁니다.

완료된 작업을 휴대폰로 촬영하는 현장 기술자

이게 없으면 무엇을 잃게 될까요

눈에 보이는 비용은 작고 꾸준합니다. 한 번 겪을 때마다 몇 분씩 날아가고, 한 칸이라도 잡으러 진입로까지 걸어 나갑니다.

진짜 비용은 사람들의 행동에서 나타납니다. 두 번 데이고 나면 현장에서 앱을 믿지 않게 됩니다. 다시 종이쪽지에 근무 시간을 적어 금요일 밤에 몰아 입력하고, 영수증은 정리되지 않는 사진첩에 쌓아 두고, 진짜 일정은 머릿속에만 넣어 둡니다. 소프트웨어는 여전히 깔려 있고 요금도 계속 나가는데, 회사는 다시 기억력으로 굴러갑니다.

한번 그렇게 되면 그 뒤로는 줄줄이 무너집니다. 비용이 작업에 붙지 않으니 작업원가 관리가 멈춥니다. 일이 정말 끝났는지 아무도 확신하지 못하니 청구서 발행이 밀립니다. 이 시스템 전체의 가치는 일하는 그 순간에 데이터가 남는다는 전제 위에 있었는데, 오프라인 실패가 바로 그 전제를 무너뜨립니다.

도입 전에 어떻게 미리 확인할 수 있을까요?

기능 목록만 봐서는 알 수 없습니다. 누구나 "오프라인에서 작동합니다"라고 써 놓으니까요. 대신 10분이면 직접 확인해 볼 수 있습니다.

  1. 휴대폰를 비행기 모드로 바꾸세요.
  2. 한동안 열지 않았던 작업을 엽니다. 사진까지 포함해 끝까지 열리나요?
  3. 메모를 추가하고, 근무 시간을 기록하고, 지출을 남기고, 사진 세 장을 찍으세요.
  4. 앱을 강제 종료했다가 다시 여세요. 방금 한 것이 전부 그대로 있나요?
  5. 연결을 되살리세요. 아무것도 누르지 않아도 알아서 동기화되나요?
  6. 진짜 시험은 이제부터입니다. 와이파이는 켜되 인터넷이 안 되는 네트워크에 붙여서, 휴대폰가 연결은 있다고 하지만 실제로는 통하지 않는 상태로 만드세요. 3단계를 그대로 반복합니다. 비행기 모드는 통과하던 앱들이 여기서 무더기로 무너집니다.

여섯 가지를 다 통과한다면, 지하실에 직접 들어가 본 사람들이 만든 앱이라는 뜻입니다.

Zeus는 처음부터 이렇게 설계했습니다. 앱이 기기에 완전한 로컬 데이터베이스를 두기 때문에 작업, 고객, 가격 정보를 연결 없이도 읽을 수 있습니다. 입력하는 내용은 먼저 로컬에 기록된 뒤 신호가 돌아오면 동기화됩니다. 사진은 찍는 즉시 기기에 저장되고, 사진 백업이 포함된 요금제에서는 백그라운드에서 재시도까지 하며 올라갑니다. 하루치 사진이 데이터 요금을 잡아먹지 않도록 와이파이에서만 올리는 옵션도 있습니다. 두 기기에서 엇갈린 수정은 조용히 덮어쓰지 않고 감지해서, 동기화 상태에 표시해 직접 정리하게 합니다.

자주 묻는 질문

모든 걸 휴대폰에 저장하면 용량을 많이 잡아먹지 않나요?

텍스트 기록은 아주 작습니다. 작업, 고객, 항목을 수천 건 합쳐도 몇 메가바이트 수준입니다. 용량을 실제로 차지하는 건 사진뿐이고, 그래서 대개 따로 관리합니다. 업로드가 끝나면 원본 해상도 사진은 클라우드에 둡니다.

휴대폰를 잃어버리거나 도난당해도 안에 있는 데이터는 안전한가요?

앱마다 다르니 직접 물어볼 만한 질문입니다. 확인할 것은 두 가지입니다. 로컬 데이터베이스를 암호화하는지, 그리고 휴대폰 자체 잠금에만 기대지 않고 앱에도 잠금이 걸리는지입니다. Zeus는 로컬 데이터베이스를 암호화하고, 기기의 생체 인증이나 PIN을 쓰는 앱 잠금 기능도 선택 사항으로 제공합니다.

두 팀원이 오프라인 상태에서 같은 작업을 고치면 어떻게 되나요?

제대로 만든 시스템이라면 두 번째 기기가 동기화될 때 충돌을 잡아내고, 사람이 직접 정리하도록 화면에 띄웁니다. 그런 일은 절대 없다고 장담하는 앱은 경계하세요. 나중에 쓴 것이 이기는 방식이 흔한 구현인데, 그러면 누군가의 작업이 아무 말 없이 사라집니다.

현장으로 나가기 전에 수동으로 동기화해야 하나요?

그럴 필요가 없어야 하고, 그래야 한다면 그것 자체가 경고 신호입니다. 신호가 잡히는 동안 동기화는 백그라운드에서 계속 이뤄져야 합니다.