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

hello님의 프로필 이미지

작성한 질문수

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

영속성 컨텍스트 2

비영속과 준영속 질문 입니다! + persist 질문

21.07.22 00:04 작성

·

307

1

1. 안녕하세요 https://www.inflearn.com/questions/31193 의 답변 내용을 참고하여 질문 드립니다.

비영속과 준영속의 차이는 '식별자가 있고 없고' 뿐이다 라고 생각했는데 저기에 답변을 보면 @Id로 선언한 변수가 member.setId() 등을 통해 초기화가 되었다면 식별자가 있는 것이다 라고 이해했습니다. 그럼 비영속 상태이더라도 식별자를 가질 수 있다는 건데 결론적으로 비영속과 준영속의 차이는

비영속 : 한번도 영속상태가 되지 않음.

준영속 : 영속 상태였다가 비영속 상태가 됨

의 느낌으로 이해하는 것이 맞을까요?

2. 

이 코드를 실행했을때 insert와 update 2개 쿼리가 실행됩니다. 그러면 

1. persist 할때 쓰기지연 저장소에 create문과 영속성 컨텍스트 Entity와 스냅샷에 값 추가

2. setName 호출시 Entity 값이 변경됨

3. 트랜젝션이 커밋되어 flush가 일어나면 영속성 컨텍스트에서 더티체킹을 실행. 이때 member의 Entity와 스냅샷의 name 값이 다르니 update 쿼리를 쓰기지연 저장소에 추가

4. create와 update 문 실행

이게 맞을까요?? persist 설명하실때 그림은 스냅샷 컬럼이 없어서 질문드립니다!

답변 1

0

OMG님의 프로필 이미지

2021. 07. 22. 01:16

안녕하세요. hello님, 공식 서포터즈 OMG입니다.

비영속과 준영속의 차이는 처음에 말씀하셨던  '식별자가 있고 없고'  뿐이 아니라

영속성 컨텍스트에서 관리 되었던 적이 있냐 없냐 로 구분하시면 됩니다.

-

비영속

아래의 강의자료를 보시면 객체를 생성한 시점을 나타내므로 영속성 컨텍스트에서 관리된 적이 없습니다.

준영속(=detached상태)

비영속 상태의 객체를 persist를 호출함으로써 영속상태(=영속성 컨텍스트에 들어가 있는)로 만들었지만 detach()로 인해 영속성 컨텍스트에서 분리된 상태

모호하게 알고 있었던 점이 해결되셨으면 좋겠네요

감사합니다.

hello님의 프로필 이미지
hello
질문자

2021. 07. 22. 10:29

답변 감사합니다 1번질문에서 준영속과 비영속의 차이는 이해되었습니다! 그런데 "비영속상태도 식별자를 가질 수 있다!" 라는 것은 맞는건가요?

OMG님의 프로필 이미지

2021. 07. 22. 23:55

네 맞습니다.

두 가지만 알고 계시면 됩니다.

1. 기본키는 직접 할당해줄 수있고, 자동생성전략을 사용해서 할당 받을 수 있다.

전자는 @Id만 사용하는 것. 후자는 @Id @GeneretedValue를 사용하는 것입니다.

2. 비영속 객체가 영속 상태가 되려면 식별자를 반드시 갖고 있어야 한다.

직접 할당해주는 방법일 땐 할당이 되어있어야 하고, 자동생성전략을 이용하는 경우 persist() 호출 시점에 값의 할당이 이뤄집니다.(코드 레벨로 찾아가 보려 했는데 정확한 부분은 잘 모르겠습니다.)

그래서 결국 "비영속상태도 식별자를 가질 수 있다!" 의 답변 YES 입니다.

hello님의 프로필 이미지

작성한 질문수

질문하기