티스토리 뷰

반응형

JPA의 플러시에 대해 알아보자.

이전 포스팅과 연결되므로 이전 포스팅을 참고하길 바란다. 

(이전 포스팅 글씨를 누르면 이동할 수 있다.)

 

🤔 플러시는 언제 발생할까?

데이터 베이스 트랜잭션이 일어나면 플러시는 자동으로 일어난다!

 

지난 포스팅에서

db에 쿼리는 commit할 때 날아간다고 했다.

 

그런데 만약 내가 comimit 하기 전에

db에 쿼리가 제대로 날아가는지 확인하고 싶다면 어떻게 해야할까?

 

바로 이렇게 하면 된다

flush

 

em.flush()를 하게 되면

db에 쿼리가 바로 날아간다.

 

그럼 확인해보자.

 

em.flush() cmd 화면

보이는가?

구분을 위해 그어둔

================선이

쿼리문 뒤에 나타났다.

 


플러시에 대해 정리해보자

 

플로시는

영속성 컨텍스트를 비우지 않고,

영속성 컨텍스트의 변경내용을 데이터베이스에 동기화한다.

트랜잭션이라는 작업 단위가 중요하다(커밋 직전에만 동기화 하면 된다.)

 

 


 

그럼 준영속은 뭘까?

영속 상태의 엔티티가 영속성 컨텍스트에서 분리되는 것을 말한다.

영속성 컨텍스트가 제공하는 기능을 사용하지 못한다.

 

 

준영속 상태로 만드는 방법은 크게 세 가지가 있다.

- em.detach(entity) : 특정 엔티티만 준영속 상태로 전환

- em.clear() : 영속성 컨텍스트를 완전히 초기화

 - em.close() : 영속성 컨텍스트를 종료

 

 

코드를 통해 확인해보자.

em.detach

 

위와 같이 150번 멤버의 이름은 "AAAAA"로 바꾸기 위해

코드를 작성하고 

em.detach(member);를 실행했다.

 

결과는 어떻게 나올까?

 

DB에서 150번 회원을 조회하고(select)

그 회원의 이름은 AAAAA로 변경(update)할까?

 

결과를 확인해보자.

update 결과

 

예상했던 것과 달리 select문만 실행되었다.

말그대로 detach

즉, 분리했기 때문에

영속성 컨텍스트에서 관리하지 않아서

DB에서 가져오는 150번 멤버를 가져오는

select 쿼리만 실행한다.

 

 

따라서

detach의 경우

해당하는 모든 내용이 영속성 컨텍스트에서 빠진다!

 

 

 

이렇게 영속 상태였다가 영속성 컨텍스트에서 빠지는 것

준영속 상태라고 한다!

 

 

반응형