오전에 이슈가 올라왔다.

FocusTogether는 웹 기반으로 동작하는 서비스이다 보니 사용자가 브라우저를 닫거나 혹은 노트북을 닫거나, 휴면 상태로 전환되면 로컬에서의 동작이 멈추는 문제가 있었다.
물론 다시 브라우저를 열고 FocusTogether에 접근하면 기존의 시간과 데이터를 가져와 이어서 동작하지만 그 사이에 서버와 DB에는 데이터가 반영되지 않는 문제가 있었다.
때문에 만약 사용자가 작업 종료를 깜빡하고 잠에 들거나 혹은 브라우저를 닫아버렸다면 실제로는 집중한 시간이 아님에도 하염없이 시간이 누적되는 상황이 발생할 수 있다.
하지만 이 상황을 세세하게 통제하기는 어렵다. 그렇다고 사용자에게 잔소리를 할 수도 없는 노릇이고...

이 문제를 그나마 보완하기 위해서, 일정 시간 동안 로컬에서 서버로 신호가 오지 않는다면(현재는 1분 단위로 하트비트 신호를 보내고 있다) 그 작업을 자동 종료 처리하면 좋겠다는 생각이 들었다.
자동 종료 처리 구현
문제가 되는 상황은 사용자의 PC에서 FocusTogether가 정상적으로 동작하지 않고 있는 상태이다.
FocusTogether는 1분 단위로 하트비트 신호를 서버로 보내고 있는데, 이때 last_heartbeat_at 컬럼에는 마지막 하트비트를 보낸 시각이 기록된다.
이 last_heartbeat_at 를 기준으로 일정 시간 동안 하트비트가 끊어진 작업의 경우 종료처리하는 워치독(감시견) 함수를 구현했다. 워치독 함수는 특정 시간마다 실행되도록 크론잡을 적용하여 주기적으로 이런 불량(?) 작업들을 처리하도록 구현했다.
이 과정을 시퀀스 다이어그램으로 표현하면 아래와 같다.

이제 서버와 DB는 불량(?) 작업들을 자동 종료 할 수 있게 되었다.
사용자에게 알리기
서버가 불량(?) 작업들을 자동 종료하면서 DB에는 잘 반영이 되었다. 그렇다면 사용자가 다시 FocusTogether로 돌아오면 어떻게 될까?
사용자 화면에는 아직도 이전 작업이 진행 중인 상태로 나타난다. 왜냐하면 DB의 데이터는 바뀌었지만 클라리언트는 현재 로컬의 데이터를 기반으로 동작하기 때문이다. 때문에 여기서 데이터 불일치, 정합성 문제가 발생한다.
데이터의 일관성을 확보하고 사용자에게 현재 상황을 알리기 위해 몇 가지 작업이 더 필요했다.
먼저 사용자가 FocusTogether를 새로 열거나 새로고침을 할 때, 진행 중인 작업이 있다면 해당 작업에 대한 정보를 서버로부터 받아오도록 했다. 받아온 데이터가 로컬의 데이터와 다르다면 작업 종료 여부를 확인하고 로컬의 데이터를 덮어씌우는 형태로 동기화 했다.
이때, 사용자는 지난 작업에 대해 기억을 못 할 가능성이 높으므로 무슨 상황인지 알기 어려울 것이다. 때문에 아래 이미지처럼 자동 종료에 대한 안내를 보여주기로 했다.

위 이미지는 사용자가 작업 종료를 누락한 이후, 나중에 다시 접속하면 마주치게 되는 화면이다. 이 화면을 마주하면 사용자는 내가 직전에 했던 작업이 무엇이고 언제 자동 종료가 되었는지 알 수 있다.
이 종료 시간은 아무래도 정확하지 않을 것이다. 그전에 끝났을 수도 있고, 혹은 더 오래 했을 수도 있다. 때문에 '종료 시간 수정' 기능을 통해 사용자가 직접 집중했던 작업 시간을 변경할 수 있다. 단, 어뷰징 우려로 기존 종료 시간보다 이후 시간으로 수정할 수는 없다.
이렇게 하면 작업 종료를 깜빡하더라도 작업 시간이 무한정 늘어나지 않도록 막아주어 시간을 보정할 수 있다. DB와 로컬 데이터를 동기화하고 '자동 종료 안내'를 통해 현재 상황을 사용자에게 알릴 수 있다.
작업 후기
개발을 하고 기능이 추가될수록 점점 경우의 수와 복잡도가 늘어나고 있다.
현재는 대부분 로컬 기반으로 로직들이 구현되어 있지만 추후 로그인 기능이 들어오고 기기 동기화 기능이 추가된다면 데이터 흐름에 큰 변화가 있을 것 같다. 이 글에 작성한 내용들도 바뀔 가능성이 높다.
이 정도로 하나의 서비스를 고도화한 경험은 이번이 처음이다. 그만큼 지금까지 가벼운 서비스만 만들었다는 의미겠지. 이제는 하나의 제품을 총괄하는 입장에서 점점 더 멀리 바라봐야 한다는 생각이 든다.
지금 내려야하는 의사 결정이 엄청난 힘을 가지고 있다는 게 실감이 난다. 앞으로 추가할 기능들도 장기적인 관점에서 신중히 생각하고 결정해야 한다.
당신도 함께 집중하고 싶다면?👇
'나는 이렇게 일한다 > FocusTogether 개발일지' 카테고리의 다른 글
| 구글 로그인 : 기기 간 동기화를 위한 소셜 로그인 (0) | 2025.09.18 |
|---|---|
| 포커스 라운지 : 우리가 함께 집중하는 모습 (2) | 2025.09.10 |
| 주간 리포트 : 지난 한 주 얼마나 집중했을까? (0) | 2025.09.07 |
| 시간 단위 변경 : (분) 단위 에서 (시, 분) 단위로 (0) | 2025.09.04 |
| 작업 카드, 연속 스트릭, 사용자 수, 고객문의 기능, 그리고 힘든 점 (0) | 2025.09.03 |