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

김상형님의 프로필 이미지
김상형

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

영속성 컨텍스트 2

병합(merge)과 변경감지

해결된 질문

작성

·

53

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예

[질문 내용]
JPA 활용 1편을 듣고 jpa기본편을 책과 함께 수강중입니다.
JPA 활용 1편에서 merge를 사용하면 모든 값을 다 바꾸어서 파라미터로 지정해 주지 않으면 null값이 할당되어 데이터에 문제가 생길 확률이 높다고 배웠습니다. 따라서 이것이 merge의 특성인 거로 생각하고 있었는데,
jpa기본편 책 105페이지에 jpa기본 전략은 엔티티의 모든 필드를 업데이트 한다 라고 되어있었습니다. 그래서 약간 혼란이 왔었는데 이내 다시 정리해볼 수 있었습니다.

그래서 내려본 결론은 변경 감지를 통하여도 모든 필드가 업데이트 되는 것은 맞는데, 스냅샷을 통해서 변경 없는 필드의 정합성은 유지하고, 변경되는 부분만 안전하게 변경할 수 있다. JPA 활용 1편에서 한 merge예제는 준 영속인 엔티티 객체를 만들어 버렸기 때문에 필드 값을 할당할 때에 누락되면 기존 데이터가 반영이 안된다 (스냅샷 같은 것이 없기 때문) 으로 정리할 수 있을까요?

답변 2

1

안녕하세요. ideal0427 김상형님, 공식 서포터즈 y2gcoder입니다.

생각하신 부분대로 저도 이해하고 있습니다!

추가로 AI 인턴의 답변도 참고해보시는 것을 추천합니다!

감사합니다.

김상형님의 프로필 이미지
김상형
질문자

답변감사합니다

0

안녕하세요, 인프런 AI 인턴입니다. ideal0427 김상형님.

JPA의 병합(merge)과 변경감지(dirty checking)에 대해 헷갈릴 수 있는 부분들을 잘 정리해주셨네요. 관련된 기존 답변들을 찾아 몇 가지 추가 정보를 제공드리고자 합니다.

  1. EntityManager api관련 질문입니다.

    • 병합(merge)의 용도는 기본적으로 준영속 상태의 엔티티를 다시 영속 상태로 만들기 위한 것이며 이를 잘못 사용하면 null 값이 덮어씌워져 데이터 유실 위험이 있습니다. 변경감지(dirty checking)를 통해 엔티티의 특정 필드가 수정되었는지 자동으로 확인하고 변화된 부분만 업데이트하도록 하는 것이 JPA의 기본 전략입니다.
  2. 변경감지

    • 변경감지는 직접 merge를 사용하지 않고도 영속성 컨텍스트가 변경된 필드를 추적하여 트랜잭션 커밋 시점에 필요한 업데이트를 수행합니다. 반면, 직접 merge를 사용하면 엔티티의 모든 필드를 업데이트하게 되며, null이 있는 경우 예기치 않은 데이터 유실이 발생할 수 있습니다.
  3. jpa merge 관련 문의 드립니다.

    • 영속 상태의 엔티티를 merge하는 것은 사실상 아무런 의미가 없으며, 이 경우 merge 호출은 단순히 무시됩니다. 그러나 준영속 상태의 엔티티를 영속화하려는 경우에는 주의가 필요합니다.

위의 링크를 참고하여 좀 더 상세한 설명을 확인해보시길 추천드립니다. 결론적으로:

  • 변경감지(dirty checking)는 스냅샷을 통해 엔티티 상태의 변경을 추적하여 필요시 업데이트합니다.
  • 병합(merge)는 준영속 상태의 엔티티를 영속화하지만 실수로 null 값을 덮어쓰는 위험이 있습니다.

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

김상형님의 프로필 이미지
김상형

작성한 질문수

질문하기