* 비영속
- 쉽게 말하자면 new 연산자를 통해 인스턴스화 된 Entity 객체를 의미
- 아직 영속성 컨텍스트에 저장되지 않았기 때문에 JPA의 관리를 받지 않음
- 비영속 상태는 JPA가 관리하지 못하기 때문에 해당 객체의 데이터를 변경해도 변경 감지가 이루어지지 않음
* 영속
persist(entity) : 비영속 Entity를 EntityManager를 통해 영속성 컨텍스트에 저장하여 관리되고 있는 상태로 만듦
비영속 상태는 JPA가 관리하지 못하기 때문에 해당 객체의 데이터를 변경해도 변경 감지가 이루어지지 않음
* 준영속
- 준영속 상태는 영속성 컨텍스트에 저장되어 관리되다가 분리된 상태를 의미
영속 상태에서 준영속 상태로 바꾸는 방법
- detach(entity) : 특정 Entity만 준영속 상태로 전환합니다.
- 영속성 컨텍스트에서 관리되다(Managed)가 분리된 상태(Detached)로 전환
- 준영속 상태로 전환되면 1차 캐시 즉, 캐시 저장소에서 제거되기 때문에 JPA의 관리를 받지 못해 영속성 컨텍스트의 어떠한 기능도 사용할 수 없음
em.contains(memo); 는 해당 객체가 영속성 컨텍스트에 저장되어 관리되는 상태인지 확인하는 메서드로 em.detach(memo); 이후 확인했을 때 false가 출력된 것을 확인할 수 있었음
- clear() : 영속성 컨텍스트를 완전히 초기화.
- 영속성 컨텍스트의 모든 Entity를 준영속 상태로 전환
- 영속성 컨텍스트 틀은 유지하지만 내용은 비워 새로 만든 것과 같은 상태가 됨
- 따라서 계속해서 영속성 컨텍스트를 이용할 수 있음
- close() : 영속성 컨텍스트를 종료.
- 해당 영속성 컨텍스트가 관리하던 영속성 상태의 Entity들은 모두 준영속 상태로 변경
- 영속성 컨텍스트가 종료되었기 때문에 계속해서 영속성 컨텍스트를 사용할 수 없음
- em.close(); 메서드 호출 이후 EntityManager를 사용하려고 하자 오류가 발생
- 영속성 컨텍스트가 종료되면 계속해서 영속성 컨텍스트를 사용할 수 없다는 것을 확인할 수 있음
준영속 상태에서 영속 상태로 바꾸는 방법
- merge(entity) : 전달받은 Entity를 사용하여 새로운 영속 상태의 Entity를 반환.
- merge(entity) 동작
- 파라미터로 전달된 Entity의 식별자 값으로 영속성 컨텍스트를 조회.
- 해당 Entity가 영속성 컨텍스트에 없다면?
- DB에서 새롭게 조회합니다.
- 조회한 Entity를 영속성 컨텍스트에 저장합니다.
- 전달 받은 Entity의 값을 사용하여 병합합니다.
- Update SQL이 수행됩니다. (수정)
- 만약 DB에서도 없다면 ?
- 새롭게 생성한 Entity를 영속성 컨텍스트에 저장합니다.
- Insert SQL이 수행됩니다. (저장)
- 해당 Entity가 영속성 컨텍스트에 없다면?
- 파라미터로 전달된 Entity의 식별자 값으로 영속성 컨텍스트를 조회.
- 따라서 merge(entity) 메서드는 비영속, 준영속 모두 파라미터로 받을 수 있으며 상황에 따라 ‘저장’을 할 수도 ‘수정’을 할 수도 있음.
* 삭제
remove(entity) : 삭제하기 위해 조회해온 영속 상태의 Entity를 파라미터로 전달받아 삭제 상태로 전환
'컴퓨터 프로그래밍 > Spring' 카테고리의 다른 글
[Spring] Bean 수동 등록, 같은 타입의 Bean 이 2개일 때 해결 (0) | 2024.08.22 |
---|---|
[Spring] JPA Auditing, Timestamped, Query Methods (0) | 2024.08.21 |
[Spring] 영속성 컨텍스트의 기능 (0) | 2024.08.21 |
[Spring] 영속성 컨텍스트, 트랜잭션 (0) | 2024.08.20 |
[Spring] Spring, Spring MVC, Spring 3 Layer (0) | 2024.08.19 |