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
'Back-end > 기타' 카테고리의 다른 글
IPv6 와 IPv4 를 비교했을때 장점은 뭐지? (0) | 2023.04.13 |
---|---|
equals()와 hashCode() 에 대한 고찰 (0) | 2023.04.13 |
Optional 클래스(3) : orElse()와 orElseGet() 차이 (0) | 2023.04.11 |
AI는 과연 어디까지 선을 넘을까? (0) | 2022.12.13 |
웹 화면 전체를 회색으로 변하게 하는 가장 효율적인 방법은? (0) | 2022.12.09 |