728x90

ispresent vs ifpresent 의 차이점

Optional<OrderDto> optionalOrderDto = queryFactory
        .select(Projections.constructor(OrderDto.class, order, user))
        .from(order)
        .leftJoin(order.user, user)
        .where(order.id.eq(orderId))
        .fetchOneOptional();

if (optionalOrderDto.isPresent()) {
    OrderDto orderDto = optionalOrderDto.get();

    List<OrderItemDto> orderItemDtos = queryFactory
        .select(Projections.constructor(OrderItemDto.class, item))
        .from(orderItem)
        .join(orderItem.item, item)
        .where(orderItem.order.id.eq(orderId))
        .fetch();

    orderDto.setOrderItemDtos(orderItemDtos);

    return orderDto;
} else {
    throw new NotFoundException("Order not found");
}

위 코드에서는 isPresent() 메서드를 사용하여 Optional 객체가 null인지 체크하고, get() 메서드를 사용하여 OrderDto 객체를 가져옵니다. OrderDto 객체가 null이 아니면 해당 객체를 사용하여 쿼리를 실행하고, null이면 NotFoundException 예외를 발생시킵니다.

반면에 ifPresent()를 사용하면 다음과 같이 null 체크와 쿼리 실행을 한 번에 할 수 있습니다.

queryFactory
        .select(Projections.constructor(OrderDto.class, order, user))
        .from(order)
        .leftJoin(order.user, user)
        .where(order.id.eq(orderId))
        .fetchOneOptional()
        .ifPresent(orderDto -> {
            List<OrderItemDto> orderItemDtos = queryFactory
                    .select(Projections.constructor(OrderItemDto.class, item))
                    .from(orderItem)
                    .join(orderItem.item, item)
                    .where(orderItem.order.id.eq(orderId))
                    .fetch();

            orderDto.setOrderItemDtos(orderItemDtos);
        })
        .orElseThrow(() -> new NotFoundException("Order not found"));

위 코드에서는 ifPresent() 메서드를 사용하여 Optional 객체가 null이 아닐 때만 람다식을 실행하고, orElseThrow() 메서드를 사용하여 NotFoundException 예외를 발생시킵니다.

isPresent()ifPresent() 모두 null 체크를 수행하지만, ifPresent()는 null 체크와 쿼리 실행을 한 번에 처리할 수 있습니다. 그러나 ifPresent()는 리턴값을 갖지 않기 때문에, 리턴값을 사용해야 하는 경우에는 isPresent()get() 메서드를 사용해야 합니다.


내저장소 바로가기 luxury515

+ Recent posts