← BLOG✎ 편집

자동화는 조용히 썩는다, 그래서 정기 감사가 필요하다

월요일 아침, 재고 알림이 평소처럼 도착했습니다. 숫자도 멀쩡합니다. 그런데 창고에 가 보니 실제 수량과 한참 다릅니다. 어디서도 빨간불은 안 켜졌습니다. 시스템은 매일 성실하게 돌았는데, 보고 있던 값이 며칠 전에 멈춘 데이터였던 겁니다.

이런 장면, 한 번쯤 겪으신 적 있을 겁니다. 자동화는 요란하게 고장 나지 않습니다. 대개는 조용히 어긋납니다.

에러 없이 어긋나는 버그

자동화의 무서운 점은 멀쩡해 보인다는 데 있습니다. 스크립트는 종료 코드 0으로 끝나고, 알림은 제때 옵니다. 다만 그 알림이 가리키는 진실이 더는 맞지 않을 뿐입니다.

이런 결함은 로그에 안 남습니다. 단일 진실 공급원(SoT)이 둘로 갈라져도 두 곳이 각자 답을 내놓으니, 프로그램은 멈출 이유가 없습니다. 큐에 쌓인 작업이 며칠째 처리를 못 받아도 큐 자체는 살아 있으니, 헬스체크는 초록불을 켭니다. 사람이 직접 들여다보기 전까지 아무 신호도 안 옵니다.

작은 가게의 예약 봇을 떠올려 볼까요. 어느 날 예약 플랫폼이 응답 형식을 살짝 바꿉니다. 봇은 에러 대신 빈 값을 받아 들이고, 사장님 화면에는 "오늘 예약 0건"이 뜹니다. 한가한 날이라 여기고 넘어갑니다. 실제로는 예약이 꽉 찼는데 말입니다. 어디서도 빨간불은 안 켜졌습니다. 그저 들어오는 데이터가 막혔을 뿐인데, 그 막힘은 화면 어디에도 표시되지 않았던 겁니다.

왜 시스템은 침묵 속에 표류하나

도구 하나를 처음 붙일 때는 모든 연결을 손바닥 보듯 압니다. 문제는 그다음입니다. 두 번째 자동화가 얹히고 세 번째가 또 얹힙니다. 그사이 외부 API가 응답 형식을 슬쩍 바꾸고, 누군가 권한을 조정합니다. 각각은 작은 변화입니다.

그렇게 반년이 지나면 아무도 전체 그림을 못 봅니다. 한 자동화의 출력이 다른 자동화의 입력으로 흘러가는 경로를, 머릿속에 다 담은 사람이 없는 겁니다. 손대지 않으면 안전하다고 믿지만, 가만히 둔 시스템이야말로 천천히 표류합니다. 바깥세상은 계속 변하는데 내 자동화의 가정만 그 자리에 멈춰 있으니까요.

작은 팀일수록 이 위험이 큽니다. 만든 사람이 곧 운영자이고, 그 한 사람의 기억이 유일한 문서인 경우가 많습니다.

감사가 드러내는 건 코드가 아니다

여기서 코드 리뷰는 큰 도움이 안 됩니다. 코드 리뷰는 함수 하나가 맞게 짜였는지를 봅니다. 조용한 버그는 함수 안이 아니라 함수와 함수 사이, 시스템과 시스템 사이에 숨어 있습니다.

전체를 한 번 점검하면 그제야 구조 수준의 문제가 떠오릅니다. 두 시스템이 같은 데이터를 다르게 기억하고 있다거나, 한쪽이 보내는 신호를 다른 쪽이 오래전부터 무시하고 있었다거나. 개별 코드는 다 정상인데 연결이 어긋난 상태. 이건 버그 수정보다 아키텍처 진단에 가까운 일입니다.

그래서 점검의 시선이 달라야 합니다. 코드 리뷰가 나무 한 그루의 건강을 본다면, 자동화 감사는 숲 전체에 물이 어떻게 흐르는지를 봅니다. 물길이 끊긴 곳과 두 갈래가 엉킨 곳, 데이터가 어디서 고이고 어디서 새는지를 따라가는 일입니다.

Source of Truth
단일 진실 공급원
같은 값을 두 곳이 따로 기억하고 있지 않은지 본다. 갈라진 SoT가 조용한 불일치의 첫째 원인.
Stale Queue
멈춘 큐
큐는 살아 있는데 처리가 막혀 있지 않은지 본다. 쌓인 작업의 가장 오래된 항목 나이를 확인한다.
Blocked Feed
막힌 피드
외부에서 들어오는 데이터가 끊겼거나 형식이 바뀐 채 흐르고 있지 않은지 본다.
Permissions
권한과 토큰
만료 직전인 토큰, 너무 넓게 열린 권한, 더는 쓰지 않는 접근 키를 점검한다.

감사 주기를 어떻게 설계하나

거창한 절차는 필요 없습니다. 핵심은 정기적으로, 전체를 한 번에 본다는 데 있습니다. 자동화가 누적되는 만큼, 점검도 누적된 전체를 대상으로 삼아야 합니다.

분기에 한 번 반나절이면 작은 팀에는 충분합니다. 자동화 목록을 늘어놓고, 각 시스템이 어디서 데이터를 받아 어디로 보내는지 종이에 그려 보세요. 그 그림에서 끊긴 화살표나 두 번 그려진 상자가 보이면, 그게 바로 다음에 손볼 곳입니다.

점검할 축은 네 가지로 충분합니다. 같은 값을 두 곳이 따로 들고 있지 않은지(SoT), 큐에 며칠 묵은 작업이 없는지, 외부에서 들어오는 피드가 끊기거나 형식이 바뀌지 않았는지, 만료가 임박한 토큰이나 너무 넓게 열린 권한이 없는지. 한 축에 십 분씩만 들여도 한 시간이면 한 바퀴를 돕니다.

발견한 문제는 그 자리에서 다 고치려 들 필요가 없습니다. 오히려 적어 두는 일이 먼저입니다. "A 봇과 B 시트가 재고 수량을 따로 센다" 같은 한 줄이면 됩니다. 구조 문제는 대개 한 번에 손보기 어려우니, 기록해 두고 우선순위를 매기는 편이 낫습니다. 다음 감사 때 그 목록이 출발점이 되어 줍니다.

  1. 01자동화 목록화
  2. 02데이터 흐름 그리기
  3. 03축별 점검(SoT·큐·피드·권한)
  4. 04구조 문제 기록

새 자동화를 붙이는 일에는 다들 열심입니다. 정작 이미 돌고 있는 것들을 다시 들여다보는 일은 미뤄집니다. 자동화에 일을 맡겼다는 건 그 판단을 시스템에 위임했다는 뜻입니다. 위임한 일도 가끔은 들여다봐 주어야 합니다.

다음 분기 캘린더에 반나절만 비워 두세요. 점검하는 그 반나절이, 조용히 어긋난 채 흘러간 석 달을 되찾아 줍니다.

개념 출처
  • Single Source of Truth (SoT)
  • 기술 부채(Technical Debt)
  • 옵저버빌리티(Observability)
이 글 공유