
위 사진과 같이 식단을 불러오지 못하는 문제가 발생했다.
Application에서는 API를 통해 식단을 받고 있기 때문에, 서버측에서 문제가 발생했다는 것을 알 수 있었다.
서버 로그를 확인해보니 Array Index 범위 에러난 것을 확인했고, 이는 크롤링 과정에서 문제가 발생했음을 알 수 있었다.
private Diet parseDiet(Element row) {
Elements columns = row.select(DATA_SELECTOR);
// 요일 출력
Element dayElement = columns.get(0);
String day = dayElement.text();
// 짝수 컬럼에는 day 정보가 있는 위치에 "교직원식당"의 정보가 기입됨으로 넘겨야 함
if (PASS_COLUMN.equals(day)) {
return null;
}
LocalDate parsedDate = LocalDate.parse(day.substring(0, 10), DATE_FORMATTER);
// 코리안 푸드 메뉴가 4번째 컬럼에 작성되기 때문에, 컬럼의 개수가 3개 이하라면 해당 날짜의 메뉴는 존재하지 않는 것으로 처리하였다.
// 만일 식단의 작성 방법이 변경된다면 해당 로직 또한 변경의 필요성이 존재한다.
Element menuColumn = columns.size() > 3 ? columns.get(3) : null;
String menuElement = menuColumn != null ? menuColumn.text() : null;
String[] menus = !StringUtils.isEmpty(menuElement) ? menuElement.split(MENU_SEPARATOR) : new String[] {};
return new Diet(parsedDate, menus);
}
기존 로직은 학교의 홈페이지 html 구조에 맞춰서 식단을 불러오는 형식이었다.
따라서, 로직의 문제가 아닌 html 소스의 문제라고 생각하였고 학교 홈페이지를 확인해보았다.


좌측 사진이 정상적인 식단표이며, 우측은 문제가 생긴 식단표이다.
학교 홈페이지에 잘못 기입된 식단표로 인해 크롤링 컬럼 인덱스 범위가 벗어나 에러가 발생하였던 것이다.
식단표를 불러오는 방법을 바꾸지 않는다면 언젠가 또 잘못 표기한 식단표 때문에 에러가 발생할 수 있다.
하지만, 식단표를 불러올 방법은 학교 홈페이지에서 긁어오는 방법밖에 존재하지 않았기 때문에 불러오는 방법 자체를 수정할 수는 없었다.