백필

Backfill

방법

이미 지나간 기간의 데이터를 같은 흐름에 다시 태워, 비었거나 틀어진 값을 지금 기준으로 채워 넣는 작업입니다.

등장 배경

데이터를 옮기고 다듬는 흐름은 대개 정해진 주기에 맞춰 자동으로 돕니다. 매일 새벽 세 시에 전날 하루치를 모아 한꺼번에 처리하는 배치 처리가 그런 방식입니다. 이 흐름은 앞으로만 흐릅니다. 오늘 새벽에 도는 작업은 어제 하루를 보지, 지난달을 다시 보지 않습니다.

지나간 구간이 어긋나면 흐름이 스스로 고치지 못합니다. 어긋나는 경로는 둘입니다. 하나는 실패입니다. 원천이 사흘 동안 응답하지 않았거나 작업이 조용히 멈춰서 그 기간의 값이 비어 있는 경우입니다. 다른 하나는 기준 변경입니다. 값은 채워져 있는데 계산 방식이 바뀌어서 지난 기록만 옛 규칙으로 만들어진 채 남는 경우입니다.

페이지덱에서도 같은 일이 있었습니다. 지현이 월요일 아침에 유료 전환 수를 보다가 지난주 수요일부터 금요일까지가 0으로 찍혀 있는 것을 발견했습니다. 결제 내역을 가져오는 작업이 그 사흘 동안 계속 실패하고 있었습니다. 태오가 그날 바로 고쳤지만 고친 코드는 오늘치부터 돌기 때문에 빈 사흘은 그대로 남습니다. 지난 구간을 따로 지목해 다시 돌리는 이 일에 붙은 이름이 백필입니다.

사용 절차

백필은 다시 채울 구간을 못 박고, 그 구간만 떼어 내 돌린 다음, 결과를 확인하는 순서로 진행합니다. 여섯 단계입니다.

  1. 구간을 정합니다. "5월 1일부터 5월 3일까지" 처럼 시작과 끝을 날짜로 못 박습니다. "최근에 이상한 데부터" 로 시작하면 어디까지 돌렸는지 아무도 모르게 되고, 같은 구간을 또 돌리거나 한 구간을 빼먹습니다.
  2. 원인을 먼저 없앱니다. 원천이 응답하지 않아 비었다면 그 문제를 고친 뒤에 돌립니다. 원인을 둔 채 돌리면 같은 자리에서 또 실패합니다.
  3. 덮어쓰기 방식을 확인합니다. 해당 구간의 기존 결과를 지우고 새로 쓰는지, 위에 더하는지를 봅니다. 더하는 방식이면 5월 1일치 매출이 기존 값 위에 얹혀 두 배로 잡힙니다. 몇 번을 돌려도 그 구간의 값이 하나로 유지되는 성질을 재실행 안전성이라고 부릅니다.
  4. 하루치로 먼저 돌려 봅니다. 1년치를 한 번에 밀어 넣지 않고 하루만 돌린 뒤 결과를 봅니다. 여기서 틀리면 나머지 364일도 같은 방식으로 틀립니다.
  5. 나머지를 쪼개서 돌립니다. 일 단위나 주 단위로 나눠 순서대로 밀어 넣습니다. 작업을 순서와 의존 관계에 맞춰 실행해 주는 도구인 워크플로 오케스트레이터에 구간 목록을 넘기면, 하나가 끝나야 다음이 시작되고 중간에 실패하면 거기서 멈춥니다.
  6. 결과를 대조합니다. 결제 건수라면 결제 시스템 원장과 맞아야 하고, 사용자 수라면 앞뒤 날짜와 이어져야 합니다. 이 확인을 규칙으로 만들어 자동으로 돌리는 것이 데이터 검증입니다.

적합한 상황과 한계

백필이 맞는 상황은 원인이 이미 사라졌고 다시 돌리면 같은 결과가 나온다고 믿을 수 있을 때입니다. 돌리는 자리는 셋으로 모입니다. 파이프라인이 며칠 실패해 빈 구간을 메울 때, 새 지표를 만들면서 지난 1년치도 같은 기준으로 계산해 둘 때, 저장소를 새 구조로 옮기는 마이그레이션 직후에 옛 데이터를 새 형태로 채울 때입니다.

한계는 네 가지 모양으로 나타납니다.

원천에 재료가 없으면 아예 못 합니다. 가장 자주 부딪히는 벽입니다. 외부 서비스가 로그를 90일만 보관한다면 반년 전 구간은 다시 만들 방법이 없습니다. 이때 할 일은 그 구간을 값 없음으로 표시해 비교 대상에서 빼는 것입니다.

지금 기준으로 과거를 다시 계산하면 예전에 보고한 숫자가 바뀝니다. 테스트 계정을 걸러 내는 규칙을 넣고 지난 분기를 백필하면 그 분기 가입자 수가 며칠 전 화면보다 줄어듭니다. 값은 더 정확해졌지만 그 숫자를 이미 본 사람에게는 설명이 필요합니다.

돌리는 동안 매일 도는 작업과 자원을 나눠 씁니다. 1년치를 한꺼번에 밀어 넣으면 어제를 고치는 사이 오늘이 비어서, 큰 백필은 사용이 적은 시간대에 쪼개 돌립니다.

스트림 처리로 짜인 흐름은 한 건씩 흘려보내는 구조라 특정 구간만 떼어 내기가 까다로워 백필용 경로를 따로 둡니다. 어느 쪽이든 백필은 데이터 품질을 되돌리는 수단이지 어긋나지 않게 막는 수단은 아닙니다.

실무 용례

"지난주 수요일부터 금요일까지 백필 돌렸고, 결제 원장이랑 맞는 것까지 확인했습니다."

비어 있던 사흘을 다시 처리해 채웠고 값이 맞는지 대조까지 끝냈다는 뜻입니다.

"이 지표 정의를 바꾸면 지난 1년치를 백필해야 하는데, 원천 로그가 90일까지만 남아요."

소급 계산을 하고 싶어도 재료가 없어 석 달까지만 가능하다는 말입니다.

"백필은 새벽에 쪼개서 돌립시다. 낮에 한꺼번에 밀면 오늘치가 밀려요."

과거를 채우는 작업이 매일 도는 작업을 밀어내지 않게 나누자는 제안입니다.

페이지덱에서 이 말은 두 자리에서 나옵니다. 하나는 사고 직후입니다. 태오가 원인을 고친 뒤 빈 구간을 하루 단위로 쪼개 밤사이 돌려 두고, 다음 날 아침에 지현이 그 값이 앞뒤 날짜와 이어지는지 봅니다. 백필이 복구의 마지막 단계인 자리입니다.

다른 하나는 지표를 손볼 때입니다. 지현이 유료 전환 기준을 바꾸자고 하면 태오가 먼저 묻는 것은 언제까지 거슬러 올라갈지입니다. 지난 분기까지면 반나절이지만 2년 전까지면 원천 보관 기간부터 확인해야 합니다.

흔한 오해

백필을 명령 한 줄로 끝나는 복구 버튼으로 여기는 경우가 가장 많습니다. 시작이 정말 명령 한 줄이라 그렇게 보입니다. 하지만 덮어쓰기 방식과 원천 보관 기간을 확인하고, 구간을 쪼개고, 돌린 뒤 값을 대조하는 일까지가 한 묶음입니다. 이걸 건너뛰면 매출이 두 배로 잡힌 표를 만들어 놓거나, 오늘치 작업이 반나절 밀린 채 아침을 맞습니다.

백필을 돌리면 과거가 원래 모습으로 돌아온다고 여기는 오해도 흔합니다. 채워 넣는 일이라 되돌리는 것처럼 느껴집니다. 그러나 백필이 만드는 값은 그때의 값이 아니라 지금 코드와 지금 기준으로 다시 만든 값이고, 그사이 규칙이 한 번이라도 바뀌었다면 두 값은 다릅니다. 이 차이를 모르고 돌리면 어제 본 화면과 오늘 본 화면이 왜 다른지 아무도 설명하지 못하게 됩니다. 그래서 백필한 구간은 언제 어떤 기준으로 만들었는지 기록으로 남깁니다.

같이 보면 좋은 페이지

  • 데이터 파이프라인

    백필이 손보는 대상이 무엇인지, 그 흐름의 전체 모양을 먼저 봅니다

  • 재실행 안전성

    백필을 사고 없이 돌릴 수 있는지를 결정하는 성질입니다

  • 마이그레이션

    저장소를 옮긴 뒤 옛 데이터를 채우는 일이 백필과 맞물리는 자리입니다

마지막 업데이트 2026-09-16