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

ijeee님의 프로필 이미지
ijeee

작성한 질문수

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

변경 감지와 병합(merge)

Book이 준영속 엔티티

작성

·

491

0

updateItem 메소드에서 Book이 DB에 저장된적이 있어서 식별자가 존재하여 영속성 컨텍스트에서 관리하지 않는다고 하셨는데요.

1. 그러면 Book을 new Book()으로 생성하고 setId에서 임의로 현재 DB에 존재하지 않는 id를 입력하면 어떻게 될까요??

2. 준영속 엔티티가 된 이유가 id가 존재해서 라기 보다는 Book 객체의 생성시 영속성컨텍스트를 거치지 않고 생성자를 거쳤기 때문에 준영속 엔티티가 된건 아닌가요??

답변 2

4

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

안녕하세요. ijeee님

질문의 의도가 준영속 엔티티란 무엇인가? 라는 것으로 이해하고 답변드리겠습니다.

준영속 엔티티는 영속 상태로 관리되다가 이후 관리되지 않는 상태를 말합니다.

예를 들어서 엔티티 객체는 살아있는데, 영속성 컨텍스트가 종료되면서, 영속성 컨텍스트가 더는 이 엔티티 객체를 관리하지 못하는 상태인 것이지요. 이 경우 보통 엔티티 객체는 데이터베이스에 이미 저장이 되어 있습니다. 다만 객체가 영속성 컨텍스트의 관리를 전혀 받지 못하는 상태인 것이지요.

영속 상태가 되려면 식별자가 꼭 필요하기 때문에 모든 준영속 상태의 객체는 식별자를 가지고 있습니다.

여기서 Book을 수정하는 프로세스의 경우 Book은 이미 한번 영속성 컨텍스트에 저장이 되었고, 해당 데이터를 수정하기 위해 Form에 전달하고 다시 받았습니다. Book은 이미 영속 상태로 관리되고, 데이터베이스에 저장되었던 객체를 개발자가 form에 보내고, 그 값을 다시 받아서 직접 new로 Book 객체를 만들어내는데요. 그렇다고 할지라도, 이미 영속성 컨텍스트에 관리되던 객체를 그대로 만들어낸 것이기 때문에 준영속이라 할 수 있습니다.

결국 준영속의 기준은 과거에 해당 객체가 영속 상태로 데이터베이스에 저장되고 관리된 적이 있는가를 기준으로 삼으시면 됩니다.

개발자가 new Book()으로 직접 임의의 식별자를 지정하게 되는 것은, 단순히 new 상태(새로 생성한 객체)로 보면 됩니다.

감사합니다.

0

안녕하세요 ! 저도 준영속성 엔티티가 궁금해서 찾아보던중 이 질문글을 보았습니다.

아무리 답변을 봐도 기본편을 안보고 와서 그런지 헷갈리는데요 

/*
준영속성 엔티티
- 영속성 컨텍스트가 더이상 관리하지 않는 엔티티 (JPA가 더이상 관리 하지 않음 , JPA DB에 넘기면 더이상 관리안함)
- 데이터 베이스에 한번이라도 들어간적 있는 객체 ( 한번이라도 저장된적 있는객체 )
- 데이터 베이스에 식별가능한 값(pk) 을 가지고 있는 객체
- jpa가 식별할 수 있는 Id 값을 가지고 있는 객체 ( 이게 중요한듯 !!! )
- 임의로 만들어낸 엔티티도 기존에 식별자를 가지고 있으면 준영속 엔티티도 본다.
*/

제가 정리한건데 이게 맞는지 잘 모르겠습니다. 

"DB에 한번 이라도 저장된적이 있고 영속성 컨텍스트가 더이상 관리는 안한다" 에서 영속성 컨텍스트가 더 이상 관리 안하는 시점이 대체 언제인건가요 ?? 

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

안녕하세요. 원석나님 이 부분은 기본편을 학습하시면 이해가 되실거에요^^

감사합니다.

ijeee님의 프로필 이미지
ijeee

작성한 질문수

질문하기