내부 온보딩 · 슬라이드
크롤러 배치 수집량 로그
product/version insert·update
5개 라이브러리 크롤러에서 “이번 배치가 새로 수집한 것인지, 기존 데이터를 갱신한 것인지”를 로그로 분리해 보는 작업
래브라도랩스 · 데이터파트 · 2026 · 내부용
01 · 문제
처리 건수만으로는 신규 유입을 알 수 없었다
- 기존 로그는 “패키지 N개 처리” 정도만 남아 신규 수집과 재갱신이 섞였다.
- 백필·재수집·증분 수집이 같이 도는 환경에서는 오늘 새로 들어온 데이터량을 로그만 보고 판단하기 어려웠다.
- 운영자가 보고 싶은 값은 product/version 각각 insert/update였다.
02 · 제약
upsert는 행별 insert/update를 알려주지 않는다
- 크롤러는 MySQL
INSERT ... ON DUPLICATE KEY UPDATE로 배치 upsert를 수행한다.
- 멀티로우 statement의
affected_rows는 합계 하나라 행별 신규/갱신을 분리할 수 없다.
- 무변화 update는 0으로 잡힐 수 있어 산술 역산도 안정적이지 않다.
03 · 선택한 방식
쓰기 직전 PK 존재 여부를 조회한다
배치 데이터product/version key 추출
→
DB 조회기존 key 존재 여부 확인
→
분류있으면 update
없으면 insert
→
upsert기존 쓰기 흐름 유지
정확도와 비용 사이에서 가장 가벼운 정확 방식을 택했다. 배치당 SELECT 1회 수준으로 운영 부담을 낮췄다.
04 · 구현 포인트
공통 베이스에 세고, 크롤러별로 꽂는다
대상golang / php / ruby / swift / dotnet 5개 크롤러
집계 대상PRODUCT_TABLE / VERSION_TABLE만 집계
중복 방지version sorting 재삽입은 배치 단위 dedup으로 제외
안전장치집계 실패는 warning만 남기고 수집 본류는 계속 진행
05 · 결과
로그 한 줄로 배치의 성격을 본다
[batch summary] — 방금 끝난 배치의 product/version insert·update
[total summary] — 런 전체 누적 product/version insert·update
- 5개 크롤러가 같은 문자열 포맷을 쓰므로 파서 하나로 수집량 리포트를 만들 수 있다.
운영 반영 전 실컨테이너 스모크는 별도 확인 필요.
06 · 온보딩 포인트
이 작업에서 기억할 것
- upsert 환경에서 신규/갱신을 분리하려면 쓰기 직전의 key 존재 여부를 보는 게 가장 실용적이다.
- 공통 동작은 베이스 클래스에 두고, 크롤러별 차이는 리셋/요약 호출 위치만 다르게 둔다.
- 운영 로그는 “돌았다”가 아니라 “무엇이 새로 들어왔는지”를 설명할 수 있어야 한다.
🕷 라이브러리 크롤러 시리즈 ④ — ① 멀티 언어 크롤러 구축 · ② 인기도 차등 수집 · ③ 크롤러 현대화