inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

변경 감지와 병합(merge)

어떤 상태를 준영속이라하는지 , 준영속 역할이 무엇인지 궁금합니다!

98

바나나

작성한 질문수 20

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
준영속이란 한번은 영속상태였지만, 현재는 영속성 컨텍스트의 관리 대상이 아닌 엔티티인데

db 에 저장될떄 pk 가 생기기 떄문에 객체에 식별자가 있으면 무조건 준영속 엔티티인가요?

엔티티매니저에서 꺼내서 Detached되어 식별자가 셋팅되거나 아니면 새로운 객체에 id 값만 셋팅되어 있으면 준영속 상태볼 수 있나요?

왜 준영속 상태는 따로 있나요? 비영속만 있어도 되지않나요? 무슨 이점이 있나요?

java spring 웹앱 spring-boot jpa

답변 2

1

김영한

안녕하세요. 황은경님

다음 내용을 참고해주세요 🙂

https://inf.run/RLG5h

감사합니다.

0

바나나

답변 감사드립니다! 덕분에 준영속상태가 무엇인지 확실히 이해하였습니다.

 

그러면 merge 메서드는 준영속 상태를 영속 상태로 만드는 목적에서 쓰는 것으로 이해하였는데 실무에서는 거의 쓸 일이 없는걸까요?

권장되는 엔티티 변경 패턴은 영속상태 엔티티를 조회하고 엔티티 데이터를 직접 변경하여 더티체킹을 이용하는 것이고 또한 merge 사용시 불필요한 select 쿼리, cacade 병합으로 인한 오버헤드가 발생할 수 있다고 조사하였습니다.

그러니까 merge 는 실무에서 쓸일이 없다라고 이해하면 될까요?

 

1

김영한

안녕하세요. 황은경님

생각하신 것 처럼 대부분의 엔티티 수정 시나리오에서는 영속성 컨텍스트 내에서 엔티티를 조회하고, 변경 감지(더티 체킹)를 활용하는 방식이 권장됩니다.

다음과 같은 특정 상황에서는 merge가 필요할 수 있습니다.

  1. 화면에서 전달된 데이터로 엔티티를 한 번에 업데이트하고 싶을 때:

    사용자 인터페이스로부터 엔티티의 전체 또는 일부 데이터가 전달되었고, 이 정보를 바탕으로 데이터베이스의 엔티티를 업데이트해야 하는 경우, merge는 편리한 옵션이 될 수 있습니다. 물론 이 경우에도 먼저 엔티티를 조회한 후 필요한 필드만 변경하는 방식(더티 체킹)이 더 권장될 수 있지만, 상황에 따라 merge의 "병합" 기능이 더 적합할 수 있습니다.

  2. 스프링 데이터 JPA의 save() 메서드는 내부적으로 merge를 사용합니다(새 엔티티가 아닌 경우). 따라서 스프링 데이터 JPA를 사용하는 프로젝트에서는 간접적으로 merge를 사용하게 됩니다.

감사합니다.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 황은경님께서 질문하신 준영속 상태에 대한 내용은 JPA의 중요한 개념 중 하나인데요. 준영속 상태는 영속 상태였던 엔티티가 영속성 컨텍스트에서 분리되어 JPA의 관리 범위를 벗어난 상태를 의미합니다. 이를 통해 각각의 상태가 다른 라이프사이클을 가지게 되며, 준영속 상태가 필요한 이유는 여러 가지가 있습니다.

  1. 식별자로 준영속 상태 파악: 엔티티가 식별자를 가지고 있다고 해서 자동으로 준영속 상태가 되는 것은 아닙니다. 엔티티는 영속성 컨텍스트에 의해 더 이상 관리되지 않는 경우 준영속 상태가 됩니다. 예를 들어, EntityManager.detach() 메서드를 사용하여 특정 엔티티를 분리하거나, EntityManager.clear() 메서드를 사용하여 영속성 컨텍스트를 모두 비우면 엔티티들은 준영속 상태가 됩니다.

  2. 준영속 상태의 역할과 이점: 준영속 상태가 유용한 이유는 데이터 변경 작업을 수행하고 나중에 데이터베이스와 동기화하고 싶을 때입니다. 예를 들어, 대규모의 수정 작업을 하고 싶지만, 모든 엔티티를 영속 상태로 유지하면 메모리 자원이 많이 소모될 수 있습니다. 이럴 때 준영속 상태로 변경하고 필요한 시점에 다시 병합(merge())하여 데이터베이스에 반영할 수 있습니다.

질문하신 내용에 대한 유사한 질문과 답변을 참고하시면 더 깊은 이해에 도움이 될 것입니다. 다음 링크들을 확인해 주세요:

  1. 준영속 상태를 다룬 게시물입니다. 여기에는 영속성 컨텍스트와 준영속 상태에 대한 설명이 있습니다.
  2. 준영속 상태 엔티티에 대해 답변에서는 준영속 상태의 정의와 특징에 대해 설명하고 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

OrderServiceTest 상문주문 테스트 시 update 쿼리 문의

0

27

1

sdk 설정 오류

0

66

2

오탈자 - @Transactional

0

62

1

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

0

56

1

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

0

70

1

MemberRepositoryTest 실행오류

0

90

1

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

1

195

2

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

1

153

2

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

0

56

1

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

0

80

1

기본 생성자

0

67

1

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

0

106

1

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

0

173

4

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

0

124

1

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

0

128

2

자신 필드에도 get으로 접근하는 이유가 있을까요?

0

121

1

24분 27초 연관관계 편의 메서드 위치

0

118

1

단건 주문만 가능하게 한건 의도한 부분이신가요?

0

114

2

빌드 툴, Gradle

0

63

1

h2연결은 된 것 같은데 엔티티 테이블까지 작성 후 확인해보아도 테이블이 안보입니다

0

81

2

Repository에서 EntityManager 주입 방식 차이

0

97

1

롬복과 사용자 정의 setter 메서드

0

77

1

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

0

91

1

dirty checking 질문드립니다.

0

86

1