inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

영속성 컨텍스트 2

병합(merge)과 변경감지

해결된 질문

160

ssshhh

작성한 질문수 36

0

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

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

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

java jpa

답변 2

1

y2gcoder

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

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

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

감사합니다.

1

ssshhh

답변감사합니다

0

인프런 AI 인턴

안녕하세요, 인프런 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 값을 덮어쓰는 위험이 있습니다.

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

벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?

0

33

2

inheritance startegy 선택시 고려사항

0

24

1

Entity 동등성 비교

0

25

1

실무 조언 관련 질문입니다.

0

48

1

H2데이터베이스 파일 생성

0

60

2

서브쿼리 강의에서 ALL 예시 관련 질문드립니다.

0

57

2

수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?

0

58

1

JPQL 메소드와 락

0

56

1

Delivery @OneToOne

0

62

1

17강 4~5분대 테이블 값 조회가 안됩니다.

0

98

2

UnsupportedOperationException 발생

0

89

3

H2 Database 연결이 안됩니다.

0

98

2

연관관계 매핑 질문드립니다.

0

88

2

h2데이터베이스 실행오류

0

110

2

persistence.xml

0

112

2

양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?

0

83

1

영속성 컨텍스트

0

70

1

JPA 프록시

0

100

1

Native Query와 MyBatis

0

74

1

영속성 컨텍스트는 어떤 메모리에 저장되는건가요?

0

93

1

임베디드 타입 예시 코드 관련 질문

0

121

3

명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요

0

97

3

인텔리제이 패키지 커서 단축키 질문

0

109

2

혹시 현재는 ID 데이터 타입이 String이면 안되나요?

0

149

1