지난번에 뉴스 크롤링 기능을 JSP와 연결해 웹사이트에 출력하는 것까지는 성공했지만, 아쉬웠던 부분이 있어 이번에는 추가 기능 개선을 진행하였다.
// 뉴스
if (boardId == 8) {
try {
List<News> allNews = newsService.crawlNews("경호", 3); // 전체 뉴스 가져오기
int itemsInAPage = 5; // 한 페이지당 몇 개씩 보여줄지
int totalNewsCount = allNews.size();
int pagesCount = (int) Math.ceil((double) totalNewsCount / itemsInAPage);
int fromIndex = (page - 1) * itemsInAPage;
int toIndex = Math.min(fromIndex + itemsInAPage, totalNewsCount);
// 실제 보여줄 뉴스 리스트
List<News> pagedNews = allNews.subList(fromIndex, toIndex);
// JSP에 넘길 값들
model.addAttribute("newsList", pagedNews);
model.addAttribute("pagesCount", pagesCount);
model.addAttribute("page", page);
model.addAttribute("board", board);
model.addAttribute("boardId", boardId);
return "/usr/post/newslist";
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return rq.historyBackOnView("뉴스 데이터를 불러오는데 실패했습니다.");
}
}
// 이미지가 있는 뉴스 블록 기준으로 순회
Elements articleBlocks = doc.select("div.sds-comps-base-layout");
for (Element block : articleBlocks) {
// 제목, 요약, 썸네일
Element titleTag = block.selectFirst("span.sds-comps-text-type-headline1");
Element summaryTag = block.selectFirst("span.sds-comps-text-type-body1");
Element imgTag = block.selectFirst("img");
// 조상 요소: 뉴스 전체 박스
Element newsBox = block.parent(); // 일반적으로 바로 위 부모 div
// 언론사
Element pressTag = newsBox.selectFirst("a[href] > span.sds-comps-text-type-body2.sds-comps-text-weight-sm");
// 날짜
Element dateTag = newsBox.selectFirst("span.sds-comps-profile-info-subtext span.sds-comps-text-type-body2.sds-comps-text-weight-sm");
// 값 추출
String title = titleTag != null ? titleTag.text() : "";
String link = (titleTag != null && titleTag.parent() != null) ? titleTag.parent().attr("href") : "";
String summary = summaryTag != null ? summaryTag.text() : "";
String image = imgTag != null ? imgTag.attr("src") : "";
String press = pressTag != null ? pressTag.text() : "언론사 없음";
String date = dateTag != null ? dateTag.text() : "날짜 없음";
if (!title.isEmpty()) {
newsList.add(new News(title, link, summary, image, press, date));
오류가 많았지만, 그때마다 해결하느라 캡처를 남기지 못한 것이 아쉬울 정도로 삽질이 꽤 있었다..😢
@Data
@AllArgsConstructor
public class News {
private String title;
private String link;
private String summary;
private String image;
private String press; // 언론사 추가
private String date; // 날짜 추가
}
News객체에 언론사(press)와 날짜(date) 필드를 추가하여 구조를 확장하였다.드디어 내가 가져오고 싶었던 모든 정보들이 잘 출력되는 것을 확인할 수 있었다.

