10개 매체를 타깃으로 스케줄링 배치(APScheduler)를 구축해 데이터를 실시간 자동 파싱 및 수집함
AI 연계 본문 텍스트 요약
OpenAI 및 Langchain을 결합해 수집 원문 본문의 자연어 정밀 요약과 메타데이터 분류 태그를 동적 추출함
검색 및 정렬 배포 API
무한 스크롤, 다차원 필터링 및 검색 조건을 지원하는 패션 포스트 통합 조회 API를 구현함
장애 모니터링 경보
배치 완료 실패 현황 및 예외 에러 스택을 Slack Webhook을 연동해 실시간 모니터링 경보를 구성함
핵심 성과 및 의사결정 이력
1. 플러그인 플로우 조립을 위한 어댑터 패턴 기반 다중 매체 수집 파이프라인 설계
배경 & 제약사항: 패션 트렌드 데이터 수집 대상인 10여 개 매체마다 웹 사이트 HTML 구조, API 스펙, 응답 타입(JSON, XML 등)이 달라 매체가 추가될 때마다 기존 코드가 방대해지고 버그 수정 시 다른 매체 연동 코드에 부작용을 일으키는 아키텍처 결함이 있었습니다.
의사결정 (Why 어댑터 패턴?):
수집(Crawling) 엔진을 데이터 정제(Parsing/Pipeline) 파트와 철저히 분리하기 위해 어댑터 패턴(Adapter Pattern)을 적용했습니다.
각 매체별 수집 엔진은 외부 어댑터로 격격리하고, 수집된 로 데이터는 공통 규격의 DTO로 래핑하여 정제 코어 로직으로 흘려보내도록 계약 관계를 설계했습니다.
성과: 기존 수집 핵심 소스코드를 일체 건드리지 않고, 매체별 크롤러 어댑터 모듈만 플러그인 형태로 조립할 수 있게 설계하여 신규 매체 추가 연동에 소요되는 리드 타임과 공수를 80% 가량 감축했습니다.
2. cloudscraper 우회 및 aiohttp/aiomysql 비차단(Non-blocking) 비동기 적재 전환 (수집 성능 향상)
배경 & 제약사항: 대상 패션 매체들의 Cloudflare 웹 방화벽 보안 솔루션으로 인해 자동화 봇이 수차례 차단(403 Forbidden)되어 배치의 주기적 동작이 불가능했습니다. 또한, 동기식 I/O 수집 파이프라인으로 인해 대용량 데이터 적재 시 대기 시간이 수십 분 이상으로 매우 길었습니다.
의사결정 (Why cloudscraper & Async I/O?):
Cloudflare 방화벽을 우회하기 위해 V8 자바스크립트 엔진 시뮬레이션을 수행하고 헤더 정보를 무작위 대입해주는 cloudscraper 및 fake-useragent 패키지를 도입해 탐지를 안전하게 회피했습니다.
대량의 병렬 HTTP 요청을 동시 처리하기 위해 aiohttp 라이브러리를 채택하고, 데이터베이스 적재 역시 비동기 전용 드라이버인 aiomysql을 사용하여 전체 파이프라인을 완전 비차단(Non-blocking) 비동기로 최적화했습니다.
성과: 주기적 크롤러 방화벽 차단률을 0% 수준으로 격감시켰으며, I/O 대기 병목을 해결해 전체 데이터 수집 및 데이터베이스 적재 속도를 비약적으로 단축했습니다.
3. OpenAI GPT API / Langchain 연계 비정형 데이터 정제 자동화 및 Mocking 테스트 구축
배경 & 제약사항: 웹사이트에서 긁어온 원문 콘텐츠에 포함된 불필요한 스팸 문구, 노이즈 태그를 제거하고 요약과 관심사 카테고리 태그(예: 스트릿, 댄디 등)를 규칙 기반 코드로 분류하기에는 한계가 있었습니다.
의사결정 (Why OpenAI & Langchain?):
원시 텍스트 요약 및 패션 분야 특화 카테고리 자동 태깅을 위해 OpenAI GPT API와 Langchain의 프롬프트 템플릿 파이프라인을 설계했습니다.
비용 과금 방지 및 API 타임아웃 예외 대응을 위해, dependency-injector를 사용해 테스트 환경에서는 OpenAI Mock 어댑터를 dynamic하게 바인딩하여 런타임 검증을 실행할 수 있게 하고, 예외 발생 시 Slack SDK를 통해 오류 상태가 담당자에게 실시간 노티되도록 에러 채널을 구축했습니다.
성과: 대량의 비정형 텍스트 데이터를 AI 기반 지능형 정제·요약하는 프로세스를 100% 자동화하고, 자동화 테스트 및 모니터링 경보 체계를 마련해 운영 무중단 안정성을 확보했습니다.