개인 프로젝트에서 stream을 사용하던 중 발생한 예외에 대해 기록한다.
가게의 정보 조회 테스트 코드 검증 도중 의도하지 않은 NPE가 발생
@Getter
public class RestaurantDetailResDto {
private Long id;
private String name;
private int minPrice;
private int deliveryFee;
private List<MenuResDto> menuList;
public RestaurantDetailResDto(Restaurant restaurant) {
this.id = restaurant.getId();
this.name = restaurant.getName();
this.minPrice = restaurant.getMinPrice();
this.deliveryFee = restaurant.getDeliveryFee();
// 메뉴 리스트의 값이 null일 수 있는 경우를 고려하지 않음
this.menuList = restaurant.getMenus().stream().map(
MenuResDto::new).collect(Collectors.toList());
}
}
위의 코드에서 보면 restaurant 객체에서 메뉴 리스트를 가져온 후
stream을 통해 MenuResDto의 리스트를 반환하는 로직인데
내가 이 코드를 작성할 때는 데이터가 없는 경우 빈 리스트를 반환할 것이라는 생각에 아무런 처리를 하지 않았고 테스트 코드에서 null이 발생한다는 것을 알게 되었다.
@Getter
public class RestaurantDetailResDto {
private Long id;
private String name;
private int minPrice;
private int deliveryFee;
private List<MenuResDto> menuList;
public RestaurantDetailResDto(Restaurant restaurant) {
this.id = restaurant.getId();
this.name = restaurant.getName();
this.minPrice = restaurant.getMinPrice();
this.deliveryFee = restaurant.getDeliveryFee();
//Optional.ofNullable, orElseGet을 사용해 null일 경우 빈 리스트를 반환하도록 변경
this.menuList = Optional.ofNullable(restaurant.getMenus()).orElseGet(Collections::emptyList).stream().map(
MenuResDto::new).collect(Collectors.toList());
}
}
Optional을 사용해 null 값을 체크하도록 기능을 추가하고
null일 경우 빈 리스트를 반환하도록 구현하고
null이 아닌 경우 원래 기대했던 기능대로 메뉴 리스트를 stream을 통해
MenuResDto 리스트로 변경하는 기능을 구현했다.