개요
SNS 콘텐츠 마케팅 자동화의 첫 단계는 데이터 수집이다. 이 프로젝트는 Twitter, Instagram, Facebook, YouTube에서 키워드 기반으로 콘텐츠를 자동 수집하고, Spring MVC 관리자 대시보드에서 수집 데이터를 관리하는 통합 크롤러 시스템이다.
Selenium headless ChromeDriver로 JavaScript 동적 렌더링 SNS 페이지를 직접 탐색하고, Twitter는 Selenium 방식과 Twitter4j OAuth API 두 가지를 병용한다. YouTube는 Data API v3를 공식 연동한다. 수집된 콘텐츠는 MyBatis를 통해 MySQL에 저장되며, Spring MVC 관리자 화면에서 CRUD 관리한다.
무한 스크롤 페이지의 동적 콘텐츠 로딩 대기, 플랫폼별 DOM 구조 차이 대응, 반복 수집 루프 안정화가 핵심 기술 과제였다.
주요 기능
멀티 플랫폼 SNS 크롤링
Twitter(Selenium + Twitter4j 이중 방식), Instagram(해시태그 탐색), Facebook(키워드 검색), YouTube(Data API v3) 네 플랫폼을 Crawler.java 단일 엔진에서 처리한다.
관리자 대시보드 CRUD
수집된 콘텐츠를 Spring MVC 관리자 화면에서 조회·수정·삭제한다. 배너, 게시글, 프로젝트, 회원 관리 기능도 함께 제공한다.
MySQL 자동 저장
크롤링 완료 즉시 MyBatis XML 매퍼를 통해 수집 데이터를 MySQL motiva DB에 저장한다. 중복 콘텐츠 방지 로직을 포함한다.
기술적 도전
Selenium 동적 SNS 크롤링
도전: Twitter, Instagram, Facebook은 JavaScript로 동적 렌더링하여 일반 HTTP 요청으로는 콘텐츠를 수집할 수 없다.
해결: Selenium headless ChromeDriver로 실제 브라우저를 제어하고, WebDriverWait으로 DOM 요소 로딩을 대기한 후 CSS Selector/XPath로 콘텐츠를 추출한다.
무한 스크롤 반복 수집
도전: SNS 피드는 무한 스크롤 방식이라 한 번에 모든 콘텐츠를 로드할 수 없다.
해결: JavaScript executor로 window.scrollTo(0, document.body.scrollHeight)를 반복 실행하고, 새 콘텐츠 로딩을 감지하면 계속 스크롤하는 루프를 구현했다. 지정 횟수 또는 콘텐츠 수 도달 시 중단한다.
Twitter 이중 수집 방식 병용
도전: Twitter API 레이트 리밋(Rate Limit)으로 대량 수집 시 차단이 발생했다. 해결: Twitter4j OAuth API와 Selenium 브라우저 크롤링을 상황에 따라 전환하여 수집한다. API 한도 초과 시 자동으로 Selenium 방식으로 폴백한다.
아키텍처
Spring MVC (Controller-Service-DAO) + Headless Browser Crawler 구조다. 크롤러 엔진과 관리자 대시보드가 단일 WAR에 통합된다.
crawling/src/main/
├── java/
│ ├── admin/ # Spring MVC 컨트롤러·서비스·VO
│ │ ├── ContentsCtr.java # 수집 콘텐츠 CRUD
│ │ └── AppMain1Ctr.java # 앱 메인 데이터 관리
│ └── common/
│ └── Crawler.java # 멀티 플랫폼 크롤링 엔진
├── resources/sql/ # MyBatis XML 매퍼
└── webapp/WEB-INF/jsp/ # JSP 뷰 (관리자 대시보드)