본 섹션에서는 맞춤형 네이버 뉴스 워치리스트 서비스를 구축하는 구체적인 단계를 상세히 설명합니다. 이 서비스는 API 전용 Rails 8 앱으로 구현되며, SerpApi를 활용하여 네이버 뉴스 결과를 효율적으로 가져오고 관리합니다.
1. API 전용 Rails 앱 생성
프론트엔드가 필요 없는 서비스이므로 --api 옵션과 데이터베이스가 필요 없는 --skip-active-record 옵션을 사용하여 Rails 앱을 생성합니다. (데이터베이스 필요 시 --skip-active-record 생략)
2. SerpApi Gem 추가 및 API 키 저장
SerpApi 공식 Ruby Gem을 bundle add serpapi 명령어로 추가하고, SerpApi 대시보드에서 발급받은 API 키를 Rails 암호화된 credentials에 안전하게 저장하여 앱 내에서 접근할 수 있도록 설정합니다.
3. NaverNewsFetcher 서비스 구현
모든 SerpApi 상호작용을 NaverNewsFetcher 서비스 객체 내에 격리합니다. 이 서비스는 engine: "naver", where: "news", sort_by: :relevance, period: "1d" 등의 기본 검색 파라미터를 정의하며, 쿼리와 추가 옵션을 받아 SerpApi 클라이언트를 통해 검색을 실행합니다. 오류 발생 시 Rails.error.report를 사용하여 보고합니다.
4. Action Mailer를 이용한 이메일 다이제스트
뉴스 결과를 수집한 후, DailyDigestMailer를 사용하여 맞춤형 이메일 다이제스트를 생성하고 발송합니다. ApplicationMailer의 from 주소는 Rails credentials에서 가져오며, 한국어 텍스트가 올바르게 렌더링되도록 charset: "UTF-8"을 설정합니다. 또한, 오류 발생 시 관리자에게 알림을 보내는 error_email 메서드도 추가합니다.
5. 이메일 전송 방법 설정
Gmail SMTP를 사용하여 이메일을 전송하도록 설정합니다. Gmail 앱 비밀번호를 생성하여 Rails credentials에 저장하고, config/environments/production.rb에 SMTP 설정을 추가합니다. 개발 환경에서는 letter_opener Gem을 사용하여 이메일을 브라우저에서 확인할 수 있도록 설정합니다.
6. Daily Watchlist Job 생성
DailyWatchlistJob은 전체 워크플로우를 조율하는 핵심 작업입니다. 이 작업은 정의된 WATCHLIST 항목별로 뉴스를 가져오고, 중복 및 원치 않는 언론사 결과를 필터링하며, 키워드별로 그룹화하여 다이제스트를 구성하고 이메일을 발송합니다. MAX_PAGES와 RESULTS_PER_PAGE를 통해 페이징 처리를 구현하고, SORT_MAP 및 PERIOD_MAP을 통해 검색 조건을 유연하게 관리합니다.
7. 오류 처리 및 보고
서비스의 안정성을 위해 오류 처리 및 보고 메커니즘을 통합합니다. NaverNewsFetcher와 DailyWatchlistJob 모두에서 예외 발생 시 Rails.error.report를 사용하여 오류를 기록하고, DailyDigestMailer의 error_email 메서드를 통해 지정된 수신자에게 오류 알림 이메일을 발송합니다. SerpApi 응답이 "Success"가 아닐 경우에도 명시적으로 오류를 발생시킵니다.
8. 실행 및 테스트
Rails 콘솔에서 NaverNewsFetcher 호출, DailyWatchlistJob 섹션 생성, 전체 DailyWatchlistJob.perform_now 실행 등 각 구성 요소를 테스트하여 서비스가 정상적으로 작동하는지 확인합니다. 개발 환경에서는 letter_opener를 통해 생성된 이메일을 즉시 확인할 수 있습니다.