뉴스 배치
- 뉴스 배치의 전체적인 흐름을 설명해주세요.
- 뉴스 배치는 매 시간 정각에 실행되며, DB에 저장된 모든 사용자 관심사 키워드를 조회하는 것으로 시작합니다.
- 수집 방식은 두 가지입니다.
- 첫째, 네이버 오픈 API를 호출하여 특정 키워드에 대한 뉴스 검색 결과를 JSON 형태로 받아옵니다.
- 둘째, 주요 언론사(한경, 조선, 연합)의 RSS 피드를 크롤링합니다. RSS는 전체 기사를 받아온 뒤, 서버 메모리 상에서 해당 키워드가 제목이나 본문에 포함된 기사만 필터링하는 방식으로 수집합니다.
- 이렇게 수집된 데이터는 중복을 제거한 뒤 DB에 저장됩니다.
실행 순서
- 스케줄러 실행 (
NewsBatchScheduler)
- 매 시간 정각(
0 0 * * * *)에 runNewsCollectionJob() 메서드가 실행됩니다.
- 이 메서드는
NewsCollectJob이라는 배치 작업을 시작시킵니다.
- 배치 작업 시작 (
BatchConfig)
- 읽기 (
interestReader): DB에 저장된 모든 관심사(Interest)의 ID(UUID)를 전부 가져옵니다. (예: 사용자들이 등록한 “삼성전자”, “부동산”, “AI” 등의 관심사 ID 목록)
- 처리 (
interestProcessor): 별다른 가공 없이 ID를 그대로 넘깁니다.
- 쓰기 (
itemWriter): 가져온 ID들을 10개씩 묶어서(Chunk) 처리합니다. 각 ID마다 articleService.saveByInterest(ID)를 호출합니다.
- 실제 수집 (
Collector 구현체들)
articleService 내부(코드는 없지만 흐름상)에서 해당 ID에 맞는 키워드(예: “AI”) 꺼내고, 아래 두 가지 수집기(NaverApiCollector, RssCollector)에게 그 키워드를 던져줍니다.
실제 수집
- 네이버 검색 API (
NaverApiCollector)
- 출처: 네이버 뉴스 검색 서버 (
openapi.naver.com/v1/search/news.json)
- 방식:
WebClient를 사용해 네이버 서버에 HTTP GET 요청을 보냅니다.
- 이때 쿼리 파라미터(
?query=키워드)에 수집하려는 키워드를 실어서 보냅니다.
- 네이버가 찾아준 뉴스 결과를 JSON으로 받아서 자바 객체(
ArticleDto)로 변환합니다.
- 언론사 RSS 피드 (
RssCollector)
- 출처: 코드 내
rssMap 변수에 하드코딩된 3개 사이트 주소입니다.
- 한국경제 (
hankyung.com/feed/all-news)
- 조선일보 (
chosun.com/...)
- 연합뉴스TV (
yonhapnewstv.co.kr/...)
- 방식:
Jsoup 라이브러리를 사용해 위 3개 URL에 접속하여 XML 문서를 통째로 긁어옵니다.
- 가져온 뉴스 목록 전체에서, 제목이나 요약 내용에 우리가 찾는 키워드가 포함되어 있는지 자바 코드(
stream().filter(...))로 검사합니다.
- 키워드가 포함된 뉴스만 남기고 나머지는 버립니다.