inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

주문 서비스 개발

JPA 특징 중 자동 업데이트 관련

493

빈빈

작성한 질문수 4

2

주문 서비스 개발 부분 강의를 듣다가 궁금한 점이 있어 질문드립니다.

 

주문 취소(OrderService.cancelOrder) 부분에서order.cancel() 만 작성하면 JPA 특징으로 인해, 데이터 업데이트 관련 쿼리 로직 없이 자동으로 업데이트 된다고 하셨는데요.

 

주문 생성(OrderService.order)의 EntityManager 가 사용된 orderRepository.save(order);  와 혼동이 와서 질문 남깁니다.

 

주문 취소 order.cancel() 메서드를 타면서 엔티티의 값(status, count 등) 변경 내역이 자동으로 업데이트 되는 것이라고 하면, 주문 생성도 Order.createOrder(member, delivery, orderItem); 를 타면서 엔티티의 값들을 설정하기 때문에 orderRepository.save(order); 를 사용하지 않아도 되는게 아닌가 라는 생각이 듭니다.

 

제가 JPA 를 잘 몰라서 혼란이 오는 것 같은데..

쿼리는 직접 작성하지 않아도 업데이트/저장/삭제 등 DB 조작이 일어나려면 EntityManager 를 통해야 된다고 생각하고 있었습니다.

주문 취소는 EntityManager 없이 업데이트 되고, 주문 생성은 EntityManager의 persist() 를 사용해서 저장하는 것

이 2가지 차이점에 대해서 설명 부탁드립니다!

 

감사합니다 :)

 

 

java spring 웹앱 spring-boot jpa

답변 1

3

나무늘보

안녕하세요. 빈빈님, 공식 서포터즈 코즈위버입니다.

Entity 객체가 '영속성 컨텍스트'에 존재하는가 아닌가가 중요한데요,

우선 Member를 저장하는 프로세스를 보면, Member 클래스로 인스턴스를 만들고 설정해야 하는 setter혹은 생성자로 넣어주겠지요? (혹은 인스턴스를 만드는 과정 자체를 Builder 패턴으로 처리할 수도 있습니다) 이 Member 인스턴스는 아직 영속성 컨텍스트과 관리하는 객체가 아닙니다. 그래서 데이터베이스와 매핑되지 않지요. 이때 em.persist(member); 를 하면, 이 순간 영속성 컨텍스트에서 이 Member 인스턴스를 관리합니다. 그리고 데이터베이스에 insert 를 수행하지요.

 

이번엔 업데이트를 보겠습니다. Member 정보를 수정하려면 우선 영속성 컨텍스트에 Member를 올려야 합니다. memberRepository.findById(memberId); 와 같은 형태로 데이터베이스에서 데이터를 조회해 영속성 컨텍스트로 등록하고 이를 참조할 수 있는 인스턴스를 반환합니다. 그리고 이 인스턴스의 setter 혹은 changeXxx 같은 편의메서드로 속성을 수정합니다. 중요한 건 이미 객체가 영속성 컨텍스트에 올라가 있다는 사실입니다. 그래서 개발자가 em.persist(member); 와 같은 명시적 저장 코드를 작성하지 않아도 JPA에서 변경한 속성을 update 하는 쿼리를 만들어 실행하게 됩니다.

감사합니다.

sdk 설정 오류

0

55

2

오탈자 - @Transactional

0

56

1

src/test/resources 테스트 경로 문제

0

51

1

상품 등록후 H2 db 출력 순서 바꿀 수 있나요?

0

64

1

MemberRepositoryTest 실행오류

0

81

1

boot 4.x >>> trasasction rolled back log & p6spy(영한님, 수업 자료 업데이트 해주시면 감사하겠습니다!!)

1

184

2

강의 마지막 QueryDSL 사용 부분 질문있습니다

1

144

2

클라이언트에서 isbn과 author 수정 요청을 한 경우에 대해 질문드립니다.

0

52

1

도메인 모델 패턴 vs 트랜잭션 스크립트 패턴

0

72

1

기본 생성자

0

61

1

h2 DB 연결시 jdbc url 변경 이유가 궁금합니다.

0

103

1

멤버서비스테스트 부분에서 막힙니다.

0

167

4

실무에서도 EntityManager를 이용해서 많이 작업하는 편일까요?

0

116

1

초반에 h2 다운로드 과정 꼭 필요한가요?

0

120

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

73

1

주문 목록 조회 fetch join 질문드립니다

0

82

1

dirty checking 질문드립니다.

0

83

1

동시성 관련 질문입니다

0

75

1