해결된 질문
작성
·
337
0
1. 테스트의 주문취소 부분에서, 멤버가 가지고 있는 order에도 주문취소가 적용되는 지 확인하고 싶어
assertEquals(OrderStatus.CANCEL, member.getOrders().get(0).getStatus());
이렇게 코드를 추가해보니 테스트가 통과되더라구요. 이것도 영속성컨텍스트가 다 관리해주기 때문인가요??
2. 혹시나 하는 호기심에 cancelOrder대신에 em.remove 를 사용하여 해당 Order를 지워봤습니다. 그렇게 할 경우 db내에서 해당 튜플은 지워지지만 위에처럼 객체 내에서 추적하여 Member가 가지고 있는 Order에 영향을 주는가했더니 그렇지 않더라구요. 이런식으로 작동하는것이 맞나요? 아니면 제가 놓치고 있는것이 있을까요.
3. (2번이 맞다는가정의 질문) 앞으로 다른 앱을 만들 때 게시글이라던지 특정 객체를 삭제하고 싶을 때, 영속성 컨텍스트가 관리를 해주기 원한다면, 이런식으로 일종의 논리삭제를 해주는 식으로 진행해야 하는건가요?
답변 1
0
안녕하세요. whrbdnjs33님, 공식 서포터즈 David입니다.
.
1. 영속성 컨텍스트와 무관하게
orderService.cancelOrder()는 내부에서 order.cancel() 메서드를 호출합니다.
order.cancel() 메서드는 status를 CANCEL로 바꾸는 로직을 가지고 있습니다.
따라서 주문취소가 발생하면 로직상 OrderStatus가 CANCEL로 되는 것입니다.
2. 이런 방식을 soft delete라고 합니다. DB에서 주문 데이터 자체를 삭제하는 것이 아니라 논리적으로 삭제처리하는 것입니다. 취소된 내역이라 할지라도 원본 데이터는 보존하여 문제 발생시 데이터를 추적할 때 사용될 수도 있습니다.
3. 물리적으로 삭제를 원하신다면 OrderService에서 DB에서 데이터를 삭제하는 메서드를 호출하시면 됩니다. 논리삭제와는 무관합니다.
.
감사합니다.
아하 em.flush()와 em.clear()가 필요했군요!!
감사합니다! 이상했던 부분이 해결됐어요.
근데 알림메일에선 글이 보였는데 여기선 (작성중) 이라고 나오면서 글이 안보이네요ㅠㅠ
아 제가 물어보고자 했던 부분은 단순히 order의 주문상태가 변경됐다는 것이 아니라, member가 가지고 있는 order객체의 주문상태도 변경이 됐다는 부분입니다.
두 코드의 차이점에 유의해주세요.
원래코드:
assertEquals(OrderStatus.CANCEL, order.getStatus());
추가한 코드:
assertEquals(OrderStatus.CANCEL, member.getOrders().get(0).getStatus());
그런데 제가 2번에서 의아했던 부분은, 물리삭제를 하면 위의 경우처럼 member가 가지고 있는 order객체가 사라지는 것이 아니라, 여전히 살아있는 부분 이었습니다.
그래서 논리삭제(상태변경)를 하면 영속성컨텍스트가 관리해주지만, 물리삭제를 하면 그렇게 해주지 않는건가? 라고 생각했던 것입니다.
혹시나 해서 제가 돌렸던 테스트코드도 아래 첨부하겠습니다.