글
전체 글, 최신순.
staging이 없어서 배포할 때마다 장애가 났다
공장 현장의 고처리량 운영 파이프라인에 production과 같은 staging 환경이 없어서, local과 dev에서만 검증한 배포가 검증 없이 prod로 들어갔다. 그 둘이 가렸던 차이가 장애로 드러났다.
·1 분 소요공장을 멈춘 SELECT 한 줄
검증하지 않은 SELECT를 운영에 돌렸다. 라이브러리 캐시 락을 잡았고 해외 공장의 설비가 멈췄다. 그 락을 잡고 있는 게 내 세션이라는 걸 알아차리는 데 15~20분이 걸렸다.
·1 분 소요MDM으로 핸드헬드 단말 묶어 잠그기
MDM 도구로 공장 현장의 핸드헬드 단말 묶음을 원격으로 잠가, 승인된 앱만 실행되게 했다. 사건이라기보다 셋업 작업에 가까웠다 — 남는 교정은 하나뿐이다. 이 잠금은 프로비저닝 단계에 포함됐어야 했고, 그땐 그 단계가 없었다.
·2 분 소요고정된 컬럼 인덱스에 묶인 저장 버튼
데이터 그리드의 저장 버튼이 하드코딩된 컬럼 인덱스를 읽고 있었다. 컬럼 레이아웃이 바뀌자 엉뚱한 컬럼을 저장했다.
·2 분 소요아무도 안 보던 TLS 인증서가 만료됐다
두 시스템을 잇는 채널의 TLS 인증서가 갱신되지 않은 채 만료됐고, 연동이 production에서 끊겼다. 만료일을 지켜보는 건 아무것도 없었다.
·1 분 소요테이블은 완료라는데 실제 일은 안 끝나 있었다
ERP로 보내는 트랜잭션 인터페이스가, 뒤쪽 작업은 실제로 실패했는데도 행을 "성공"으로 찍고 있었다. 로그는 어떤 건 빠지고 어떤 건 두 번 남았다. 무엇이 깨졌는지, 그리고 코드에 없던 한 줄에 대한 짧은 기록.
·2 분 소요한쪽만 바뀐 프로토콜, 그 소식을 못 들은 연동 서버
공장 설비가 통신 방식을 push에서 요청-응답으로 바꿨다. 중간에 있던 연동 서버는 거기에 맞춰 바뀌지 않았고, production에서 연동이 끊겼다.
·1 분 소요잠긴 공장 네트워크에 휴대용 단말기 한 대 붙이기
휴대용 스캐너 한 대를 공장 네트워크에 붙이는 데 여러 접근 제어 계층을 하나씩 통과해야 했다. 그 절차는 어디에도 적혀 있지 않았다.
·1 분 소요돌아갈 망 안이 아니라 망 밖에서 빌드한 안드로이드 앱
공장 폐쇄망에서 돌아갈 안드로이드 앱을 그 망 밖 장비에서 빌드하고, 산출물을 손으로 들고 들어갔다. 안에서 실패해도 빌드한 자리에서는 이유가 보이지 않았다.
·2 분 소요관측할 수 없으면 강제할 수 없다
AI 코딩 어시스턴트에게 '중요한 결정은 이유를 적어라'는 규칙을 걸었다. 며칠 뒤 보니 그 규칙은 강제되고 있지 않았다 — 강제될 수가 없었다. AI 엔지니어링 배경이 없어도 따라올 수 있게, 백엔드 개념(DB 제약·미들웨어·IAM)에 빗대 처음부터 끝까지 풀었다.
·13 분 소요AI에게 위임한 작업을 위한 프로젝트 로그 시스템 만들기
Claude Code에게 위임한 모든 substantive 결정을 기록하는 로깅 시스템의 라이브 빌드 — 작성자 판단 미스를 잡는 trigger 레이어, 다중 satellite 프로젝트를 하나의 timeline으로 모으는 cross-repo aggregation, 검증된 framework에서 가져온 tiered 결정 템플릿, 그리고 내가 모든 항목을 일일이 적지 않으면서도 loop에서 빠지지 않게 하는 human-annotation surface까지.
·14 분 소요Claude Code 프로젝트에 자동 작업 로그 10분 안에 깔기
Claude가 non-trivial한 fix·결정·회고를 자동으로 기록하게 만드는 복붙 셋업. 할루시네이션 없이.
·18 분 소요