Slack에 올린 운동 사진, 한 번만 기록하기

Slack에서 운동 기록을 받는다고 하면, 얼핏 메시지 하나를 읽고 저장하면 끝날 것 같아요.

그런데 사진이 들어오면 이야기가 조금 달라집니다. 운동 기록을 적은 캡션이 있고, 이미지 파일이 있고, 이미지를 읽어낸 결과도 있습니다. 같은 사진 한 장에서 텍스트와 이미지 분석이 각각 움직이기 시작하면, 결국 같은 내용을 여러 번 처리할 수 있게 됩니다.

Teddy에 Slack 이미지 업로드 처리를 붙이고, 이미지 분석 결과를 PT 기록 저장으로 연결했습니다. 체중이나 체지방 수치가 담긴 캡처, 운동 기록 이미지처럼 텍스트만으로는 다루기 어려운 입력도 기록 흐름 안으로 넣기 위한 작업이었어요.

문제는 이미지 메시지에 붙은 텍스트였습니다. Slack에서는 이미지와 함께 적은 캡션이 있고, 이 텍스트는 별도 텍스트 이벤트 경로에서도 처리될 가능성이 있습니다. 이미지 분석을 통해 한 번, 텍스트 메시지 처리로 또 한 번 기록 저장까지 이어질 여지가 생긴 거죠.

같은 사진에서 기록이 중복될 가능성이 있는 구조였습니다.

그래서 이미지 메시지에서 파생된 텍스트는 별도로 중복 처리되지 않도록 이벤트 처리 경로를 분리했습니다. 여기에 건강 기록을 저장하는 단계에서도 같은 기록의 중복 삽입을 막는 처리를 추가했고, 여러 장의 이미지와 캡션을 함께 다루는 이미지 번들 쪽에도 중복을 줄이는 필터를 보완했습니다.

입력이 어디를 거쳐 저장되는지 구분해야 했습니다. 텍스트, 이미지, 분석 결과가 모두 기록으로 이어질 수 있으니, 각 경로가 서로를 모른 채 같은 데이터를 넣으면 안 됐어요.

날짜도 따로 다뤄야 했습니다. 이미지를 분석한 날과 이미지 속 수치가 실제로 기록된 날은 다를 수 있습니다. 예를 들어 운동 뒤에 바로 올린 사진인지, 며칠 뒤에 정리해서 보낸 캡처인지에 따라 저장할 날짜가 달라집니다.

이미지 번들에서는 기록 날짜를 해석하는 흐름을 추가하고, 캡션에 날짜가 있으면 그 값을 저장에 적용하도록 했습니다. 이후 Vision 분석 결과에서 관측 날짜가 모호하게 잡힐 수 있는 부분도 정정했습니다. 이미지가 말하는 날짜와 시스템이 이미지를 본 날짜를 같은 것으로 취급하지 않기 위해서예요.

지금 Teddy의 Slack 입력은 텍스트, 이미지, 이미지 번들을 각각 받되, 최종적으로는 같은 건강 기록이 반복 저장되지 않도록 보완된 상태입니다. 날짜 역시 단순 업로드 시각이 아니라 캡션과 번들 정보를 함께 보고 분리해 다룹니다.

다만 기록을 한 번만 남기는 것과, 그 기록을 안전하게 보존하는 것은 다른 문제였습니다. 다음에는 AI 해석이 실패하더라도 원본 건강 데이터까지 같이 사라지지 않게 하려 했던 흐름을 정리해보려고 합니다.

이 프로젝트의 글

이 글과 같은 프로젝트의 기록을 이어서 보려면 프로젝트 태그를 선택해 주세요.