주문취소와 영속성 컨텍스트
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에서 데이터를 삭제하는 메서드를 호출하시면 됩니다. 논리삭제와는 무관합니다.
.
감사합니다.
0
아 제가 물어보고자 했던 부분은 단순히 order의 주문상태가 변경됐다는 것이 아니라, member가 가지고 있는 order객체의 주문상태도 변경이 됐다는 부분입니다.
두 코드의 차이점에 유의해주세요.
원래코드:
assertEquals(OrderStatus.CANCEL, order.getStatus());
추가한 코드:
assertEquals(OrderStatus.CANCEL, member.getOrders().get(0).getStatus());
그런데 제가 2번에서 의아했던 부분은, 물리삭제를 하면 위의 경우처럼 member가 가지고 있는 order객체가 사라지는 것이 아니라, 여전히 살아있는 부분 이었습니다.
그래서 논리삭제(상태변경)를 하면 영속성컨텍스트가 관리해주지만, 물리삭제를 하면 그렇게 해주지 않는건가? 라고 생각했던 것입니다.
혹시나 해서 제가 돌렸던 테스트코드도 아래 첨부하겠습니다.
@Test
public void 주문취소() throws Exception {
//given
Member member = createMember();
Item item = createBook("책이름1", 10000, 10);
int orderCount = 2;
Long orderId = orderService.order(member.getId(), item.getId(), orderCount);
//when
orderService.cancelOrder(orderId);
//then
Order order = orderRepository.findOne(orderId);
assertEquals(OrderStatus.CANCEL, order.getStatus());
assertEquals(10, item.getStockQuantity());
assertEquals(OrderStatus.CANCEL, member.getOrders().get(0).getStatus(), "따로 추가. member가 가지고 있는 order도 변경된다.");
}
@Test
public void 주문삭제() throws Exception {
//given
Member member = createMember();
Item item = createBook("책이름1", 10000, 10);
int orderCount = 2;
Long orderId = orderService.order(member.getId(), item.getId(), orderCount);
//when
orderService.deleteOrder(orderId);
Member member1 = memberService.findOne(member.getId());
Order order = orderRepository.findOne(orderId);
//then
assertEquals(OrderStatus.ORDER, member1.getOrders().get(0).getStatus(), "통과되면 안될텐데 통과된다");
assertEquals(null, order, "order 튜플은 삭제된게 맞음");
}
1

0
아하 em.flush()와 em.clear()가 필요했군요!!
감사합니다! 이상했던 부분이 해결됐어요.
근데 알림메일에선 글이 보였는데 여기선 (작성중) 이라고 나오면서 글이 안보이네요ㅠㅠ

sdk 설정 오류
0
50
2
오탈자 - @Transactional
0
55
1
src/test/resources 테스트 경로 문제
0
50
1
상품 등록후 H2 db 출력 순서 바꿀 수 있나요?
0
64
1
MemberRepositoryTest 실행오류
0
81
1
boot 4.x >>> trasasction rolled back log & p6spy(영한님, 수업 자료 업데이트 해주시면 감사하겠습니다!!)
1
183
2
강의 마지막 QueryDSL 사용 부분 질문있습니다
1
139
2
클라이언트에서 isbn과 author 수정 요청을 한 경우에 대해 질문드립니다.
0
51
1
도메인 모델 패턴 vs 트랜잭션 스크립트 패턴
0
71
1
기본 생성자
0
60
1
h2 DB 연결시 jdbc url 변경 이유가 궁금합니다.
0
101
1
멤버서비스테스트 부분에서 막힙니다.
0
164
4
실무에서도 EntityManager를 이용해서 많이 작업하는 편일까요?
0
116
1
초반에 h2 다운로드 과정 꼭 필요한가요?
0
119
2
자신 필드에도 get으로 접근하는 이유가 있을까요?
0
114
1
24분 27초 연관관계 편의 메서드 위치
0
113
1
단건 주문만 가능하게 한건 의도한 부분이신가요?
0
109
2
빌드 툴, Gradle
0
59
1
h2연결은 된 것 같은데 엔티티 테이블까지 작성 후 확인해보아도 테이블이 안보입니다
0
77
2
Repository에서 EntityManager 주입 방식 차이
0
90
1
롬복과 사용자 정의 setter 메서드
0
71
1
주문 목록 조회 fetch join 질문드립니다
0
81
1
dirty checking 질문드립니다.
0
82
1
동시성 관련 질문입니다
0
74
1





