🚨 오류 상황 및 원인
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 스냅샷은 확보하지 않았습니다. 위 조합은 동일 오류를 재현한 조건이며 원 요청을 특정한 것은 아닙니다.
이번 핫픽스 범위 / 완료 조건
DB나 시간표를 변경하지 않고 이번 NPE를 차단하는 범위입니다. 서비스가 계산할 수 없는 항목은 기존 응답 규칙에 따라 제외합니다.
별도 후속 과제
Route의 노선 방향/운행 구간 판정과 중복 정류장 선택 불일치는 남습니다. 특히 실제 하교 시간표를 반전하면 터미널 19:50 → 한기대 19:10처럼 시간 순서가 거꾸로인 경로도 통과할 수 있으므로, 단순히 첫 번째 유효 시간으로 대체해서는 안 됩니다. 이번 핫픽스는 시간표의 모든 조회 결과를 바로잡는 수정이 아니며, 이 부분은 실제 운행 방향·정차/하차 표기 규칙을 기준으로 별도 수정해야 합니다.
🚨 오류 상황 및 원인
GET /bus에서 도착 시각이 없는 셔틀/통학버스 항목과 정상 항목이 함께 정렬되면 HTTP 500이 발생합니다.BusRemainTime.from()은 null 또는 시간으로 해석할 수 없는 문자열을 받으면busArrivalTime=null인 객체를 만듭니다.ShuttleBusService가 이 객체를.distinct().sorted()로 처리하면서 예외가 발생합니다. 상위BusService.toResponse()에는 이미 남은 시간을 계산할 수 없는 항목을 제거한 뒤 정렬하는 로직이 있지만, 선행 정렬에서 예외가 나므로 도달하지 못합니다.재현 근거
천안 셔틀 / 토요일 오후와일학습병행대학 천안시내 / 하교 3·4회데이터를 토요일 11:25 KST의 로컬 fixture로 구성합니다.bus_type=shuttle&depart=terminal&arrival=koreatech경로를 실행하면 정상14:25항목과 도착 시각이 없는 항목이 함께 선택되어 같은 예외 문구와 85행이 재현됩니다.터미널정류장이 두 번 있습니다. 노선 판정은 뒤쪽의 유효한 시간을 보고 통과시키지만, 잔여 시간 추출은 첫 번째 일치 정류장의 null을 선택할 수 있습니다.이번 핫픽스 범위 / 완료 조건
ShuttleBusService의 선행 정렬을 제거하여 기존BusService.toResponse()의 필터 → 정렬 순서를 사용한다.DB나 시간표를 변경하지 않고 이번 NPE를 차단하는 범위입니다. 서비스가 계산할 수 없는 항목은 기존 응답 규칙에 따라 제외합니다.
별도 후속 과제
Route의 노선 방향/운행 구간 판정과 중복 정류장 선택 불일치는 남습니다. 특히 실제 하교 시간표를 반전하면터미널 19:50 → 한기대 19:10처럼 시간 순서가 거꾸로인 경로도 통과할 수 있으므로, 단순히 첫 번째 유효 시간으로 대체해서는 안 됩니다. 이번 핫픽스는 시간표의 모든 조회 결과를 바로잡는 수정이 아니며, 이 부분은 실제 운행 방향·정차/하차 표기 규칙을 기준으로 별도 수정해야 합니다.