엔지니어링··5분 읽기

늘 울리는 경보는 없는 것보다 나쁘다

CI의 빨간불이 내 잘못이 아닌 날이 반복되면 사람은 빨간불을 읽지 않습니다. 남의 서버와 알려 주지 않은 예외가 두 제품의 CI를 그렇게 만들었습니다.

#CI#테스트#운영#somesignal#DUGOUT 9

CI는 코드를 바꿀 때마다 "이대로 내보내도 되나"를 대신 물어 주는 장치입니다. 그 장치가 가치를 갖는 조건은 하나입니다. 빨간불이 켜지면 사람이 멈춰서 읽는 것. 그 조건이 무너지면 CI는 남아 있어도 아무것도 지키지 않습니다.

최근 두 제품에서 CI가 바로 그 상태였다는 것을 알게 됐습니다. 야구 팬 프로젝트 DUGOUT 9에서는 남의 서버 때문에, 관계를 읽는 서비스 somesignal에서는 제가 일부러 만든 예외 때문에. 원인은 달랐지만 결과는 같았습니다. 빨간불이 흔해지자, 아무도 빨간불을 읽지 않게 됐습니다.

내 잘못이 아닌 빨간불

DUGOUT 9에는 브라우저 감사가 있습니다. 실제 화면을 띄워 리포트가 제대로 그려지는지 보는 검사입니다. 문제는 그 검사가 매 PR마다 리그의 공개 웹사이트를 실제로 읽어 오고 있었다는 것입니다. 문구 하나 고친 PR도 그 사이트가 느린 날에는 빨갛게 됐고, 잡 하나가 10분을 넘겼습니다.

저는 오래 타임아웃을 늘리는 것으로 버텼습니다. 그 방법은 증상을 줄여 주지만, 더 나쁜 것을 가르칩니다. 빨간불이 떴을 때 먼저 드는 생각이 "또 저쪽 사이트겠지"가 됩니다. 그 생각이 몇 번 맞고 나면, 정말 내 코드가 깨진 날에도 같은 생각으로 넘깁니다. 테스트가 남의 가용성에 기대면 그 테스트는 결국 무시됩니다.

그래서 실제 파이프라인이 만든 리포트를 한 번 떠서 픽스처로 고정했습니다. 다만 그대로 저장하지는 않았습니다. 선수 이름과 기사 제목, 링크는 합성값으로 바꿨습니다. 이 제품은 원문을 저장소에 복제하지 않는다는 원칙이 있고, 픽스처라고 그 원칙 밖에 있지는 않기 때문입니다. 감사는 3분대로 줄었고, 같은 코드에는 언제나 같은 결과가 나오게 됐습니다. 외부 의존을 끊는 것은 쉬웠습니다. 끊는 방법이 원칙을 어기지 않는지 따로 확인하는 것이 일이었습니다.

알려 주지 않은 예외

somesignal의 경우는 원인이 저였습니다. 기능을 접으면서 코드는 지우고 데이터베이스의 테이블과 컬럼은 남겼습니다. 이미 저장된 남의 기록을 함부로 지우지 않으려는 판단이었고, 그 판단은 기능을 접는 일은 결정 하나가 아니다에 썼습니다. 그 글에서 빼 둔 뒷이야기가 이것입니다.

스키마 검사 도구는 코드와 데이터베이스를 비교합니다. 도구 입장에서 코드에 없는 테이블은 지워야 할 차이입니다. 제가 일부러 남긴 불일치를 도구는 매번 "지워라"고 보고했고, CI는 몇 달 동안 빨간 상태로 있었습니다. 빨간불이 상수가 되자 아무도 그 신호를 읽지 않았습니다. 그 사이 화면이 보내는 분석 이벤트 두 개가 서버에서 거절당하고 있었는데, 몇 달 동안 아무도 몰랐습니다. 진짜 문제는 이미 켜져 있는 빨간불 아래에 숨어 있었습니다.

예외는 숨기지 않고 적는다

가장 짧은 해결책은 검사를 끄는 것이었습니다. 한 줄이면 됩니다. 하지만 그러면 다음 사람이 진짜 스키마 사고를 볼 수 없게 됩니다. 검사를 느슨하게 하는 것도 같은 문제를 조금 늦출 뿐입니다.

그래서 버린 스키마의 이름을 파일 하나에 적고, 그 이름들만 비교에서 뺐습니다. 그리고 그 목록을 테스트로 고정했습니다.

  • 목록을 늘리려면 테스트도 함께 고쳐야 합니다.
  • 살아 있는 테이블을 목록에 적으면 테스트가 즉시 실패합니다.
  • 예외가 무엇인지는 파일 하나만 열면 보입니다.

예외를 두되, 예외의 목록은 눈에 보이게, 늘리기는 조금 번거롭게. 의도한 예외를 검증 도구에 알려 주지 않으면 도구는 그것을 매번 문제로 보고하고, 사람은 곧 보고 전체를 무시하는 법을 배웁니다. 예외를 알려 주는 일은 검사를 약하게 만드는 것이 아니라 검사가 다시 읽히게 만드는 일이었습니다.

경보의 가치는 읽히는 데 있다

두 사례를 나란히 놓으면 같은 모양이 보입니다. 빨간불이 내 코드와 무관한 이유로 켜지는 날이 쌓이면, 사람은 빨간불과 내 코드 사이의 연결을 끊어 버립니다. 하나는 남의 서버가, 하나는 제가 도구에 알려 주지 않은 판단이 그 연결을 끊었습니다. 늘 울리는 경보는 없는 것보다 나쁩니다. 없으면 만들기라도 하지만, 울리고 있으면 지켜지고 있다고 착각하기 때문입니다.

그래서 이제 CI가 빨간 채로 하루를 넘기면, 그것을 그 자체로 고칠 문제로 봅니다. 빨간불의 원인을 고치든, 도구가 알아야 할 예외를 적어 주든. 검사를 몇 개 갖고 있는지보다, 그 검사가 빨갛게 됐을 때 제가 아직 멈춰 서는지가 더 정확한 척도라고 생각합니다.