Skip to content

[버그] GET /bus 셔틀 도착 시각 정렬 중 NullPointerException 발생 #2409

Description

@taejinn

🚨 오류 상황 및 원인

  • GET /bus에서 도착 시각이 없는 셔틀/통학버스 항목과 정상 항목이 함께 정렬되면 HTTP 500이 발생합니다.
  • 제공된 서버 스택은 아래 경로를 가리킵니다.
java.lang.NullPointerException: Cannot invoke "java.time.LocalTime.compareTo(java.time.LocalTime)" because "this.busArrivalTime" is null
    at BusRemainTime.compareTo(BusRemainTime.java:85)
    at ShuttleBusService.getShuttleBusRemainTimes(ShuttleBusService.java:77)
    at BusService.getBusRemainTime(BusService.java:62)

BusRemainTime.from()은 null 또는 시간으로 해석할 수 없는 문자열을 받으면 busArrivalTime=null인 객체를 만듭니다. ShuttleBusService가 이 객체를 .distinct().sorted()로 처리하면서 예외가 발생합니다. 상위 BusService.toResponse()에는 이미 남은 시간을 계산할 수 없는 항목을 제거한 뒤 정렬하는 로직이 있지만, 선행 정렬에서 예외가 나므로 도달하지 못합니다.

재현 근거

  • 2026-09-05 조회한 공개 시간표의 천안 셔틀 / 토요일 오후일학습병행대학 천안시내 / 하교 3·4회 데이터를 토요일 11:25 KST의 로컬 fixture로 구성합니다.
  • bus_type=shuttle&depart=terminal&arrival=koreatech 경로를 실행하면 정상 14:25 항목과 도착 시각이 없는 항목이 함께 선택되어 같은 예외 문구와 85행이 재현됩니다.
  • 주말 노선에는 동일한 터미널 정류장이 두 번 있습니다. 노선 판정은 뒤쪽의 유효한 시간을 보고 통과시키지만, 잔여 시간 추출은 첫 번째 일치 정류장의 null을 선택할 수 있습니다.
  • 원 서버 요청의 쿼리 파라미터와 당시 DB 스냅샷은 확보하지 않았습니다. 위 조합은 동일 오류를 재현한 조건이며 원 요청을 특정한 것은 아닙니다.

이번 핫픽스 범위 / 완료 조건

  • ShuttleBusService의 선행 정렬을 제거하여 기존 BusService.toResponse()의 필터 → 정렬 순서를 사용한다.
  • 정상·무효 시간 혼합 시 예외 없이 정상 버스만 반환하는 회귀 테스트를 추가한다.
  • 정상 항목의 시간순 정렬·중복 제거·운행 종료 및 빈 응답을 확인한다.

DB나 시간표를 변경하지 않고 이번 NPE를 차단하는 범위입니다. 서비스가 계산할 수 없는 항목은 기존 응답 규칙에 따라 제외합니다.

별도 후속 과제

Route의 노선 방향/운행 구간 판정과 중복 정류장 선택 불일치는 남습니다. 특히 실제 하교 시간표를 반전하면 터미널 19:50 → 한기대 19:10처럼 시간 순서가 거꾸로인 경로도 통과할 수 있으므로, 단순히 첫 번째 유효 시간으로 대체해서는 안 됩니다. 이번 핫픽스는 시간표의 모든 조회 결과를 바로잡는 수정이 아니며, 이 부분은 실제 운행 방향·정차/하차 표기 규칙을 기준으로 별도 수정해야 합니다.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

버그정상적으로 동작하지 않는 문제상황입니다.

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions