@Test
@DisplayName("์ ์ ๊ฐ ๋ฐํ, ์ทจ์ํ ์ํ๋ค์ ์กฐํํ ์ ์๋ค. ")
public void findDistinctWithDetailsByMemberId() {
// given
Member member = Member.builder().build();
Order order = Order.builder()
.member(member)
.orderNo("123")
.build();
Product product1 = Product.builder().build();
Product product2 = Product.builder().build();
Product product3 = Product.builder().build();
OrderDetail orderDetail1 = OrderDetail.builder()
.order(order)
.product(product1)
.statusCode(StatusCodeType.RETURN_COMPLETED.getCode())
.build();
OrderDetail orderDetail2 = OrderDetail.builder()
.order(order)
.product(product2)
.statusCode(StatusCodeType.ORDER_CANCEL.getCode())
.build();
OrderDetail orderDetail3 = OrderDetail.builder()
.order(order)
.product(product3)
.statusCode(StatusCodeType.DELIVERY_DELAY.getCode())
.build();
order.addOrderDetail(orderDetail1);
order.addOrderDetail(orderDetail2);
order.addOrderDetail(orderDetail3);
productRepository.saveAll(List.of(product1, product2, product3));
memberRepository.save(member);
orderRepository.save(order);
// when
List<Order> orders = orderRepository.findDistinctWithDetailsByMemberId(member.getId());
// then
assertThat(orders).hasSize(1)
.extracting("orderNo")
.contains("123");
List<OrderDetail> orderDetails = orders.get(0).getOrderDetails();
assertThat(orderDetails).hasSize(2);
}
@Override
public List<Order> findDistinctWithDetailsByMemberId(Long memberId) {
BooleanExpression statusCondition = orderDetail.statusCode.eq(ORDER_CANCEL.getCode());
BooleanExpression orCondition = statusCondition.or(orderDetail.statusCode.eq(RETURN_COMPLETED.getCode()));
return queryFactory
.selectDistinct(order)
.from(order)
.join(order.orderDetails, orderDetail).fetchJoin()
.where(
order.member.id.eq(memberId),
orCondition
)
.fetch();
}
memberId์ ORDER_CANCEL,RETURN_COMPLETED ์ํ๋ก ๊ฑธ๋ฌ์ ์ต์ข ์ ์ผ๋ก ์ํ๋ orderDetail์ด 2๊ฐ ๋์ฌ ๊ฒ์ผ๋ก ์์ํ๋ค. ๊ทธ๋ฌ๋ ์์๊ณผ ๋ฌ๋ฆฌ 3๊ฐ์ orderDetail์ด ๋์๋ค.
em.flush();
em.clear();
// when
List<Order> orders = orderRepository.findDistinctWithDetailsByMemberId(member.getId());
when์ ์ด์ ์ ๊ฐ์ ๋ก ์์์ฑ ์ปจํ ์คํธ๋ฅผ ํ๋ฌ์ํ๊ณ ํด๋ฆฌ์ด ํด์ฃผ๋ ์์๋๋ก orderDetail์ด 2๊ฐ๊ฐ ๋ฐํ๋์๋ค.
JPA๊ฐ ๋ ๋ฆฐ ์ฟผ๋ฆฌ๋ฅผ ๊ทธ๋๋ก db์ ๋ฐ์ํ๋ฉด ์์ํ๋๋๋ก 2๊ฐ์ orderDetail์ด ๋์จ๋ค. ์ฆ, ์์ฑํ ์ฟผ๋ฆฌ์๋ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ผ๋ก ํ๋จํ๋ค.
๋๋์ฒด ์ด๋์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒ์ผ๊น? ์์ธกํ๊ธฐ๋ก๋ ์์์ฑ ์ปจํ ์คํธ์ ๋น๋ฐ์ด ๋ถ๋ช ํ ์์๊ฒ์ผ๋ก ํ๋จํ๋ค.
๋ฐ๋ก ์์์ฑ ์ปจํ
์คํธ์ ๋งค์ปค๋์ฆ ๋๋ฌธ์ด์๋ค.
์์์ฑ ์ปจํ
์คํธ๋ฅผ ํ๋ฌ์, ํด๋ฆฌ์ดํ๊ธฐ ์ด์ ์ ๋ถ๋ช
ํ order๋ orderDetail์ 3๊ฐ ๊ฐ์ง๊ณ ์์์ฑ ์ปจํ
์คํธ์ ์บ์ฑ๋์ด ์์ ๊ฒ์ด๋ค. ์ดํ JPQL์ ์ด์ฉํด ํํฐ๋งํด์ ๊ฐ์ ธ์ค๋๋ผ๋ ์ด๋ฏธ JPA๋ ์์์ฑ ์ปจํ
์คํธ์ ๊ฐ์ @Id๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ db์์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๋ฒ๋ฆฐ ํ ์์์ฑ ์ปจํ
์คํธ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ด๋ค..!
์์ธํ ๋ด์ฉ์ ์ข ๋ ๊ณต๋ถํด์ ์ฌ๋ ค๋ณด๋๋ก ํ๊ฒ ๋ค!!