craftrun

굴리기

수집은 되는데 화면은 그대로였다

매일 자동으로 데이터를 모으고 있었는데 화면의 숫자는 몇 달째 같았습니다. 사람이 옮겨 적는 단계가 하나 끼어 있었기 때문입니다.

매일 자동으로 데이터를 모으는 작업을 여러 개 굴리고 있습니다. 주가, 보조금 잔여량, 공고 목록 같은 것들입니다. 수집은 잘 돌았고, 실패하면 알림도 왔습니다.

어느 날 화면에 뜬 숫자가 이상해서 확인해 봤더니, 몇 달 전 값이었습니다.

데이터 파일에는 최신 값이 들어 있었습니다. 수집은 멀쩡히 되고 있었습니다. 그런데 화면에는 반영되지 않았습니다.

사람이 옮겨 적는 단계

원인은 단순했습니다. 그 숫자가 화면 코드에 직접 적혀 있었습니다.

<p>현재 기준가는 253,984원입니다.</p>

처음 만들 때 데이터를 보고 손으로 적은 것입니다. 그 뒤로 데이터는 매일 바뀌었지만 이 문장은 그대로였습니다.

여기서 무서운 점은 아무것도 실패하지 않았다는 것입니다.

실패하는 것은 알림이 옵니다. 하지만 이건 실패가 아니라 연결이 끊긴 것입니다. 양쪽 다 잘 돌고 있는데 사이가 이어져 있지 않았습니다.

고친 방향

숫자를 손으로 적지 않고 데이터에서 가져오게 바꿨습니다.

방법은 간단합니다. 글에 표시만 남겨 두고, 빌드할 때 그 자리를 데이터로 채웁니다.

<!-- 여기에 표를 넣는다 -->
<!-- /여기까지 -->

빌드가 돌면 두 표시 사이가 데이터 기준으로 다시 그려집니다. 데이터가 바뀌면 화면도 바뀌고, 사람이 옮겨 적을 일이 없어집니다.

핵심은 표시 사이를 통째로 갈아 끼우는 것입니다. 이렇게 하면 몇 번을 돌려도 결과가 같고(같은 데이터면 같은 결과), 데이터에서 항목이 빠지면 화면에서도 자동으로 사라집니다. 손으로 지울 일이 없습니다.

곧바로 걸린 것

이 방식으로 바꾸고 나서 검사 하나가 배포를 막았습니다.

상황은 이랬습니다. 제가 표를 넣은 시점과, 매일 도는 데이터 갱신 작업이 거의 동시에 일어났습니다. 갱신 작업은 자기가 내려받은 시점 기준으로 화면을 다시 만들었는데, 그 시점에는 제가 넣은 표시가 아직 없었습니다. 그래서 그 페이지만 건드리지 않고 지나갔고, 결과적으로 새 데이터와 옛 표가 한 저장소에 섞였습니다.

여기서 "만들어진 화면이 생성기 출력과 일치하는가"를 보는 검사가 걸렸습니다. 데이터로 다시 그려 보니 커밋된 것과 달랐던 것입니다.

아프지만 정확한 동작입니다. 틀린 숫자를 올리는 것보다 배포가 멈추는 게 낫습니다. 다시 만들어서 커밋하니 통과했습니다.

오늘 날짜를 넣으면 안 되는 이유

한 가지 함정이 더 있었습니다. 화면에 "오늘 기준" 같은 걸 넣고 싶어질 때가 있습니다. "다음 지급일까지 134일 남았습니다" 같은 것도요.

이걸 빌드할 때 계산해 넣으면 매일 결과가 달라집니다. 그러면 "생성물이 일치하는가" 검사가 매일 실패합니다. 어제 만든 것과 오늘 만든 것이 다르니까요.

그래서 규칙을 정했습니다.

남은 일수 같은 건 표를 고정으로 찍고, 계산만 브라우저에서 합니다. 검색엔진은 표를 읽고, 사람은 표와 남은 일수를 함께 봅니다. 검사도 통과합니다.

매일 새로워지는 부수 효과

바꾸고 나서 예상 못 한 이득이 하나 있었습니다.

주가 데이터가 매일 갱신되니까, 그걸 쓰는 화면도 매일 자동으로 새로워집니다. 손을 안 대도 어제와 다른 페이지가 됩니다.

검색엔진 입장에서 이건 "관리되고 있는 페이지"입니다. 억지로 날짜만 바꾸는 것과 달리 실제로 내용이 달라지는 갱신이라, 다시 방문할 이유가 생깁니다.

원래 목적은 "틀린 숫자를 없애자"였는데 신선도까지 따라왔습니다.

정리

자동화데이터정적사이트빌드