inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

주문 기능 테스트

주문취소 테스트시

해결된 질문

274

궁그미

작성한 질문수 5

0

주문취소쪽 테스트하다가 궁금한점 있어 질문드립니다.

취소할 주문ID를 조회하고

Order order = orderRepository.findOne(orderId);

order.cancel(); 로 주문취소하기 전에 orderItems에 값이 넣어져 있는지 모르겠습니다.

Order와 OrderItem은 @OneToMany로 기본이 LAZY 로딩이라 orderItems을 직접 호출하기 전까지는 데이터를 조회하지 않는거로 알고 있는데 어떻게 orderItems에 값이 채워져서 취소가 되는지요?...

for (OrderItem orderItem : orderItems) {
orderItem.cancel();
}

저 for문 시점에 데이터를 조회하면 이해하겠는데 디버깅해보면 order를 조회할때 이미 값이 다 채워져 있습니다...

주문취소 JPA 웹앱 spring-boot java spring

답변 2

2

OMG

안녕하세요. 궁그미님, 공식 서포터즈 OMG입니다.

JPA를 학습하시면서 프록시에 대해서 학습을 하신적이 있으신가요?

관련하여 JPA 기본편 학습을 권장드립니다.

추가적으로 부연설명 하나만 드리면 아래는 서로 다른 두 개의 포스팅을 참고하였습니다.

공통으로 보이는 특이한 키워드가 보일까요?

그 키워드를 올리신 디버깅 화면에서 찾아보시겠어요?

제가 드린 힌트를 바탕으로 궁금하신 사항과 연관지어 학습을 이어나가시면 될 것 같습니다.

 

참고

(JPA - 4) 프록시 객체, 즉시로딩, 지연로딩 | KihoonKim:Dev

[jpa] 프록시와 연관관계 관리 | 기록은 기억의 연장선 (joont92.github.io)

감사합니다. 

0

궁그미

이해가 잘안되어 재질문 드립니다...

Order order = orderRepository.findOne(orderId);  실행시 order.orderItems는 프록시인거는 이해했는데요.

프록시는 실제 데이터 조회할때 초기화해서 데이터 가져오는데

order.cancel() 내부 비즈니스 로직

for(OrderItem orderItem : orderItems) {

   orderItem.cancel();

}

실행하기 전에 Order order = orderRepository.findOne(orderId);  조회할때 이미 orderItems에 값(id, price, stockquentity)이 채워져 있어  헷갈리네요. 원래 그런건가해서요.

프록시 상태일때 엔티티를 참조만하는게 아니라 값도 가지고 있고, 실제 데이터 조회할 때 다시 가지고 오는건지요?

학습해서 이해한 내용은 엔티티를 참조만하고 실제 데이터는 조회할때 초기화해서 가지고 오는거로 알고 있습니다...

관련해서 별도로 테스트해본 부분도 잘 이해가 안되어 질문 드려요.

아래 첫번째 캡쳐는 member insert하고 영속성 컨텍스트 초기화하고 프록시로 조회하여 select 쿼리가 안나가는거는 맞는데

두번째 캡쳐에서 어딘가에 디버깅 모드를 걸어서 테스트하면 프록시로 조회할때 select 쿼리가 나갑니다. 이것도 왜 그런지 모르겠네요...

두 테스트 차이는 단지 브레이크 포인트입니다.

1

김영한

안녕하세요. 궁그미님

처음 테스트 코드를 보셔야 합니다.

orderService.order()를 호출하면 Order와 OrderItem이 모두 만들어진 상태로 유지됩니다.

따라서 다시 조회해도 이미 Order-> OrderItem이 함께 존재하게 됩니다.

처음 테스트 코드에서 em.flush(); 이후에 em.clear()로 영속성 컨텍스트를 완전히 지우고

주문을 em.find()로 처음부터 다시 조회하셔야 프록시 상태의 orderItems를 볼 수 있습니다.

추가로 디버그 모드에서 Lazy 엔티티를 확인하게 되면 초기화 처리가 되어버립니다.

감사합니다.

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