작성
·
386
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가지 차이점에 대해서 설명 부탁드립니다!
감사합니다 :)
답변 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 하는 쿼리를 만들어 실행하게 됩니다.
감사합니다.