강의

멘토링

로드맵

Inflearn brand logo image

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

황은경님의 프로필 이미지
황은경

작성한 질문수

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

변경 감지와 병합(merge)

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

작성

·

70

0

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

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

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

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

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

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

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

답변 2

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 황은경님

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

https://inf.run/RLG5h

감사합니다.

황은경님의 프로필 이미지
황은경
질문자

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

 

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

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

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

 

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 황은경님

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

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

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

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

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

감사합니다.

0

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

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

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

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

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

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

황은경님의 프로필 이미지
황은경

작성한 질문수

질문하기