본문 바로가기
나는 이렇게 일한다/FocusTogether 개발일지

지금 이 순간도 우린 함께하고 있다고요!

by daco2020 2025. 8. 29.

우리의 집중 시간을 실시간으로 집계하자

FocusTogether는 우리가 함께 집중하고 있다는 느낌을 주는 것이 핵심 가치이다.

 

이를 위해 헤더 영역에서 현재 몇 명이 몇 분 동안 작업을 하고 있는지 보여주고 있었다.

 

하지만 이것은 사용자가 작업을 종료해야 반영이 되는 데이터였기 때문에 만약 사용자가 작업을 종료하지 않고 계속 집중하고 있다면 아무도 현재 사용하지 않는 것처럼 표시되는 문제가 있었다.

 

 

4분 동안 집중을 했지만 진행중인 시간은 헤더에 반영되지 않고 있었다. 164분 + 4분이 더해져 168분으로 표시되어야 사용자는 실시간으로 집계가 되는 것으로 느껴질 것이다.

 

개인적으로 이 문제가 계속 마음에 걸렸다. 그래서 현재 집중 중일지라도 집계가 되도록 변경을 하기로 했다.

 

 

완료 따로, 진행 중 따로

기존에는 완료 작업 세션을 DB에 저장하고 이를 DB 트리거를 통해 합계를 집계하고 있었다.

 

첫 번째 시도한 방법은 기존 로직은 그대로 두고 진행 중인 시간을 따로 계산해 사용자에게 합산하여 보여주는 방식이었다. 이 방식은 15초 단위로 값을 경신했는데, 한 가지 문제가 있었다.

 

작업을 완료하면 즉시 트리거에 의해 집계 값이 갱신되는데, 그 사이에 진행 분의 값도 유지되어 있어 일시적으로 작업 시간이 중복 집계되고 있었다. 즉, 위의 이미지를 예시로 들자면 168분이 최종 집계로 나타나야 하지만 일시적으로 172분으로 표시되는 문제가 있었다.

 

이 문제를 해결하려다 보니 완료 작업 세션과과 진행 중인 작업 세션을 분리할 필요가 있는가 생각이 들었다. 기존 시간 집계 방식을 포기하고 새로운 집계 방식을 구현해 보기로 했다.

 

 

어떤 작업이든 통합하여 집계하기

완료 작업이든, 현재 진행중인 작업이든 상관없이 분 단위로 값을 하나의 테이블에 업데이트하도록 변경했다. 이렇게 변경하니 로직이 보다 단순해졌다.

 

완료 작업 세션이 업데이트 되면 DB 트리거가 동작했었는데 이 트리거를 제거하고 RPC(Remote Procedure Call)를 이용하여 집계 요청을 보내도록 했다.

 

트리거에서 RPC로 변경한 이유는 RPC는 API 레벨에서 제어할 수 있지만 트리거는 테이블 변경이 발생할 때마다 실행되어 제어가 어렵다는 문제가 있었다. 이런 관점에서 RPC가 더 유리하다고 판단했다.

 

아래는 영상은 30초 차이로 실행한 모습이다.

 

1분이 지나고 나서 헤더의 분 값이 올라가는 것을 볼 수 있다.

 

작업 마치기를 통해 진행중 작업을 완료 작업으로 변경하더라도 헤더의 값이 추가로 집계되는(중복 집계) 문제가 발생하지 않는다. 내가 원하는 모습이다.

 

 

작업 후기

처음 서비스를 만들 때에는 대충 완료한 작업만 계산하면 되지 않을까 싶었는데, 막상 이것을 다시 수정하려고 하니 골치가 아팠다. 집계 방식을 새로 구현해야 한다는 생각이 귀찮게 느껴졌다.

 

하지만 지금 이 순간 우리가 함께하고 있다는 느낌을 위해서는 실시간성을 보여주어야한다고 판단했다. 그리고 결국 원하는 결과를 얻은 것 같아 뿌듯하다.