AI로 1인 개발팀 만들기 ep.2 — 해시태그 하나로 사진 자동 분류

ep.1에서 텔레그램 봇으로 폰과 PC를 연결했다. 사진을 보내면 로컬에 저장되는 구조. 근데 실제로 쓰다 보니 불편한 점이 바로 나왔다.

사진 3장 보냈는데 1장만 분류된다

텔레그램에서 사진을 여러 장 선택해서 한번에 보내면, 캡션(해시태그)은 첫 번째 사진에만 붙는다. 나머지는 캡션 없이 온다. 봇 입장에서는 첫 장만 태그가 있으니 blog 폴더로 가고, 나머지 2장은 태그가 없으니 general로 빠지는 거다.

밖에서 밥집 사진 5장 찍어서 #밥로그 붙여서 보냈는데, 돌아와서 보면 1장만 blog에 있고 4장은 general에 흩어져 있다. 이러면 의미가 없다.

미디어 그룹이라는 개념

텔레그램은 여러 장을 한번에 보내면 내부적으로 media_group_id라는 값을 붙여준다. 같은 묶음이면 같은 ID를 공유한다. 이걸 이용하면 된다.

로직은 간단하다. 첫 번째 사진에서 캡션과 태그를 파싱하면, 그 media_group_id를 키로 태그를 캐싱해둔다. 같은 그룹의 나머지 사진이 들어오면 캡션이 없더라도 캐시에서 태그를 가져온다.

// 미디어 그룹 태그 캐시
const mediaGroupTags = new Map<string, { tag: string; memo: string }>();

function resolveTag(caption, mediaGroupId) {
  const parsed = parseTag(caption);

  if (mediaGroupId) {
    if (caption) {
      // 캡션 있는 첫 번째 사진 → 그룹 태그 저장
      mediaGroupTags.set(mediaGroupId, parsed);
      return parsed;
    }
    // 캡션 없는 나머지 → 같은 그룹 태그 사용
    return mediaGroupTags.get(mediaGroupId) || parsed;
  }
  return parsed;
}

30초 후 자동 삭제해서 메모리 누수도 방지한다. 텔레그램이 같은 그룹의 메시지를 보내는 데 보통 1~2초면 충분하니까 30초면 넉넉하다.

블로그 안에서도 분류가 필요하다

사진이 전부 blog 폴더에 들어가는 건 해결했는데, 또 다른 문제가 생겼다. 밥집 사진이랑 나들이 사진이 전부 blog/ 한 폴더에 섞인다. 글 쓸 때 어떤 사진이 어떤 글용인지 찾기가 번거롭다.

그래서 서브 태그를 만들었다. 기존 #blog 대신 더 구체적인 태그를 쓰면 하위 폴더로 나뉜다.

태그 저장 경로 용도
#밥로그 blog/bablog/ 맛집 사진
#오늘로그 blog/todaylog/ 외출/나들이
#blog blog/ 기타 블로그

구현은 태그 매핑 테이블 하나 추가한 거다. 핵심은 구체적인 태그를 먼저 매칭하는 순서다. #밥로그#blog보다 먼저 체크되어야 #밥로그가 blog로 빠지지 않는다.

const TAG_FOLDERS = {
  '#밥로그': 'blog/bablog',
  '#오늘로그': 'blog/todaylog',
  '#blog': 'blog',
  '#office': 'office',
  '#app': 'app',
  '#dev': 'dev',
};

실제 사용 흐름

이제 밖에서 밥집을 갔다고 치면 이렇게 된다.

1. 폰에서 사진 5장 선택 → 캡션에 #밥로그 → 전송

2. 봇이 5장 전부 같은 폴더에 저장

~/telegram/blog/bablog/2026-02-17/
├── 1708123456789.jpg
├── 1708123456790.jpg
├── 1708123456791.jpg
├── 1708123456792.jpg
└── 1708123456793.jpg

3. 집에 와서 블로그 글 쓸 때 — bablog 폴더만 열면 오늘 찍은 밥집 사진만 모여 있다. general이랑 섞이지 않으니 정리할 필요가 없다.

나들이 사진은 #오늘로그, 개발 관련 스크린샷은 #dev, 사무 문서는 #office. 폰에서 보낼 때 태그 한 단어만 붙이면 알아서 분류된다.

작은 개선이 쌓이면

ep.1에서 만든 건 “사진을 보내면 저장된다”는 기본 기능이었다. ep.2에서 한 건 그걸 실제로 쓸 만하게 다듬은 거다. 여러 장 전송 지원, 카테고리별 자동 분류. 둘 다 코드 몇십 줄이면 되는 작은 변경인데, 사용 경험은 확실히 달라진다.

근데 아직 이건 “폰 → PC” 단방향이다. 폰에서 사진을 보내는 것만 가능하고, PC에서 작업을 지시하는 건 안 된다. 다음 ep.3에서는 이 방향을 뒤집는다. 폰에서 “일해” 한마디를 보내면 AI가 알아서 분석하고, 계획 세우고, 실행까지 하는 시스템을 만든다.

댓글 남기기