준영속 : 영속상태였다가 분리된 상태
비영속 : 영속상태에서 엔티티를 제거한 상태
엔티티 변경이 일어난 후, flush()가 발생하면 일어나는일들
영속성 컨텍스트에 대해서 설명을 해볼게요
영속성컨텍스트는 "엔티티를 영구저장하는 환경"입니다
1. 엔티티란 무엇인가?
-> 영속성을 가진 개체
2. 영속성이란 무엇인가?( = 영구저장하는 환경이 무엇을 뜻하는가?) 에 대해서 알아야해요
-> 그 개체를 생성시킨 프로그램이 종료되어도 데이터가 보존되는 특성
디비에 저장을 시키면 해당 프로그램이 종료되어도 데이터는 보존되겠죠
영속성컨텍스트는 이렇게 데이터베이스와 애플리케이션 사이에서 객체를 보관하는 논리적인 개념이에요
다음으로 엔티티 매니저에 대해서 설명할게요
엔티티매니저는 영속화된 객체들에 대해 여러 디비작업을 제공해줍니다.
1. 영속화된 객체가 무엇인가?
-> 영속성컨텍스트 개념은 영속, 비영속, 준영속에 대한 개념이 있어요
영속: 영속성컨텍스트에 의해 관리받고 있는 상태
준영속: 영속성컨텍스트에 의해 관리받고 있는 상태였다가 detached당한 상태
비영속: 영속성컨텍스트에 들어간적없는상태
이때의 영속상태인 객체를 의미해요
2. 여러 디비작업은 무엇인가?
-> save, update 이런 작업들을 중간에 대신 해주는거예요
다음으로 영속성 컨텍스트가 어떤 작업들을 하는지 알아볼게요
영속성 컨텍스트는
1. 변경감지
2. 쓰기지연
3. 동일성보장
4. 1차캐시
같은 기능을 제공해줍니다
먼저 1차캐시,
영속성 컨텍스트 내부에는 엔티티를 잠시 보관할수있는 저장소가 있는데 이를 1차캐시라고해요
네트워크를 통해 데이터베이스에 접근하는 시간 비용은 애플리케이션 서버에서 내부 메모리에 접근하는 시간 비용보다 수만에서 수십만 배 이상 비싸요.
따라서 조회환 데이터를 메모리에 잠시저장해서 데이터베이스 접근 횟수를 줄이면 애플이케이션 성능을 획기적으로 개선할 수 있어요
3번,
동일한 영속성 컨텍스트에서 같은 id값으로 조회해온 엔티티는 항상 주솟값이 같아요
1번과 2번은 같이 설명할게요
jpa에서는 update와 같은 메서드가 없어요 영속화된 객체 들이 변경되면 변경감지를 해서 update쿼리를 만들어주거든요
그과정을 이해하면 1번과 2번이 좀 이해가 돼요
예를들어
member = new Member;
em.persist(member);//영속성컨텍스트에 의해 관리받기 때문에
member.setName("새이름");
member.setName("두번째이름");
이메서드가 끝나면 커밋이 됩니다
그런데 커밋이 되기전에 flush가 돼요
flush가 일어나면서 아래와 같은 일들이 일어나는데요
1. 엔티티를 처음 등록할때의 스냅샷과 비교해서 변경된부분이 있으면 update쿼리를 만들음
2. 만들어서 쓰기지연저장소에 넣어둠
id생성전략이 identity가 아니라면 2번째줄에서 영속성컨텍스트에 저장이 되면서 쓰기지연저장소에 쿼리가 쌓입니다
그리고 세네번째줄에서는 아무일이 일어나지 않다가
flush때 member의 원래이름과 비교하여 두번째이름으로 변경되었으니 이에 대한 update쿼리를 만들고 만들어서
쓰기 지연 저장소에 넣어둬요
출처
https://dev-troh.tistory.com/m/151
https://hckcksrl.medium.com/%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8-986464f8b1e8
https://velog.io/@devtel/JPA-%EC%98%81%EC%86%8D%EC%84%B1persistence%EC%9D%B4%EB%9E%80
https://velog.io/@seungho1216/JPA%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B81%EC%B0%A8-%EC%BA%90%EC%8B%9C