개발 slecs

콘텐츠 필터 탈락 후 반복되던 재시도 제거

목차

크롤링해서 발행하려는 글이 필터링 기준(게이트)을 통과하지 못할 땐, 더 이상 재시도할 이유가 없다. 이전엔 이걸 제대로 구분하지 못해 불가능한 글에 대해 계속 재시도하느라 리소스를 낭비하고 있었다. 이번에 그 부분을 걸러내는 로직을 추가해서 불필요한 작업을 줄였다.

thin-content 게이트와 재시도 로직

발행 시스템에서 "게이트"란 발행 전 콘텐츠를 검증하는 필터링 단계다. 길이·형식·필수 필드·품질 같은 다양한 기준을 체크해서, 기준을 만족하지 못하는 글은 탈락시킨다. thin-content는 그 중 하나인데, 예를 들면 문맥이 부족하거나 본문이 지나치게 짧아서 의미 있는 콘텐츠로 보기 어려운 경우를 말한다.

여기서 핵심 문제는 재시도 메커니즘이었다. 크롤링 과정에서 여러 번 재시도하는 로직이 있는데—네트워크 오류나 일시적 문제를 대비하기 위함—게이트 필터링 탈락도 구분하지 않고 계속 재시도하는 바람에, 애초부터 통과할 수 없는 글까지 반복해서 처리하고 있었다.

# 기존: 재시도 로직이 모든 실패를 동등하게 취급
for attempt in range(max_retries):
    result = process_content(article)
    if not result.success:
        continue  # 게이트 탈락 여부와 관계없이 재시도
    break

게이트 탈락 판정과 즉시 포기

개선 내용은 간단하다. 게이트 체크에서 "불통"이 나면 재시도하지 않고 즉시 포기하는 로직을 추가했다. 재시도는 일시적 오류(네트워크, 타임아웃 등)에만 의미가 있는데, 콘텐츠 기준 미달은 재시도해도 바뀌지 않으니까다.

# 개선: 게이트 탈락은 즉시 판정하고 재시도하지 않음
result = check_thin_content_gate(article)
if result.should_reject:
    return SKIP  # 재시도하지 않고 즉시 중단

for attempt in range(max_retries):
    result = process_content(article)
    if result.success:
        break
    if is_permanent_failure(result.error):
        return FAIL  # 원칙적으로 실패 (재시도 불가)
    # 일시적 오류만 재시도

이렇게 하면 통과 불가 판정이 나자마자 그 글 처리를 중단하고 다음으로 넘어간다.

상황 기존 동작 개선 후
네트워크 오류 재시도 O 재시도 O
타임아웃 재시도 O 재시도 O
thin-content 탈락 재시도 O (낭비) 재시도 X (즉시 중단)
필수 필드 누락 재시도 O (낭비) 재시도 X (즉시 중단)

성능과 실제 영향

대량의 글을 크롤링하는 상황에서, 이 차이가 생각보다 크다. 특히 저품질 글의 비중이 높은 소스에서 더 두드러진다. max_retries가 3~5회라면, 필터링 탈락 글 하나당 3~5배의 불필요한 처리를 줄이는 셈이다.

  • 처리 시간 단축 — 게이트 체크 후 불통이면 나머지 단계(정규화, 검증, 저장 등)를 실행하지 않음
  • 리소스 절약 — CPU·메모리·데이터베이스 I/O 감소
  • 크롤링 처리량 증가 — 같은 시간에 더 많은 유효한 글을 처리 가능

배운 점

이번 작업에서 느낀 건, 재시도 로직은 "언제 재시도할 가치가 있는가"를 명확히 구분해야 한다는 것. 네트워크 오류와 비즈니스 로직 실패는 다르다. 전자는 기다렸다 다시 하면 성공할 수도 있지만, 후자는 조건 자체가 바뀌지 않으면 무의미하다.

특히 크롤링 같은 배치 작업에선 불필요한 재시도가 쌓여서 전체 처리 시간을 상당히 끌어내린다. 초기 설계 단계에 "이 에러는 일시적인가 / 재시도해서 해결될 가능성이 있는가"를 먼저 체크해서 로직을 분리하는 게 중요하다. 회고하면서도 기존 코드의 "모든 실패는 일단 재시도"라는 방식이 얼마나 무분별했는지 깨닫게 됐다.


🛒 이 글과 어울리는 추천 상품

*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

댓글 0

첫 댓글 달아줘.