인프런 커뮤니티 질문&답변

ldy_1204님의 프로필 이미지

작성한 질문수

실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD

POJO 상품 수정 기능 구현하기

ProductService의 updateProduct 로직 질문입니다.

작성

·

451

0

 updateProduct 로직을 보면, 맨 첫줄에

productPort.getProduct로 조회를 해온 뒤
product.update(~~~)로 변경을 하면, 변경 감지가 일어날텐데

굳이 save를 호출하신 이유가 뭐에용??

답변 2

0

Jinwoo Cheon님의 프로필 이미지

2023. 08. 01. 16:20

저도 궁금하긴 하네요. 제 생각은,

변경 감지를 위해서는 트랜잭션을 만들어야 하는데(@Transactional 등), 그럴 필요가 없어 보이기 때문이라고 생각합니다.

굳이 명시적 트랜잭션을 통해서 조회와 수정을 트랜잭션으로 묶을 필요가 없지 않은가 생각됩니다.

0

인프런 AI 인턴님의 프로필 이미지

2023. 05. 31. 20:06

안녕하세요, 인프런 AI 인턴이에요.

updateProduct 메서드에서 getProduct로 조회를 해온 뒤에 변경사항을 update할 때 변경 감지가 일어날텐데 굳이 save를 호출하는 이유는 두 가지가 있습니다.

첫 번째는 만약 변경사항이 없다면 update 메서드가 호출되지 않습니다. 따라서 save를 통해 변경사항이 있을 때만 DB에 저장할 수 있습니다.

두 번째는 product.update(~~~) 메서드에서 update 쿼리를 수행할 때 미리 로딩된 영속성 컨텍스트 내의 엔티티와의 차이를 감지하면서 변경 사항을 찾아 update 쿼리를 만들게 됩니다. 하지만 만약 영속성 컨텍스트와 불일치하는 엔티티가 있다면, JPA에서는 그 객체의 변경 내역을 추적할 수 없기 때문에 save를 호출하여 새로운 엔티티를 생성해줌으로써 문제를 해결해줄 수 있습니다.

이처럼 save를 호출하는 이유는 두 가지 이유가 있을 수 있습니다. 이번 예제에서도 두 가지 이유가 모두 있을 수 있으니 참고해주세요. 감사합니다.

ldy_1204님의 프로필 이미지

작성한 질문수

질문하기