개요

KakaoTalk_Photo_2024-06-20-01-59-20.png

위 사진과 같이 식단을 불러오지 못하는 문제가 발생했다.


원인

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 소스의 문제라고 생각하였고 학교 홈페이지를 확인해보았다.

스크린샷 2024-06-25 오전 3.34.30.png

KakaoTalk_Photo_2024-06-20-01-59-25.png

좌측 사진이 정상적인 식단표이며, 우측은 문제가 생긴 식단표이다.

학교 홈페이지에 잘못 기입된 식단표로 인해 크롤링 컬럼 인덱스 범위가 벗어나 에러가 발생하였던 것이다.

해결

식단표를 불러오는 방법을 바꾸지 않는다면 언젠가 또 잘못 표기한 식단표 때문에 에러가 발생할 수 있다.

하지만, 식단표를 불러올 방법은 학교 홈페이지에서 긁어오는 방법밖에 존재하지 않았기 때문에 불러오는 방법 자체를 수정할 수는 없었다.