Entity의 상태
- 비영속(Transient)
- new 연산자를 통해 인스턴스화 된 Entity 객체
- 아직 영속성 컨텍스트에 저장되지 않았기 때문에 JPA의 관리를 받지 않음
- JPA가 관리하지 못하기 때문에 해당 객체의 데이터를 변경해도 변경 감지가 이루어지지 않음
- 영속(Managed)
- persist(entity) : 비영속 Entity를 EntityManager를 통해 영속성 컨텍스트에 저장하여 관리되고 있는 상태로 만듦
em.persist(memo);
- 관리받은 상태(영속 상태)인 MANAGED상태가 됨.
- persist(entity) : 비영속 Entity를 EntityManager를 통해 영속성 컨텍스트에 저장하여 관리되고 있는 상태로 만듦
- 준영속(Detached)
- 영속성 컨텍스트에 저장되어 관리되다가 분리된 상태
- 영속상태 ➡️ 준영속 상태로 바꾸는 법 (3가지)
- detach(entity)
: 특정 Entity만 준영속 상태로 전환
em.detach(memo);
- 영속성 컨텍스트에서 관리(Managed)되다가 분리(Detached)된 상태로 전환
- 그래서 데이터를 수정해도 변경감지 기능을 사용할 수 없어 Update SQL이 수행되지 않음.
- clear()
: 영속성 컨텍스트를 완전히 초기화
em.clear();
- 영속성 컨텍스트의 모든 Entity를 준영속 상태로 전환
- 영속성 컨텍스트 틀은 유지하고 내용만 비워 새로 만든 것과 같은 상태가 됨.
- 틀은 유지하고 있기 때문에 계속해서 영속성 컨텍스트를 사용해 새로운 entity를 영속 상태로 만들거나 기존의 entity를 다시 영속 상태로 만드는 것이 가능.
- close()
: 영속성 컨텍스트를 종료
em.close();
- 해당 영속성 컨텍스트가 관리하던 영속성 상태의 Entity들은 모두 준영속 상태로 변경
- 영속성 컨텍스트가 종료되었기 때문에 계속해서 영속성 컨텍스트를 사용할 수 없음.
- detach(entity)
- 준영속 상태 ➡️ 영속상태로 바꾸는 법
- merge(entity)
: 전달받은 Entity를 사용해 새로운 영속 상태의 Entity를 반환. (때에 따라 수정하거나 저장함)
em.merge(memo);
- merge(entity) 동작
- 파라미터로 전달된 Entity의 식별자 값으로 영속성 컨텍스트를 조회
- 해당 Entity가 영속성 컨텍스트에 없다면?
- ) DB에서 새롭게 조회
- ) 조회한 Entity를 영속성 컨텍스트에 저장
- ) 전달받은 Entity의 값을 사용해 병합
- ) Update SQL이 수행됨 (수정)
- 만약 DB에서도 없다면?
- ) 새롭게 생성한 Entity를 영속성 컨텍스트에 저장
- ) Insert SQL이 수행됨 (저장)
- 해당 Entity가 영속성 컨텍스트에 없다면?
- merge(entity) 메서드는 비영속, 준영속 모두 파라미터로 받을 수 있으며 상황에 따라 '저장', '수정' 가능
- 파라미터로 전달된 Entity의 식별자 값으로 영속성 컨텍스트를 조회
- merge(entity) 동작
- merge(entity)
- 삭제(Removed)
em.remove(memo);
- remove(entity)
: 삭제하기 위해 조회해온 영속 상태의 Entity를 파라미터로 전달받아 삭제 상태로 전환
- remove(entity)
'내일배움캠프(Sparta) > Spring' 카테고리의 다른 글
[Spring] Spring Data JPA / JPA Auditing / Query Methods (0) | 2023.11.07 |
---|---|
[Spring] SpringBoot의 JPA (0) | 2023.11.07 |
[Spring] Entity / Persistence Context / Transaction (0) | 2023.11.07 |
[Spring] ORM / JPA / Hibernate (0) | 2023.11.07 |
[Spring] IoC / DI / Bean (0) | 2023.11.07 |