stream 오류

Lee·2023년 9월 10일
0

서론

개인 프로젝트에서 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 리스트로 변경하는 기능을 구현했다.

profile
발전하고 싶은 백엔드 개발자

0개의 댓글