그룹 부분 갱신 시 기존 데이터 손상 막기
목차
그룹 메타 갱신 스크립트를 자동화하면서 마주친 딜레마가 있었다. 메타데이터(이름, 설명, 썸네일)만 최신화하고 싶은데, 스크립트가 멤버나 출처 정보까지 밀어넣지 않도록 어떻게 할 것인가. 이번에 seed_groups에 --refresh 모드와 idempotent 가드를 추가해서 이 문제를 풀었다.
부분 갱신이 필요했던 맥락
처음 seed_groups는 "한 번만 실행하는 초기화 스크립트" 정도로만 설계되었다. 그런데 운영에 들어가니 상황이 달랐다. 그룹 메타 정보는 외부 데이터 소스와 자주 동기화되지만, 멤버 리스트는 팀이 수동으로 관리하고, 임베드 설정이나 출처(source) 링크는 별도 프로세스를 거친다.
"메타는 주기적으로 당겨오되, 나머지는 건드리지 말자"
이게 팀의 요청이었다. 전체 갱신 모드로 돌리면 메타 정보만 최신화하려다가 멤버가 리셋되거나 임베드 설정이 날아가는 부작용이 발생했다. 그룹 관리 팀에겐 악몽 같은 상황이었다.
--refresh 모드: 선택적 갱신
그래서 이렇게 설계했다:
| 모드 | 갱신 대상 | 보존하는 것 | 실행 빈도 |
|---|---|---|---|
| 기본(전체) | 모든 필드 | 없음 | 초기 구축, 완전 초기화 |
| --refresh | 메타 + 앨범 | 멤버, 출처, 임베드 | 주기적 자동화 |
덕분에 부분 갱신이 명시적이고 안전해졌다. 팀은 "메타는 최신으로, 하지만 관계 정보는 건드리지 말자"는 의도를 그냥 옵션 하나로 표현할 수 있다.
Idempotent 가드: 반복 실행의 안전성
부분 갱신만으로는 부족했다. 자동화 파이프라인에선 네트워크 지연이나 중간 실패로 스크립트가 여러 번 실행될 수 있다. 이미 처리된 데이터를 또 밀어넣지 않도록 보호해야 한다.
Idempotent의 원칙은 간단하다:
f(x) = f(f(x)) = f(f(f(x))) = ...
같은 입력으로 몇 번 실행해도 최종 상태가 동일해야 한다. seed_groups에 이 가드를 적용하면:
- 이미 등록된 그룹은 업데이트만, 중복 삽입 없음
- 메타 덮어쓰기는 깔끔하게 (no-op 체크)
- 실패한 부분만 재시도 가능
이게 있어야 "로테이션 중 일부 그룹이 실패했다면 다시 돌려도 된다"는 신뢰를 팀이 가질 수 있다. 자동화 도구는 여러 번 눌러도 괜찮다는 느낌이 있어야 실제로 자주 사용된다.
publish.sh의 로테이션 전략
publish.sh는 이제 seed_groups를 감싸는 래퍼 역할을 한다:
- 주기적으로 실행 (cron, 스케줄러, 또는 수동)
- --refresh 옵션으로 seed_groups 호출
- 여러 그룹을 로테이션하며 순회
- 중간 실패해도 멱등성 덕에 재시도 가능
이렇게 하면:
- 자동화 신뢰도: 스크립트를 자주 돌려도 데이터가 깨질 염려가 없음
- 부분 실패 복구: "이번엔 그룹 3개만 안 됐다" → 재실행하면 그 부분만 처리
- 운영 부담 감소: 수동 개입 거의 필요 없음
배운 점과 일반론
처음엔 이게 얼마나 중요한지 몰랐다. "그냥 메타 갱신하는 스크립트지, 뭐가 어렵지?" 정도였다. 하지만 운영 중엔 다르다:
-
초기 설계와 실제 쓰임이 다르다: 일회성이라고 생각한 도구도 나중엔 주기적으로 돈다. 처음부터 멱등성과 세분화된 제어를 염두에 두면, 나중에 리팩토링 비용을 많이 아낀다.
-
세분화된 제어가 신뢰도를 높인다: 전체/스킵 이분법보다 "이 부분만 갱신"이라는 옵션 하나가 팀의 자동화 신뢰도를 크게 올린다.
-
로테이션의 가치: 모든 데이터를 한 번에 처리하는 게 아니라 점진적으로 처리하면, 장애 시 영향 범위를 줄일 수 있다.
이런 패턴은 데이터 마이그레이션, 배치 작업, 주기적 동기화 같은 곳에서 자주 마주친다. 팀이 안심하고 눌러도 되는 자동화. 그것이 내가 이 변경에서 얻고 싶었던 거다.
🛒 이 글과 어울리는 추천 상품
*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.
댓글 0
첫 댓글 달아줘.