[면접 스터디] 예상질문: 9 웹 크롤러 설계
웹크롤러가 무엇인가?
웹 크롤러는 인터넷 상의 웹 페이지를 자동으로 방문하고, 그 페이지의 콘텐츠와 하이퍼링크를 수집하는 프로그램입니다. 일반적으로 검색 엔진이 웹 전체를 색인할 때 사용되며, URL → HTML → 링크 추출 → URL 큐에 추가하는 과정을 반복하는 구조입니다.
꼬리질문: 그럼 크롤러와 스크래퍼는 어떻게 다르나요?
스크래퍼는 특정 페이지에서 필요한 정보만 추출하는 반면, 크롤러는 웹을 탐색하며 페이지를 순회한다는 점에서 다릅니다. 즉, 크롤러는 탐색 + 수집, 스크래퍼는 정보 추출에 초점이 있습니다.
BFS가 더 적합한 이유는?
웹은 유향 그래프 구조이기에 그래프 탐색 알고리즘이 필요 근데 여기서 DFS를 사용한다면 웹 페이지의 깊이는 예측할 수 없고 예의 없는 크롤링이 될 수 있습니다.
BFS는 FIFO 큐 기반이기 때문에 병렬 처리가 쉽습니다. 각 도메인에 대한 요청을 분산시키는 데 유리해 대규모 크롤러에는 BFS가 적합합니다.
꼬리질문: 그렇다면 BFS만 사용하면 모든 문제가 해결되나요?
아니요 BFS에는 우선순위가 없습니다. 하지만 웹페이지에는 중요한 정보나 필요성이 다 다를 것입니다. 따라서 우선순위를 나눠 큐를 사용하는 추가 설계가 필요할 수 있습니다.
크롤링에서의 예의란? 지키지 않는다면 어떻게 되나
크롤링에서의 예의란 대상 웹사이트 서버에 과도한 부하를 주지 않도록 조심하는 설계 원칙입니다.
이를 지키지 않으면 서버는 DDoS 공격으로 익식해 차단당합니다. 또한 robots.txt에 의해 법적, 윤리적 문제가 생길 수 있습니다.
꼬리질문: 예의를 지키기 위한 설계 방법에는 어떤 것이 있나요?
도메인별 큐를 별도로 두어 같은 사이트에 한 번에 하나의 요청만 보낼 수 있게 하고, 요청 간 간격을 설정해 부하를 적절히 유지합니다. 또한 robots.txt에 내용을 준수하는 것입니다.
크롤링 시스템을 설계해본 경험이 있나?
네, 저는 웹 기반 STT 시스템이나 검색 서비스 구축 중, 실시간 또는 주기적으로 정보를 수집하기 위해 웹 크롤러를 직접 설계하고 구현해본 경험이 있습니다. Seed URL부터 HTML Downloader, Parser, URL 필터, 중복 제거기까지 모듈화하여 설계했고, Spring 기반 RestTemplate과 Jsoup을 활용해 링크 추출과 텍스트 분석을 수행했습니다.
꼬리질문: 크롤러 설계 시 어떤 컴포넌트 간 분리를 가장 중요하게 생각했나요?
저는 URL 추출기와 콘텐츠 파서를 명확히 분리하는 것을 중요하게 생각했습니다. 콘텐츠 파서는 본문, 제목 등 의미 있는 정보를 처리하고, URL 추출기는 큐에 넣을 링크만 다뤄서 모듈화와 성능 최적화에 유리하도록 설계했습니다.
꼬리질문: 그중에서 가장 복잡하거나 어려웠던 부분은?
가장 어려웠던 부분은 중복 콘텐츠 제거와 거미덫(무한 URL 루프) 대응이었습니다. 단순 문자열 비교는 느려서 해시(SHA256) 기반으로 비교했지만, 완벽히 해결하기 어려운 케이스가 많았습니다. 그래서 URL 길이 제한, 비슷한 경로 패턴 필터링, 수집 이력 기반 TTL 설정 등으로 대응했습니다.
HTML 다운로더 최적화 방안은?
- 분산 크롤링
- DNS 캐싱
- 짧은 타임아웃 설정
- 지역성 고려